[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=Java\n*.css linguist-language=Java\n*.html linguist-language=Java\n"
  },
  {
    "path": ".gitignore",
    "content": "## .gitignore for Grails 1.2 and 1.3\n\n# .gitignore for maven \ntarget/\n*.releaseBackup\n\n# web application files\n#/web-app/WEB-INF\n\n# IDE support files\n/.classpath\n/.launch\n/.project\n/.settings\n/*.launch\n/*.tmproj\n/ivy*\n/eclipse\n\n# default HSQL database files for production mode\n/prodDb.*\n\n# general HSQL database files\n*Db.properties\n*Db.script\n\n# logs\n/stacktrace.log\n/test/reports\n/logs\n*.log\n*.log.*\n\n# project release file\n/*.war\n\n# plugin release file\n/*.zip\n/*.zip.sha1\n \n# older plugin install locations\n/plugins\n/web-app/plugins\n/web-app/WEB-INF/classes\n \n# \"temporary\" build files\ntarget/\nout/\nbuild/\n \n# other\n*.iws\n \n#.gitignore for java\n*.class\n \n# Package Files #\n*.jar\n*.war\n*.ear\n \n## .gitignore for eclipse\n \n*.pydevproject\n.project\n.metadata\nbin/**\ntmp/**\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n \n# External tool builders\n.externalToolBuilders/\n \n# Locally stored \"Eclipse launch configurations\"\n*.launch\n \n# CDT-specific\n.cproject\n \n# PDT-specific\n.buildpath\n \n## .gitignore for intellij\n \n*.iml\n*.ipr\n*.iws\n.idea/\n \n## .gitignore for linux\n.*\n!.gitignore\n!.gitattributes\n!.editorconfig\n!.eslintrc\n!.travis.yml\n*~\n \n## .gitignore for windows\n \n# Windows image file caches\nThumbs.db\nehthumbs.db\n \n# Folder config file\nDesktop.ini\n \n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n \n## .gitignore for mac os x\n \n.DS_Store\n.AppleDouble\n.LSOverride\nIcon\n \n \n# Thumbnails\n._*\n \n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n## hack for graddle wrapper\n!wrapper/*.jar\n!**/wrapper/*.jar\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at 84226733@qq.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2021 Linlin xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# spring-cloud-demo\n## 不定期更新与记录在springcloud开发中所遇到的坑以及解决方法\n## 说明：由于版本不兼容，很多核心、重点的技术难题都以单独的项目形式提交，并同时更新到csdn，如有需要请关注：https://blog.csdn.net/xiaoll880214?type=blog\n\n初始化添加\n1. spring-cloud skywalking demo\n2. add mqtt suports\n3. add 微信小程序 suports mqtt\n4. kafka elk支持\n\n\n20180809\n1. 更新 代码结构\n2. 新增git配置中心\n3. 新增kafka elk demo配置以及文档\n4. 文档结构整理\n5. 分离注册中心和配置中心\n7. 添加zipkin服务跟踪\n\n\n20180905\n1. 自定义注解实现aop日志\n2. 自定义注解实现实体类参数校验\n3. 添加mybatis自定生成映射实体类、mapper等\n4. 添加全局异常处理\n5. 添加fegin自定义数据解析\n\n20180907\n1. 添加注解，作为参数校验入口\n\n20180910\n1. 解决服务之间调用fegin+hystrix 熔断异常拦截处理\n\n20180914\n1. 服务调用之间的rest请求，参数为对象时需要添加@RequestBody注解\n``eg:\nsaveRegionCity(@RequestBody RegionCityDto regionCityDto)``\n2. 服务间调用接口的返回值，不能使接口返回，必须要使用实现类返回，fegin客户端获取不到数据返回Null\n`eg:\n public User getUser(@RequestBody UserQuery query); \n User必须为实现类，不能为接口`\n3. 添加fastjson解析，解决部分调用对象内包含对象传值为空问题\n\n20180921\n1. Doc 目录结构调整\n2. 记录[elk+kafka+logback服务之间调用多1分钟时间之坑](https://github.com/Xlinlin/spring-cloud-demo/blob/master/SpringCloud-Demo-Doc/kafka%2Belk/使用logback-kafka导致服务之间调用多1分钟之坑.md)\n\n20180927\n1. [elk+logstash+logback解析嵌套json数据](https://github.com/Xlinlin/spring-cloud-demo/blob/master/SpringCloud-Demo-Doc/kafka%2Belk/ELK%E6%97%A5%E5%BF%97logstash%E8%A7%A3%E6%9E%90JSON%E5%B5%8C%E5%A5%97.md)\n\n20180930\n1. 添加guava+spring-cache本地缓存实现，[参考入口](https://blog.csdn.net/mafei6827/article/details/80868931)\n2. 记录springcloud 1.x版本解决feignclient下requestmapping与springmvc的定义冲突问题，[参考入口](http://blog.didispace.com/spring-cloud-feignclient-problem/?utm_source=tuicool&utm_medium=referral)\n\n20181009\n1. 添加ES实现电商[搜索基础服务](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-SearchService)\n2. 添加Mockito实现api的junit测试\n\n20181012\n1. redisson yml配置加载，支持单机、集群、云托管、sentinel模式<br>\n2. 配置文件中添加配置文件即可开启redisson的配置：<br>\n`` redisson.fileName: redission-cluster(自定义)``\n3. 提供缓存基本服务和分布式服务: <br>\n``> CacheService 提供缓存基础服务`` <br>\n``> DistributedService 提供分布式**可重入公平/非公平锁**、**读写锁**、**闭锁**``<br>\n[代码实现参考](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache)<br>\n[junit测试参考](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/cache)<br>\n\n20181016\n1. redis缓存 redisson客户端添加批处理\n\n20181018\n1. [spring-cache+guava 添加本地缓存](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache)\n\n20181022\n1. 升级Springboot2.0  详情参考springboot2.0分之\n2. 调整common包，可打成jar包\n3. 添加启动shell脚本，参考common包script目录下.sh文件\n\n20181027\n1. bootstrap.sh 脚本参数简化\n\n20181029\n1. 优化bootstrap.sh脚本\n2. 添加jenkins构建后自动部署脚本\n3. 添加jenkins构建后远程自动部署脚本\n[详情](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Common/script)\n\n20181114\n1. Sharding-sphere尝试\n\n20181115\n1. bootstrap.sh 脚本添加jvm参数配置，以及停止时旧日志文件的备份\n2. 本地和远程自动部署时，不进行原服务包的删除，按时间戳进行备份原来的可执行包\n\n20181127\n1. springcloud-config 自定义mysql实现，[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter)\n\n\n20181210\n1. 工程结果整理\n2. 添加springboot+quartz自定义实现 任务调度\n\n20190119\n1. 新增Redisson集成springdata，使用RedisTemplate,[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Redisson)\n\n20190124\n1. 新增RedisTemplate 使用pipeline批量操作redis数据\n2. 添加常用工具类 AES加解密、MD5等\n\n20190126\n1. 改造zipkin链路跟踪实现：SpringCloud Sleuth Stream Zipkin Kafka Elasticsearch 实现简单链路跟踪。<br>\n[参考](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-ZipkinServer/README.md)\n\n20190131\n1. 自定义配置中心重构，[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter)\n2. 新增多条件搜索测试，[详情](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/SearchManagerTest.java)<br>\n3. 更多多条件搜索的[参考资料](http://www.scienjus.com/elasticsearch-function-score-query/)\n\n20190201\n1. 新增[Docker + SpringBoot + Maven 构建发布到远程仓库 DEMO](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Docker)\n\n20190320\n1. 新增 ES 权重查询 以及 聚合逻辑，[详情参考](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/service/SearchServiceEsImpl.java)\n2. 新增阿里开源数据同步工具[Canal](https://github.com/alibaba/canal)的简单[Demo使用](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Canal)\n\n20190327\n1. 将Canal+Disruptor整合到springboot中，提供一套完整的Canal异步框架，在DisruptorServiceImpl服务中实现自己的业务逻辑即可，[更多详见](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Canal)\n\n20190402\n1. 自定义配置中心，引入Netty监测心跳[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter)\n\n20190405\n1. netty实现配置刷新[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter)\n\n20190411\n1. 添加maven+jenkins+docker+springboot 构建打包发布部署的jenkins shell脚本\n\n20190402\n1. 修复linux系统，客户端异常断开，服务端无感知问题，即在linux上使用kill或ctrl+c 中断服务，无法进入exceptionCaught方法导致无法感知应用下线问题。<br>\n更换为channelInactive方法来感知和下线客户端(netty)\n\n20190504\n1. [新增mqtt通过nginx代理配置](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-MQTT)\n\n20190515\n1. 新增spring session+ spring security +  jwt简单鉴权，[参考入口](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter/custom-config-web)\n\n20190611\n1. 记录 fork join demo[详情](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/forkjoin)\n\n20190621\n1. Disruptor+spring event封装[详情以及使用说明](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor)\n\n20190624\n1. [入手Zookeeper](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Zookeeper)\n\n20190702\n1. 新增Canal启动 [ServerRunningMonitor部分源码注解记录](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Canal/doc/ServerRunningMonitor%E6%BA%90%E7%A0%81%E6%B3%A8%E8%A7%A3.md)，\n2. 修复定时任务重新启动时加载启动状态且已过期的任务报错问题：[新增在添加任务是校验表达的合法性](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/util/CronExpUtil.java)\n\n20190720\n1. Springboot-Admin 2.0服务端+Springboot-Admin 1.5.6客户端[集成使用](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Admin)，掌控你的微服务。\n\n20190801\n1. [SpringBoot + SpringCloud + Feign + Sentinel 集成实现接口限流监控](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Sentinel)\n\n20190813\n1. [SpringCloud + Feign + Hystrix 熔断、线程池的一些坑记录](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Hystrix-Demo)\n\n20190909 \n1. [定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Custom-Elasticsearch-Starter)\n\n20190910\n1. [启动脚本添加GC参数和skywalking探针](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Common/script/bootstrap.sh)\n\n20190929\n1. 新增图片比较工具类，比较两张图片是否相同：[DHashUtil](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/image/ImageDHashUtil.java)&[PHashUtil](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/image/ImagePHashUtil.java)\n\n20191019\n1. redisson分布式锁库存使用，下单、取消单、出库单之jmeter ifelse程序并发测试--**预告**\n\n20191022\n1. [Springboot官方文档-配置新-Tomcat优化](https://docs.spring.io/spring-boot/docs/2.2.1.BUILD-SNAPSHOT/reference/html/appendix-application-properties.html#server-properties)\n\n20191023\n1. [Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Stock-Demo)\n\n20191105\n1. Api对外接口统一返回值，如：{\"code\":200,\"erroMsg\":\"\",data:{}}，[参考实现](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/advice/UnifiedReturnAdvice.java)\n\n20191119\n1. Springboot 的Rest请求返回的Response中的HTTP响应行只有：HTTP/1.1 200 {OK},无OK返回导致老的http客户端无法识别，是因为springboot 1.4以上版本将tomcat升级到了8.5.x以后的版本，如果需要支持，需要设置tomcat的版本低于8.5的版本，设置：\n    ```$xslt\n    <properties>\n      <tomcat.version>8.0.29</tomcat.version>\n    </properties> \n    ```\n    [参考资料1](http://www.mamicode.com/info-detail-2280850.html);<br>\n    [参考资料2](https://stackoverflow.com/questions/49610522/spring-boot-return-http-1-1-200-not-http-1-1-200-ok);\n    \n20191125\n1. [Gitlab+P3C-PMD(ali)标准化你团队的代码.doc](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/Gitlab%2BP3C-PMD(Aliyun)%E6%A0%87%E5%87%86%E5%8C%96%E4%BD%A0%E5%9B%A2%E9%98%9F%E7%9A%84%E4%BB%A3%E7%A0%81.docx)\n\n20191206\n1. [SpringCloud RestTemplate 封装stater](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-RestTemplate-Stater)支持使用http连接池、okhttp等\n\n20191208\n1. [Linux之netstat命令](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/linux/Linux-netstat%E5%91%BD%E4%BB%A4.md)-服务自动化发布时以此结果为依据停止服务\n\n20191213\n1. [RxJava Hello World](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/rxjava/RxJavaHelloWorld.MD)，要入手一定要敲代码，敲起来!\n\n20200104\n1. Shell脚本+jstat+curl+crontab 监控JVM发短信[脚本](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/monitor-jstat.sh)\n\n20200111\n1. [基于Springboot1.5.9+SpringCloud+Zipkin+ELK链路跟踪实现](https://github.com/Xlinlin/spingcloud-zipkin-elk-demo)\n\n20200114\n1. String字符GBK和UTF编码格式长度判断以及截取\n\n20200115\n1. 经常用到对list进行分页批处理，写了[工具类](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/ListPageUtil.java)一劳永逸\n\n20200117\n1. 封装RestTemplate,支持okhttp,httpool,支持同步和异步请求,[ReadMe.MD](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Custom-Rest-Starter)\n\n20200224\n1. Springboot web应用签名包括工具类,[传送链接](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign)\n\n20200229\n1. K8S Cluster[安装文档](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/k8s/K8S%20Linux%20%20Centos%207%E5%AE%89%E8%A3%85.docx)\n\n20200422\n1. Sonarqube+Gitlab-CICD构建[代码质量管理平台](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90)\n\n20200426\n1. 完善代码质量[监控体系](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E7%9B%91%E6%8E%A7%E4%BD%93%E7%B3%BB%E6%96%B9%E6%A1%88.pptx)\n\n20200508\n1. SpringCloud Gateway + nacos实现灰度， + ribbon实现全链路版本请求，[详情](https://github.com/Xlinlin/SpringCloud-Gateway-Canary)\n\n20200527\n1. [添加docker-build脚本，执行脚本构建镜像并推送到私服仓库](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Docker/docker-build.sh)\n\n20200528\n1. swagger2 创建[api文档](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/swagger%E7%94%9F%E6%88%90html%E6%96%87%E4%BB%B6.pdf)整理\n2. [docker-swarm集群监控文档](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Demo-Doc/docker)整理\n\n20200529\n1. 补充swarm集群部署springcloud项目，[详细文档](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/docker/docker-swarm-springcloud.md)\n\n20200814\n1. 新gitlab使用代码规则校验说明，[详情参考](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/gitlab-hooks/pre-receive)\n\n20201002\n1. 说明：本仓库的代码以springboot 1.0版本，工作中已使用2.0以上版本，很多新的分享会单独创建git项目\n2. 基于nacos或eureka实现 服务级别的灰度，支持网关、feign自由插件[详情参考](https://github.com/Xlinlin/canary)\n\n20211012\n1. [Springboot Admin(SBA) + Nacos + Arthas 搭建你的在线性能分析和问题定位工具-服务端改造篇](https://blog.csdn.net/xiaoll880214/article/details/120191476?spm=1001.2014.3001.5501)\n2. [Springboot Admin(SBA) + Nacos + Arthas 搭建你的在线性能分析和问题定位工具-客户端改造篇](https://blog.csdn.net/xiaoll880214/article/details/120295070?spm=1001.2014.3001.5501)\n"
  },
  {
    "path": "SpringBoot-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>SpringCloud-Demo</artifactId>-->\n    <!--<groupId>com.xiao.skywalking.demo</groupId>-->\n    <!--<version>0.0.1-SNAPSHOT</version>-->\n    <!--</parent>-->\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.1.0.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <description>Springboot-Admin 2.0版本和SpringBoot 1.5.X版本结合使用</description>\n\n    <artifactId>SpringBoot-Admin</artifactId>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n        <spring-boot-admin.version>2.1.0</spring-boot-admin.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-server</artifactId>\n            <version>${spring-boot-admin.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-server-ui</artifactId>\n            <version>${spring-boot-admin.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.jolokia</groupId>\n            <artifactId>jolokia-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <!-- 安全认证 -->\n        <!--<dependency>-->\n        <!--<groupId>org.springframework.boot</groupId>-->\n        <!--<artifactId>spring-boot-starter-security</artifactId>-->\n        <!--</dependency>-->\n\n        <!-- 邮件通知 -->\n        <!--<dependency>-->\n        <!--<groupId>org.springframework.boot</groupId>-->\n        <!--<artifactId>spring-boot-starter-mail</artifactId>-->\n        <!--</dependency>-->\n    </dependencies>\n\n\n    <build>\n        <finalName>SpringBoot-Admin</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>build-info</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringBoot-Admin/readme.md",
    "content": "\nSpringboot-Admin 2.0服务端+Springboot-Admin 1.5.6客户端集成使用监控服务<br>\n原参考的[github地址](https://github.com/p555iii/spring-boot-admin1.5to2.0)<br>\n服务端配置参考[地址](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Admin)<br>\n客户端配置参考[地址](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Provider)<br>"
  },
  {
    "path": "SpringBoot-Admin/src/main/java/com/xiao/spring/boot/admin/SpringBootAdminApplication.java",
    "content": "package com.xiao.spring.boot.admin;\n\nimport de.codecentric.boot.admin.server.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * [简要描述]: springboot-admin 集成eureka 监控服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/7/30 09:47\n * @since JDK 1.8\n */\n@Configuration\n@SpringBootApplication\n@EnableAdminServer\npublic class SpringBootAdminApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(SpringBootAdminApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Admin/src/main/resources/application.yml",
    "content": "info:\n  groupId: @project.groupId@\n  artifactId: @project.artifactId@\n  version: @project.version@\n###################\n# 邮件通知配置\n##################\n#spring:\n  #mail:\n    #host: smtphm.qiye.163.com\n    #username: # 用户名\n    #password: # 密码\n  #boot:\n    #admin:\n      #notify:\n        #mail:\n        #from: # 发件人\n        #to: # 收件人\n        #enabled: true"
  },
  {
    "path": "SpringBoot-Admin/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8080\nspring:\n  application:\n    name: omni-service-admin\n  security:\n    user:\n      name: \"admin\"\n      password: \"admin@123\"\n\n#eureka:\n  #client:\n    #fetch-registry: true\n    #service-url:\n      #defaultZone: http://192.168.206.201:8888/eureka\n    #register-with-eureka: true\n    #registry-fetch-interval-seconds: 30\n  #instance:\n    #hostname: localhost\n    #prefer-ip-address: true\n    #lease-renewal-interval-in-seconds: 10\n    #lease-expiration-duration-in-seconds: 30\n    #health-check-url-path: /actuator/health\n    #metadata-map:\n      #user.name: ${spring.security.user.name}\n      #user.password: ${spring.security.user.password}\n#info:\n  #name: @project.name@\n  #groupId: @project.groupId@\n  #artifactId: @project.artifactId@\n  #version: @project.version@\n#management:\n  #endpoints:\n    #web:\n      #exposure:\n        #include: \"*\"\n      #base-path: /\n  #endpoint:\n    #health:\n      #show-details: ALWAYS"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter/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>SpringBoot-Custom-Elasticsearch-Starter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>Custom-Elasticsearch-Starter</artifactId>\n    <name>Custom ElasticSearch High Level Rest Client Stater AutoConfigure</name>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>Custom-Elasticsearch-Starter-Autoconfig</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Autoconfig/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>SpringBoot-Custom-Elasticsearch-Starter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>Custom-Elasticsearch-Starter-Autoconfig</artifactId>\n    <name>Custom ElasticSearch High Level Rest Client Stater AutoConfigure</name>\n\n    <properties>\n        <elasticsearch.version>6.8.17</elasticsearch.version>\n    </properties>\n\n    <dependencies>\n        <!-- springboot 依赖 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n        </dependency>\n\n        <!-- 将被@ConfigurationProperties注解的类的属性注入到元数据 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch</groupId>\n            <artifactId>elasticsearch</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch.client</groupId>\n            <artifactId>elasticsearch-rest-client</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch.client</groupId>\n            <artifactId>elasticsearch-rest-high-level-client</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Autoconfig/src/main/java/com/xiao/custom/elasticsearch/start/autoconfig/ElasticsearchAutoConfiguration.java",
    "content": "package com.xiao.custom.elasticsearch.start.autoconfig;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.elasticsearch.start.autoconfig.properties.ElasticsearchProperties;\nimport com.xiao.custom.elasticsearch.start.autoconfig.properties.HostInfo;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.http.HttpHost;\nimport org.apache.http.auth.AuthScope;\nimport org.apache.http.auth.UsernamePasswordCredentials;\nimport org.apache.http.client.CredentialsProvider;\nimport org.apache.http.impl.client.BasicCredentialsProvider;\nimport org.elasticsearch.client.RestClient;\nimport org.elasticsearch.client.RestClientBuilder;\nimport org.elasticsearch.client.RestHighLevelClient;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 自动装配\n * [详细描述]: <p>\n * EnableAutoConfiguration 利用SpringFactoriesLoader机制加载所有的AutoConfiguration类 META-INF/spring.factories\n *\n * @author llxiao\n * @version 1.0, 2019/8/28 10:28\n * @since JDK 1.8\n */\n@Configuration\n@EnableConfigurationProperties(ElasticsearchProperties.class)\n@Slf4j\npublic class ElasticsearchAutoConfiguration implements DisposableBean\n{\n    private RestHighLevelClient restHighLevelClient;\n\n    @Bean\n    @ConditionalOnMissingBean\n    public RestHighLevelClient restHighLevelClient(ElasticsearchProperties elasticsearchProperties)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"初始化Elasticsearch Rest High Level Client....\");\n        }\n        List<HostInfo> hosts = elasticsearchProperties.getHosts();\n        if (CollectionUtils.isEmpty(hosts))\n        {\n            throw new RuntimeException(\"Elasticsearch host配置为空，请检查：spring.elasticsearch.rest.hosts的配置是否正确\");\n        }\n\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"Elasticsearch host: {}\", JSONObject.toJSONString(hosts));\n        }\n\n        HttpHost[] httpHosts = new HttpHost[hosts.size()];\n        int i = 0;\n        for (HostInfo host : hosts)\n        {\n            httpHosts[i++] = new HttpHost(host.getHostname(), host.getPort(), host.getSchema());\n        }\n\n        RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);\n        restClientBuilder.setMaxRetryTimeoutMillis(elasticsearchProperties.getMaxRetryTimeout());\n\n        // 请求参数设置\n        restClientBuilder.setRequestConfigCallback(requestConfigBuilder ->\n        {\n            requestConfigBuilder.setConnectTimeout(elasticsearchProperties.getConnectTimeout());\n            requestConfigBuilder.setSocketTimeout(elasticsearchProperties.getSocketTimeout());\n            requestConfigBuilder.setConnectionRequestTimeout(elasticsearchProperties.getRequestTimeout());\n            return requestConfigBuilder;\n        });\n\n        //异步 httpclient 连接参数配置\n        restClientBuilder.setHttpClientConfigCallback(httpClientBuilder ->\n        {\n            httpClientBuilder.setMaxConnTotal(elasticsearchProperties.getMaxConnect());\n            httpClientBuilder.setMaxConnPerRoute(elasticsearchProperties.getMaxConnectRoute());\n\n            //                httpClientBuilder.setThreadFactory();\n            // SSL 配置\n            //                httpClientBuilder.setSSLContext()\n\n            // 请求队列头部拦截 ，request response HttpResponseInterceptor HttpRequestInterceptor\n            //            httpClientBuilder.addInterceptorFirst();\n            // 请求队列尾部拦截 ，request response\n            //            httpClientBuilder.addInterceptorLast();\n\n            // 鉴权设置\n            if (StringUtils.isNotBlank(elasticsearchProperties.getUsername()) && StringUtils\n                    .isNotBlank(elasticsearchProperties.getPassword()))\n            {\n                CredentialsProvider credentialsProvider = new BasicCredentialsProvider();\n                credentialsProvider\n                        .setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticsearchProperties\n                                .getUsername(), elasticsearchProperties.getPassword()));\n                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);\n            }\n\n            return httpClientBuilder;\n        });\n\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"初始化Elasticsearch Rest High Level Client 成功!\");\n        }\n        restHighLevelClient = new RestHighLevelClient(restClientBuilder);\n        return restHighLevelClient;\n    }\n\n    /**\n     * Invoked by a BeanFactory on destruction of a singleton.\n     *\n     * @exception Exception in case of shutdown errors.\n     * Exceptions will get logged but not rethrown to allow\n     * other beans to release their resources too.\n     */\n    @Override\n    public void destroy() throws Exception\n    {\n        restHighLevelClient.close();\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Autoconfig/src/main/java/com/xiao/custom/elasticsearch/start/autoconfig/properties/ElasticsearchProperties.java",
    "content": "package com.xiao.custom.elasticsearch.start.autoconfig.properties;\n\nimport lombok.Data;\nimport org.elasticsearch.client.RestClientBuilder;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.context.properties.NestedConfigurationProperty;\n\nimport java.util.List;\n\n/**\n * [简要描述]: Elasticsearch 配置类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/28 10:18\n * @since JDK 1.8\n */\n@Data\n@ConfigurationProperties(prefix = ElasticsearchProperties.ELASTIC_SEARCH_PREFIX)\npublic class ElasticsearchProperties\n{\n    public static final String ELASTIC_SEARCH_PREFIX = \"spring.elasticsearch.rest\";\n\n    /**\n     * 集群名称\n     */\n    private String clusterName;\n\n    /**\n     * 节点信息\n     */\n    @NestedConfigurationProperty\n    private List<HostInfo> hosts;\n\n    /**\n     * 鉴权使用\n     */\n    private String username;\n    private String password;\n\n    /**\n     * 高亮前缀\n     */\n    private String highlightPre = \"\";\n    /**\n     * 高亮后缀\n     */\n    private String highlightPost = \"\";\n\n    /**\n     * 连接超时时间\n     */\n    private int connectTimeout = RestClientBuilder.DEFAULT_CONNECT_TIMEOUT_MILLIS;\n\n    /**\n     * socket超时时间\n     */\n    private int socketTimeout = RestClientBuilder.DEFAULT_SOCKET_TIMEOUT_MILLIS;\n\n    /**\n     * 请求超时时间\n     */\n    private int requestTimeout = RestClientBuilder.DEFAULT_CONNECT_TIMEOUT_MILLIS;\n\n    /**\n     * 最大连接数\n     */\n    private int maxConnect = RestClientBuilder.DEFAULT_MAX_CONN_TOTAL;\n    /**\n     * 单主机并发最大数\n     */\n    private int maxConnectRoute = RestClientBuilder.DEFAULT_MAX_CONN_PER_ROUTE;\n\n    /**\n     * 重试最大超时时间\n     */\n    private int maxRetryTimeout = RestClientBuilder.DEFAULT_MAX_RETRY_TIMEOUT_MILLIS;\n\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Autoconfig/src/main/java/com/xiao/custom/elasticsearch/start/autoconfig/properties/HostInfo.java",
    "content": "package com.xiao.custom.elasticsearch.start.autoconfig.properties;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/28 10:22\n * @since JDK 1.8\n */\n@Data\npublic class HostInfo\n{\n    private String hostname;\n    private int port;\n    private String schema;\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Autoconfig/src/main/resources/META-INF/spring.factories",
    "content": "org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.xiao.custom.elasticsearch.start.autoconfig.ElasticsearchAutoConfiguration"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/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>SpringBoot-Custom-Elasticsearch-Starter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>Custom-Elasticsearch-Starter-Example</artifactId>\n    <name>Custom ElasticSearch High Level Rest Client Stater Example</name>\n\n    <properties>\n        <elasticsearch.version>6.3.2</elasticsearch.version>\n        <log4j2.version>2.17.1</log4j2.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.logging.log4j</groupId>\n            <artifactId>log4j-api</artifactId>\n            <version>${log4j2.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.logging.log4j</groupId>\n            <artifactId>log4j-core</artifactId>\n            <version>${log4j2.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>Custom-Elasticsearch-Starter</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <finalName>${project.artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/main/java/com/xiao/custom/elasticsearch/starter/example/ElasticsearchApplication.java",
    "content": "package com.xiao.custom.elasticsearch.starter.example;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/28 13:54\n * @since JDK 1.8\n */\n@SpringBootApplication\npublic class ElasticsearchApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ElasticsearchApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/main/resources/application.properties",
    "content": "#spring.elasticsearch.rest.clusterName=omni-dev-es\n#spring.elasticsearch.rest.hosts[0].hostname=192.168.206.210\n#spring.elasticsearch.rest.hosts[0].port=9200\n#spring.elasticsearch.rest.hosts[0].schema=http\n#spring.elasticsearch.rest.connectTimeout=1000\n#spring.elasticsearch.rest.socketTimeout=30000\n#spring.elasticsearch.rest.requestTimeout=500\n#spring.elasticsearch.rest.maxConnect=30\n#spring.elasticsearch.rest.maxConnectRoute=10\n#spring.elasticsearch.rest.maxRetryTimeout=30000\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/main/resources/application.yml",
    "content": "spring:\n  elasticsearch:\n    rest:\n      clusterName: omni-dev-es\n      hosts:\n        -\n          hostname: 192.168.206.210\n          port: 9200\n          schema: http\n        #-\n          #hostname: 192.168.206.212\n          #port: 9200\n          #schema: http\n      #username: you username\n      #password: you passwd\n      # 连接超时时间,单位ms,默认1S\n      connectTimeout: 1000\n      # socket超时时间,单位ms,默认30S\n      socketTimeout: 30000\n      # 请求超时时间,单位ms,默认500ms\n      requestTimeout: 500\n      # 单机最大连接数,默认30个\n      maxConnect: 30\n      # 单机最大并发数,默认10个\n      maxConnectRoute: 10\n      # 最大重试时间,默认30S\n      maxRetryTimeout: 30000\n      # 高亮前缀\n      #highlightPre: <span style=\\\"color:red\\\">\n      # 高亮后缀\n      #highlightPost: </span>\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/main/resources/bootstrap.yml",
    "content": ""
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n\n    <!-- 控制台Appender -->\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"ERROR\"/>\n    <logger name=\"org.apache.zookeeper\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <!-- 启动的时候一些日志屏蔽 -->\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.jmx.export.annotation.AnnotationMBeanExporter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.mvc\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.web.servlet.FilterRegistrationBean\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.config.sources.URLConfigurationSource\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.ui.freemarker.SpringTemplateLoader\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.context.annotation.AnnotationConfigApplicationContext\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.support.DefaultListableBeanFactory\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter\" level=\"ERROR\"/>\n\n    <logger name=\"com.purcotton.omni.elasticsearch.starter.example\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n\n</configuration>"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/test/java/com/xiao/custom/elasticsearch/starter/example/ElasticsearchApplicationTest.java",
    "content": "package com.xiao.custom.elasticsearch.starter.example;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.elasticsearch.start.autoconfig.properties.ElasticsearchProperties;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.http.Header;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.entity.ContentType;\nimport org.apache.http.message.BasicHeader;\nimport org.apache.http.nio.entity.NStringEntity;\nimport org.apache.http.util.EntityUtils;\nimport org.elasticsearch.ElasticsearchException;\nimport org.elasticsearch.action.DocWriteRequest;\nimport org.elasticsearch.action.DocWriteResponse;\nimport org.elasticsearch.action.admin.indices.alias.Alias;\nimport org.elasticsearch.action.admin.indices.close.CloseIndexRequest;\nimport org.elasticsearch.action.admin.indices.close.CloseIndexResponse;\nimport org.elasticsearch.action.admin.indices.create.CreateIndexRequest;\nimport org.elasticsearch.action.admin.indices.create.CreateIndexResponse;\nimport org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;\nimport org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;\nimport org.elasticsearch.action.admin.indices.get.GetIndexRequest;\nimport org.elasticsearch.action.admin.indices.open.OpenIndexRequest;\nimport org.elasticsearch.action.admin.indices.open.OpenIndexResponse;\nimport org.elasticsearch.action.bulk.*;\nimport org.elasticsearch.action.delete.DeleteRequest;\nimport org.elasticsearch.action.delete.DeleteResponse;\nimport org.elasticsearch.action.get.GetRequest;\nimport org.elasticsearch.action.get.GetResponse;\nimport org.elasticsearch.action.index.IndexRequest;\nimport org.elasticsearch.action.index.IndexResponse;\nimport org.elasticsearch.action.search.SearchRequest;\nimport org.elasticsearch.action.search.SearchResponse;\nimport org.elasticsearch.action.support.master.AcknowledgedRequest;\nimport org.elasticsearch.action.support.replication.ReplicationResponse;\nimport org.elasticsearch.action.update.UpdateRequest;\nimport org.elasticsearch.action.update.UpdateResponse;\nimport org.elasticsearch.client.Response;\nimport org.elasticsearch.client.RestClient;\nimport org.elasticsearch.client.RestHighLevelClient;\nimport org.elasticsearch.common.settings.Settings;\nimport org.elasticsearch.common.unit.ByteSizeUnit;\nimport org.elasticsearch.common.unit.ByteSizeValue;\nimport org.elasticsearch.common.unit.TimeValue;\nimport org.elasticsearch.common.xcontent.XContentBuilder;\nimport org.elasticsearch.common.xcontent.XContentFactory;\nimport org.elasticsearch.common.xcontent.XContentType;\nimport org.elasticsearch.index.get.GetResult;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.rest.RestStatus;\nimport org.elasticsearch.search.builder.SearchSourceBuilder;\nimport org.elasticsearch.search.fetch.subphase.FetchSourceContext;\nimport org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/28 13:56\n * @since JDK 1.8\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ElasticsearchApplicationTest\n{\n    @Autowired\n    private RestHighLevelClient restHighLevelClient;\n\n    @Autowired\n    private ElasticsearchProperties elasticsearchProperties;\n\n    /**\n     * 搜索\n     * https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.2/java-rest-high-search.html\n     */\n    @Test\n    public void testQuery()\n    {\n        SearchRequest request = new SearchRequest(\"10000\");\n        //        request.searchType(\"10000\");\n        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();\n        searchSourceBuilder.query(QueryBuilders.termQuery(\"commodityNo\", \"3439538790\"));\n\n        searchSourceBuilder.from(0);\n        searchSourceBuilder.size(10);\n        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));\n\n        // 高亮设置\n        HighlightBuilder highlightBuilder = new HighlightBuilder().field(\"*\").requireFieldMatch(false);\n        if (StringUtils.isNoneEmpty(elasticsearchProperties.getHighlightPre()))\n        {\n            highlightBuilder.preTags(elasticsearchProperties.getHighlightPre());\n            highlightBuilder.postTags(elasticsearchProperties.getHighlightPost());\n            highlightBuilder.field(\"subTitle\");\n            highlightBuilder.field(\"title\");\n        }\n        searchSourceBuilder.highlighter(highlightBuilder);\n\n        request.source(searchSourceBuilder);\n\n        try\n        {\n            final SearchResponse response = restHighLevelClient.search(request);\n            response.getHits().forEach(document -> System.out.println(document.getSourceAsString()));\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * 批处理：\n     * 增删改查\n     */\n    public void testBulkRequest()\n    {\n        BulkRequest request = new BulkRequest();\n        request.add(new DeleteRequest(\"posts\", \"doc\", \"3\"));\n        request.add(new UpdateRequest(\"posts\", \"doc\", \"2\").doc(XContentType.JSON, \"other\", \"test\"));\n        request.add(new IndexRequest(\"posts\", \"doc\", \"4\").source(XContentType.JSON, \"field\", \"baz\"));\n\n        try\n        {\n            // restHighLevelClient.bulkAsync(request, ActionListener);\n            BulkResponse bulkResponse = restHighLevelClient.bulk(request);\n            if (bulkResponse.hasFailures())\n            {\n                for (BulkItemResponse bulkItemResponse : bulkResponse)\n                {\n                    if (bulkItemResponse.isFailed())\n                    {\n                        BulkItemResponse.Failure failure = bulkItemResponse.getFailure();\n                        System.out.println(\"处理失败:\" + failure.getId() + '-' + failure.getMessage());\n                    }\n                }\n            }\n\n            for (BulkItemResponse bulkItemResponse : bulkResponse)\n            {\n                DocWriteResponse itemResponse = bulkItemResponse.getResponse();\n\n                if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.INDEX\n                        || bulkItemResponse.getOpType() == DocWriteRequest.OpType.CREATE)\n                {\n                    IndexResponse indexResponse = (IndexResponse) itemResponse;\n                    // 创建\n\n                }\n                else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.UPDATE)\n                {\n                    UpdateResponse updateResponse = (UpdateResponse) itemResponse;\n                    // 更新\n\n                }\n                else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.DELETE)\n                {\n                    DeleteResponse deleteResponse = (DeleteResponse) itemResponse;\n                    // 删除\n                }\n            }\n\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * BulkProcessor通过提供一个实用程序类简化了批量API的使用，该实用程序类允许在将索引/更新/删除操作添加到处理器时透明地执行这些操作。\n     */\n    @Test\n    public void testBulkProcessor()\n    {\n        BulkProcessor.Listener listener = new BulkProcessor.Listener()\n        {\n            @Override\n            public void beforeBulk(long executionId, BulkRequest request)\n            {\n                int numberOfActions = request.numberOfActions();\n                System.out.println(\"当前BulkProcessor中执行的操作数:\" + numberOfActions);\n            }\n\n            @Override\n            public void afterBulk(long executionId, BulkRequest request, BulkResponse response)\n            {\n                if (response.hasFailures())\n                {\n                    System.out.println(\"当前BulkProcessor执行出现异常：\" + response.buildFailureMessage());\n                }\n                else\n                {\n                    System.out.println(\"执行成功!\");\n                }\n            }\n\n            @Override\n            public void afterBulk(long executionId, BulkRequest request, Throwable failure)\n            {\n                System.out.println(\"当前请求发生的错误消息：\" + failure.getMessage());\n                failure.printStackTrace();\n            }\n        };\n\n        BulkProcessor.Builder builder = BulkProcessor.builder(restHighLevelClient::bulkAsync, listener);\n        //根据当前添加的操作数设置刷新新批量请求的时间 defaults to 1000\n        builder.setBulkActions(500);\n        // 根据当前添加的操作的大小设置刷新新批量请求的时间 defaults to 5Mb\n        builder.setBulkSize(new ByteSizeValue(1L, ByteSizeUnit.MB));\n        // 设置允许执行的并发请求数 默认0仅允许一个\n        builder.setConcurrentRequests(0);\n        // 设置刷新间隔，如果间隔通过，则刷新任何挂起的BulkRequest\n        builder.setFlushInterval(TimeValue.timeValueSeconds(10L));\n        // 回退策略 等待1秒，最多重试3\n        builder.setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1L), 3));\n\n        BulkProcessor bulkProcessor = builder.build();\n        IndexRequest one = new IndexRequest(\"posts\", \"doc\", \"1\").\n                source(XContentType.JSON, \"title\", \"In which order are my Elasticsearch queries executed?\");\n        IndexRequest two = new IndexRequest(\"posts\", \"doc\", \"2\")\n                .source(XContentType.JSON, \"title\", \"Current status and upcoming changes in Elasticsearch\");\n        IndexRequest three = new IndexRequest(\"posts\", \"doc\", \"3\")\n                .source(XContentType.JSON, \"title\", \"The Future of Federated Search in Elasticsearch\");\n        bulkProcessor.add(one);\n        bulkProcessor.add(two);\n        bulkProcessor.add(three);\n\n        try\n        {\n            // 执行并等待，直到超时\n            boolean terminated = bulkProcessor.awaitClose(30L, TimeUnit.SECONDS);\n        }\n        catch (InterruptedException e)\n        {\n            e.printStackTrace();\n        }\n        // 关闭\n        bulkProcessor.close();\n    }\n\n    /**\n     * 插入数据 index api\n     */\n    @Test\n    public void testInsert() throws IOException\n    {\n        String index = \"101010\";\n        String type = index;\n        String id = UUID.randomUUID().toString();\n        IndexRequest indexRequest = new IndexRequest(index, type, id);\n\n        // 可以设置版本号，但可能出现版本冲突异常  ElasticsearchException  e.status() == RestStatus.CONFLICT\n        indexRequest.version(1);\n        // or\n        //        IndexRequest indexRequest = new IndexRequest();\n        //        indexRequest.index(index);\n        //        indexRequest.type(type);\n        //        indexRequest.id(id);\n\n        // As json String\n        String jsonString = \"{\" + \"\\\"user\\\":\\\"kimchy\\\",\" + \"\\\"postDate\\\":\\\"2013-01-30\\\",\"\n                + \"\\\"message\\\":\\\"trying out Elasticsearch\\\"\" + \"}\";\n        indexRequest.source(jsonString, XContentType.JSON);\n\n        // As map\n        Map<String, Object> jsonMap = new HashMap<>();\n        jsonMap.put(\"user\", \"kimchy\");\n        jsonMap.put(\"postDate\", new Date());\n        jsonMap.put(\"message\", \"trying out Elasticsearch\");\n        indexRequest.source(jsonMap);\n\n        // As XContentBuilder\n\n        XContentBuilder builder = XContentFactory.jsonBuilder();\n        builder.startObject();\n        {\n            builder.field(\"user\", \"kimchy\");\n            builder.field(\"postDate\", new Date());\n            builder.field(\"message\", \"trying out Elasticsearch\");\n        }\n        builder.endObject();\n        indexRequest.source(builder);\n\n        // As source\n        indexRequest.source(\"user\", \"kimchy\", \"postDate\", new Date(), \"message\", \"trying out Elasticsearch\");\n\n        // index or indexAsync\n        IndexResponse indexResponse = restHighLevelClient.index(indexRequest);\n\n        index = indexResponse.getIndex();\n        type = indexResponse.getType();\n        id = indexResponse.getId();\n        long version = indexResponse.getVersion();\n        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED)\n        {\n            System.out.println(\"ES数据已经成功创建\");\n        }\n        else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED)\n        {\n            System.out.println(\"ES数据已经成功覆盖\");\n        }\n        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();\n        if (shardInfo.getTotal() != shardInfo.getSuccessful())\n        {\n            System.out.println(\"数据创建成功，但成功的shard数量小于总shard数量\");\n        }\n        if (shardInfo.getFailed() > 0)\n        {\n            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures())\n            {\n                System.out.println(\"失败原：\" + failure.reason());\n            }\n        }\n\n    }\n\n    /**\n     * 文档ID 查找\n     */\n    @Test\n    public void testGetIndex()\n    {\n        GetRequest getRequest = new GetRequest(\"101010\", \"101010\", \"101010\");\n        // 设置版本\n        //        getRequest.version(2);\n\n        //禁用获取 _source字段\n        getRequest.fetchSourceContext(new FetchSourceContext(false));\n\n        try\n        {\n            // get or getAsync(request,ActionListener)\n            GetResponse getResponse = restHighLevelClient.get(getRequest);\n            String index = getResponse.getIndex();\n            String type = getResponse.getType();\n            String id = getResponse.getId();\n            if (getResponse.isExists())\n            {\n                long version = getResponse.getVersion();\n                String sourceAsString = getResponse.getSourceAsString();\n                Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();\n                byte[] sourceAsBytes = getResponse.getSourceAsBytes();\n            }\n            else\n            {\n                System.out.println(\"不存在的数据!\");\n            }\n        }\n        catch (ElasticsearchException e)\n        {\n            if (e.status() == RestStatus.NOT_FOUND)\n            {\n                System.out.println(\"索引不存在\");\n            }\n            else if (e.status() == RestStatus.CONFLICT)\n            {\n                System.out.println(\"版本冲突!\");\n            }\n            else\n            {\n                System.out.println(\"其他为未知异常：\" + e.status().name());\n            }\n        }\n        catch (IOException e)\n        {\n            System.out.println(\"IO 异常\");\n        }\n\n    }\n\n    /**\n     * 文档ID 更新\n     * 1. 脚本更新\n     * 2. 文档更新：部分字段更新和不存在直接插入更新\n     */\n    @Test\n    public void testUpdate() throws IOException\n    {\n        UpdateRequest request = new UpdateRequest(\"101010\", \"101010\", \"101010\");\n\n        // ############## 更新文档数据部分字段使用 .doc ，如果不确定存在则直接插入使用 .upsert方法\n        // As  JSON String\n        String jsonString = \"{\" + \"\\\"updated\\\":\\\"2017-01-01\\\",\" + \"\\\"reason\\\":\\\"daily update\\\"\" + \"}\";\n        request.doc(jsonString, XContentType.JSON);\n        //        request.upsert(jsonString,XContentType.JSON);\n\n        // As Map\n        Map<String, Object> jsonMap = new HashMap<>();\n        jsonMap.put(\"updated\", new Date());\n        jsonMap.put(\"reason\", \"daily update\");\n        request.doc(jsonMap);\n        //        request.upsert(jsonMap);\n\n        // AS XContentBuilder\n        XContentBuilder builder = XContentFactory.jsonBuilder();\n        builder.startObject();\n        {\n            builder.field(\"updated\", new Date());\n            builder.field(\"reason\", \"daily update\");\n        }\n        builder.endObject();\n        request.doc(builder);\n        request.upsert(builder);\n\n        // 设置版本\n        //        request.version(2);\n\n        //指示如果部分文档尚不存在，则必须将其用作upsert文档。\n        //        request.docAsUpsert(true);\n\n        try\n        {\n            //同步 update 异步 updateAsync(request,ActionListener)\n            UpdateResponse updateResponse = restHighLevelClient.update(request);\n            String index = updateResponse.getIndex();\n            String type = updateResponse.getType();\n            String id = updateResponse.getId();\n            long version = updateResponse.getVersion();\n            if (updateResponse.getResult() == DocWriteResponse.Result.CREATED)\n            {\n                System.out.println(\"文档不存在，创建成功!\");\n            }\n            else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED)\n            {\n                System.out.println(\"文档更新成功!\");\n            }\n            else if (updateResponse.getResult() == DocWriteResponse.Result.DELETED)\n            {\n                System.out.println(\"文档删除成功!\");\n            }\n            else if (updateResponse.getResult() == DocWriteResponse.Result.NOOP)\n            {\n                System.out.println(\"没有对文档做任何更新操作!\");\n            }\n\n            // 获取更新后的数据\n            GetResult result = updateResponse.getGetResult();\n            if (result.isExists())\n            {\n                String sourceAsString = result.sourceAsString();\n                Map<String, Object> sourceAsMap = result.sourceAsMap();\n                byte[] sourceAsBytes = result.source();\n            }\n            else\n            {\n                System.out.println(\"文档不存在!\");\n            }\n\n            // 分片更新失败\n            ReplicationResponse.ShardInfo shardInfo = updateResponse.getShardInfo();\n            if (shardInfo.getFailed() > 0)\n            {\n                for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures())\n                {\n                    System.out.println(\"分片ID:\" + failure.fullShardId() + \"更新失败：\" + failure.reason());\n                }\n            }\n        }\n        catch (ElasticsearchException e)\n        {\n            // 可能有索引没找到，版本异常，参考RestStatus\n            System.out.println(\"更新异常：\" + e.status().name());\n        }\n    }\n\n    /**\n     * 文档ID 删除\n     */\n    @Test\n    public void testDel()\n    {\n        DeleteRequest request = new DeleteRequest(\"101010\", \"101010\", \"101010\");\n        try\n        {\n            DeleteResponse deleteResponse = restHighLevelClient.delete(request);\n            if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND)\n            {\n                System.out.println(\"删除的文档不存在\");\n            }\n\n            ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();\n            if (shardInfo.getTotal() != shardInfo.getSuccessful())\n            {\n                System.out.println(\"删除成功了，但是删除的数量与分片的数量不符合!\");\n            }\n            if (shardInfo.getFailed() > 0)\n            {\n                for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures())\n                {\n                    System.out.println(\"分片ID:\" + failure.fullShardId() + \"更新失败：\" + failure.reason());\n                }\n            }\n        }\n        catch (ElasticsearchException e)\n        {\n            System.out.println(\"删除异常：\" + e.status().name());\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * 创建索引\n     *\n     * @exception IOException\n     */\n    @Test\n    public void testCreateIndex() throws IOException\n    {\n        CreateIndexRequest request = new CreateIndexRequest(\"101010\");\n        // setting设置\n        request.settings(Settings.builder().put(\"index.number_of_shards\", 3).put(\"index.number_of_replicas\", 2));\n        // mapping\n        //        request.mapping();\n        request.alias(new Alias(\"101010_alias\"));\n\n        // 其他可选参数\n        setOptionParams(request);\n\n        // 同步创建\n        final CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request);\n        // 所有节点是否已确认请求\n        if (createIndexResponse.isAcknowledged())\n        {\n            System.out.println(\"创建成功!\");\n        }\n        // 是否在超时前为索引中的每个碎片启动了所需数量的分片副本\n        if (createIndexResponse.isShardsAcknowledged())\n        {\n            System.out.println(\"分片副本都已创建成功\");\n        }\n\n        // 异步创建\n        //        restHighLevelClient.indices().createAsync(request, new ActionListener<CreateIndexResponse>()\n        //        {\n        //            @Override\n        //            public void onResponse(CreateIndexResponse clearIndicesCacheResponse)\n        //            {\n        //                System.out.println(\"所有节点是否已确认请求: \" + createIndexResponse.isAcknowledged());\n        //                System.out.println(\"分片副本都已创建成功:\" + createIndexResponse.isShardsAcknowledged());\n        //            }\n        //\n        //            @Override\n        //            public void onFailure(Exception e)\n        //            {\n        //                System.out.println(\"请求出现异常，异常信息：\" + e.getMessage());\n        //                e.printStackTrace();\n        //            }\n        //        });\n    }\n\n    /**\n     * 所以是否存在\n     */\n    @Test\n    public void testIndexExist()\n    {\n        GetIndexRequest request = new GetIndexRequest();\n        request.indices(\"10001\");\n        try\n        {\n            System.out.println(restHighLevelClient.indices().exists(request));\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * 删除索引\n     */\n    @Test\n    public void testDelIndex()\n    {\n        DeleteIndexRequest request = new DeleteIndexRequest(\"101010\");\n        // 其他可选参数\n        setOptionParams(request);\n\n        // 同步\n        try\n        {\n            DeleteIndexResponse response = restHighLevelClient.indices().delete(request);\n            System.out.println(\"所有节点已确认：\" + response.isAcknowledged());\n        }\n        catch (ElasticsearchException exception)\n        {\n            if (exception.status() == RestStatus.NOT_FOUND)\n            {\n                System.out.println(\"索引未找到!\");\n            }\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n\n        // 异步\n        //        restHighLevelClient.indices().deleteAsync(request, new ActionListener<DeleteIndexResponse>()\n        //        {\n        //            @Override\n        //            public void onResponse(DeleteIndexResponse deleteIndexResponse)\n        //            {\n        //                System.out.println(\"所有节点已确认：\" + deleteIndexResponse.isAcknowledged());\n        //            }\n        //\n        //            @Override\n        //            public void onFailure(Exception e)\n        //            {\n        //                if (e instanceof ElasticsearchException)\n        //                {\n        //                    ElasticsearchException exception = (ElasticsearchException) e;\n        //                    if (exception.status() == RestStatus.NOT_FOUND)\n        //                    {\n        //                        System.out.println(\"索引未找到!\");\n        //                    }\n        //                }\n        //                System.out.println(\"删除出现位置异常!\");\n        //            }\n        //        });\n    }\n\n    /**\n     * 打开和关闭索引\n     */\n    @Test\n    public void testOpenAndCloseIndex() throws IOException\n    {\n        OpenIndexRequest openIndexRequest = new OpenIndexRequest(\"index\");\n        setOptionParams(openIndexRequest);\n        // 同步 open or 异步 openAsync\n        OpenIndexResponse openIndexResponse = restHighLevelClient.indices().open(openIndexRequest);\n        System.out.println(\"所有节点已确认：\" + openIndexResponse.isAcknowledged());\n        System.out.println(\"所有副本分片已确认：\" + openIndexResponse.isShardsAcknowledged());\n\n        CloseIndexRequest closeIndexRequest = new CloseIndexRequest(\"index\");\n        setOptionParams(closeIndexRequest);\n        // 同步 close or 异步  closeAsync\n        CloseIndexResponse closeIndexResponse = restHighLevelClient.indices().close(closeIndexRequest);\n        System.out.println(\"所有节点已确认：\" + closeIndexResponse.isAcknowledged());\n\n    }\n\n    private void setOptionParams(AcknowledgedRequest request)\n    {\n        // 其他可选参数\n        request.timeout(TimeValue.timeValueMinutes(2));\n        //        request.timeout(\"2m\");\n\n        // master node\n        //        request.masterNodeTimeout(TimeValue.timeValueMinutes(1));\n        //        request.masterNodeTimeout(\"1m\");\n\n        // 创建索引API返回响应之前等待的活动分片副本数\n        //        request.waitForActiveShards(2);\n        //        request.waitForActiveShards(ActiveShardCount.DEFAULT);\n    }\n\n    /**\n     * [简要描述]:使用LowLevelClient 执行analyzer操作<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/9/17 - 10:45\n     **/\n    @Test\n    public void testAnalysis()\n    {\n        RestClient lowLevelClient = restHighLevelClient.getLowLevelClient();\n        JSONObject entity = new JSONObject();\n        entity.put(\"analyzer\", \"ik_max_word\");\n        entity.put(\"text\", \"我是中国人\");\n        HttpEntity httpEntity = new NStringEntity(JSONObject.toJSONString(entity), ContentType.APPLICATION_JSON);\n\n        Map<String, String> params = Collections.emptyMap();\n        Header[] defaultHeaders = new Header[] { new BasicHeader(\"header\", \"value\") };\n        try\n        {\n            Response response = lowLevelClient.performRequest(\"POST\", \"_analyze\", params, httpEntity, defaultHeaders);\n            JSONObject tokens = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));\n            JSONArray arrays = tokens.getJSONArray(\"tokens\");\n            String[] result = new String[arrays.size()];\n            for (int i = 0; i < arrays.size(); i++)\n            {\n                JSONObject obj = JSONObject.parseObject(arrays.getString(i));\n                result[i] = obj.getString(\"token\");\n            }\n            System.out.println(Arrays.toString(result));\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/Readme.md",
    "content": "**定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter**\n\n**1. 自定义SpringBoot Starter 三要素：**\n>1.1.pom :\n```$xslt\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n        </dependency>\n\n        <!-- 将被@ConfigurationProperties注解的类的属性注入到元数据 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n```\n>1.2. 注解使用\n```$xslt\n@Data\n@ConfigurationProperties(prefix = ElasticsearchProperties.ELASTIC_SEARCH_PREFIX)\npublic class ElasticsearchProperties{}\n\n@Configuration\n@EnableConfigurationProperties(ElasticsearchProperties.class)\npublic class ElasticsearchAutoConfiguration{}\n```\n>1.3 EnableAutoConfiguration 利用SpringFactoriesLoader机制加载所有的AutoConfiguration类 META-INF/spring.factories\n```$xslt\norg.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.xiao.custom.elasticsearch.start.autoconfig.ElasticsearchAutoConfiguration\n```\n\nElasticsearch高级客户端打包集成为Springboot Starter包，详情参考[Example工程](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example)<p>\n**2. Custom ElasticSearch High Level Rest Client Starter使用说明：**<p>\n>2.1Pom引入<br>\n```$xslt\n     \n       <properties>\n               <elasticsearch.version>6.3.2</elasticsearch.version>\n       </properties>\n\n       <dependencies>\n        <dependency>\n            <groupId>com.purcotton.omni</groupId>\n            <artifactId>omni-common-elasticsearch-starter</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch</groupId>\n            <artifactId>elasticsearch</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch.client</groupId>\n            <artifactId>elasticsearch-rest-client</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.elasticsearch.client</groupId>\n            <artifactId>elasticsearch-rest-high-level-client</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n       </dependencies>\n```\n>2.2配置文件：<br>\n```$xslt\nspring:\n  elasticsearch:\n    rest:\n      clusterName: omni-dev-es\n      hosts:\n        -\n          hostname: 192.168.206.210\n          port: 9200\n          schema: http\n        #-\n          #hostname: 192.168.206.212\n          #port: 9200\n          #schema: http\n      #username: you username\n      #password: you passwd\n      # 连接超时时间,单位ms,默认1S\n      connectTimeout: 1000\n      # socket超时时间,单位ms,默认30S\n      socketTimeout: 30000\n      # 请求超时时间,单位ms,默认500ms\n      requestTimeout: 500\n      # 单机最大连接数,默认30个\n      maxConnect: 30\n      # 单机最大并发数,默认10个\n      maxConnectRoute: 10\n      # 最大重试时间,默认30S\n      maxRetryTimeout: 30000\n\n```\n>2.3代码引用：<br>\n```$xslt\n    @Autowired\n    private RestHighLevelClient restHighLevelClient;\n```\n>2.4ElasticSearch High Level Rest Client 增删改Demo：<br>\n[ElasticsearchApplicationTest](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Custom-Elasticsearch-Starter/Custom-Elasticsearch-Starter-Example/src/test/java/com/xiao/custom/elasticsearch/starter/example/ElasticsearchApplicationTest.java)<br>\n```$xslt\n   // 创建索引\n   ElasticsearchApplicationTest.testCreateIndex()\n   // 索引是否存在\n   ElasticsearchApplicationTest.testIndexExist()\n   // 删除索引\n   ElasticsearchApplicationTest.testDelIndex()\n   // 打开和关闭索引\n   ElasticsearchApplicationTest.testOpenAndCloseIndex()\n   // 添加文档\n   ElasticsearchApplicationTest.testInsert()\n   // 主键ID获取文档\n   ElasticsearchApplicationTest.testGetIndex()\n   // 更新文档\n   ElasticsearchApplicationTest.testUpdate()\n   // 搜索\n   ElasticsearchApplicationTest.testQuery()\n   // 删除文档\n   ElasticsearchApplicationTest.testDel()\n   // 批处理1\n   ElasticsearchApplicationTest.testBulkRequest()\n   // 批处理2\n   ElasticsearchApplicationTest.testBulkProcessor()\n```"
  },
  {
    "path": "SpringBoot-Custom-Elasticsearch-Starter/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        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.xiao.skywalking.demo</groupId>\n    <artifactId>SpringBoot-Custom-Elasticsearch-Starter</artifactId>\n    <version>0.0.1-SNAPSHOT</version>\n    <name>Custom ElasticSearch High Level Rest Client Stater</name>\n    <packaging>pom</packaging>\n    <modules>\n        <module>Custom-Elasticsearch-Starter-Autoconfig</module>\n        <module>Custom-Elasticsearch-Starter</module>\n        <module>Custom-Elasticsearch-Starter-Example</module>\n    </modules>\n\n\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/Readme.md",
    "content": "Springboot Rest Template配置\n\n1. 支持Ok Http和Http连接池模式，内嵌包装成HttClientService服务，并提供完成的请求日志处理\n2. 引入pom:\n    ```$xslt\n    <dependency>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <artifactId>SpringBoot-Custom-Rest-Autconfigure</artifactId>\n        <version>0.0.1-SNAPSHOT</version>\n    </dependency>\n    ```\n\n3. Ok Http使用：\n    ```$xslt\n        rest:\n          # okhttp 配置\n          okhttp:\n            enable: true\n            connection-timeout: 12000\n            read-timeout: 30000\n            write-timeout: 12000\n    ```\n   \n4. Http pool使用：\n    ```$xslt\n        rest\n          # http pool\n          pool:\n            enable: true\n            max-total: 20\n            default-max-per-route: 2\n            validate-after-inactivity: 2000\n            connect-timeout: 10000\n            connection-request-timeout: 10000\n            socket-timeout: 10000\n    ```\n5. 同步异步使用：\n    ```$xslt\n       rest:\n         http:\n           service:\n             sync: true\n             async: false\n    ```\n   \n6. 使用方式，推荐使用HttpClientService，因为提供了完整的日志记录：\n    ```$xslt\n            // 使用包装http client\n           @Autowired\n           private HttpClientService httpClientService;\n           \n           // 使用 resttemplate\n           @Autowired\n           private RestTemplate restTemplate;\n    ```\n7. HttpClientService日志处理，实现HttpRequestLogService接口\n    ```$xslt\n    public class HttpLogServiceImpl implements HttpRequestLogService\n        {\n            /**\n             * [简要描述]:保存日志信息<br/>\n             * [详细描述]:<br/>\n             *\n             * @param requestLog :\n             * llxiao  2019/4/24 - 14:42\n             **/\n            @Override\n            public void saveRequestLog(HttpRequestLog requestLog)\n            {\n                // 日志输出\n                log.info(\"Example log : {}\", JSONObject.toJSONString(requestLog));\n            }\n        }\n    ```"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/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>SpringBoot-Custom-Rest-Starter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringBoot-Custom-Rest-Autconfigure</artifactId>\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.retry</groupId>\n            <artifactId>spring-retry</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.aspectj</groupId>\n            <artifactId>aspectjweaver</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-context</artifactId>\n            <scope>compile</scope>\n            <version>1.3.4.RELEASE</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n\n        <!-- springboot 依赖 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n        </dependency>\n\n        <!-- 将被@ConfigurationProperties注解的类的属性注入到元数据 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-collections</groupId>\n            <artifactId>commons-collections</artifactId>\n            <version>3.2.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.squareup.okhttp3</groupId>\n            <artifactId>okhttp</artifactId>\n            <version>3.11.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.5.13</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/config/RestTemplateConfiguration.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.config;\n\nimport com.xiao.custom.rest.starter.autoconfigure.config.properties.HttpPoolProperties;\nimport com.xiao.custom.rest.starter.autoconfigure.config.properties.OkHttpProperties;\nimport com.xiao.custom.rest.starter.autoconfigure.interceptor.RestInterceptor;\nimport com.xiao.custom.rest.starter.autoconfigure.service.HttpClientService;\nimport com.xiao.custom.rest.starter.autoconfigure.service.impl.HttpClientAsyncServiceImpl;\nimport com.xiao.custom.rest.starter.autoconfigure.service.impl.HttpClientServiceImpl;\nimport com.xiao.custom.rest.starter.autoconfigure.service.impl.HttpRetryService;\nimport lombok.extern.slf4j.Slf4j;\nimport okhttp3.OkHttpClient;\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.config.Registry;\nimport org.apache.http.config.RegistryBuilder;\nimport org.apache.http.conn.socket.ConnectionSocketFactory;\nimport org.apache.http.conn.socket.PlainConnectionSocketFactory;\nimport org.apache.http.conn.ssl.NoopHostnameVerifier;\nimport org.apache.http.conn.ssl.SSLConnectionSocketFactory;\nimport org.apache.http.impl.client.HttpClientBuilder;\nimport org.apache.http.impl.conn.PoolingHttpClientConnectionManager;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.client.ClientHttpRequestFactory;\nimport org.springframework.http.client.HttpComponentsClientHttpRequestFactory;\nimport org.springframework.http.client.OkHttp3ClientHttpRequestFactory;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.retry.annotation.EnableRetry;\nimport org.springframework.web.client.DefaultResponseErrorHandler;\nimport org.springframework.web.client.RestTemplate;\n\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLSocketFactory;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\nimport java.nio.charset.StandardCharsets;\nimport java.security.KeyManagementException;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Collections;\n\n/**\n * [简要描述]: 初始化rest template\n * [详细描述]: 开启重试\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:43\n * @since JDK 1.8\n */\n@Configuration\n@ComponentScan(\"com.xiao.custom.rest.starter.autoconfigure\")\n@Slf4j\n@EnableRetry\npublic class RestTemplateConfiguration\n{\n\n    /**\n     * [简要描述]:okHttp支持<br/>\n     * [详细描述]:<br/>\n     *\n     * @param okHttpProperties :\n     * @return org.springframework.http.client.ClientHttpRequestFactory\n     * xiaolinlin  2020/1/16 - 18:43\n     **/\n    @Bean\n    @ConditionalOnProperty(value = \"rest.okhttp.enable\", havingValue = \"true\")\n    @ConditionalOnMissingBean(ClientHttpRequestFactory.class)\n    public ClientHttpRequestFactory okHttpHttpRequestFactory(OkHttpProperties okHttpProperties)\n    {\n        log.info(\"Init request factory for okHttp!\");\n        OkHttp3ClientHttpRequestFactory clientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory(buildOkHttpsClient()\n                .build());\n        //连接超时\n        clientHttpRequestFactory.setConnectTimeout(okHttpProperties.getConnectionTimeout());\n        //读超时\n        clientHttpRequestFactory.setReadTimeout(okHttpProperties.getReadTimeout());\n        //写超时\n        clientHttpRequestFactory.setWriteTimeout(okHttpProperties.getWriteTimeout());\n        return clientHttpRequestFactory;\n    }\n\n    /**\n     * [简要描述]:http pool支持<br/>\n     * [详细描述]:<br/>\n     *\n     * @param httpPoolProperties :\n     * @return org.springframework.http.client.ClientHttpRequestFactory\n     * xiaolinlin  2020/1/16 - 18:43\n     **/\n    @Bean\n    @ConditionalOnProperty(value = \"rest.pool.enable\", havingValue = \"true\")\n    @ConditionalOnMissingBean(ClientHttpRequestFactory.class)\n    public ClientHttpRequestFactory httpPoolRequestFactory(HttpPoolProperties httpPoolProperties)\n    {\n        log.info(\"Init request factory for http pool\");\n\n        SSLConnectionSocketFactory socketFactory = null;\n        SSLContext sslContext = buildSslContext();\n        if (null != sslContext)\n        {\n            socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);\n        }\n        else\n        {\n            socketFactory = SSLConnectionSocketFactory.getSocketFactory();\n        }\n        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()\n                .register(\"http\", PlainConnectionSocketFactory.getSocketFactory()).register(\"https\", socketFactory)\n                .build();\n\n        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);\n        connectionManager.setMaxTotal(httpPoolProperties.getMaxTotal());\n        connectionManager.setDefaultMaxPerRoute(httpPoolProperties.getDefaultMaxPerRoute());\n        connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());\n        RequestConfig requestConfig = RequestConfig.custom()\n                //服务器返回数据(response)的时间，超过抛出read timeout\n                .setSocketTimeout(httpPoolProperties.getSocketTimeout())\n                //连接上服务器(握手成功)的时间，超出抛出connect timeout\n                .setConnectTimeout(httpPoolProperties.getConnectTimeout())\n                //从连接池中获取连接的超时时间，超时间未拿到可用连接，会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool\n                .setConnectionRequestTimeout(httpPoolProperties.getConnectionRequestTimeout()).build();\n\n        return new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create()\n                .setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager).build());\n    }\n\n    /**\n     * [简要描述]:RestTemplate<br/>\n     * [详细描述]:<br/>\n     *\n     * @param clientHttpRequestFactory :\n     * @return org.springframework.web.client.RestTemplate\n     * xiaolinlin  2020/1/16 - 18:47\n     **/\n    @Bean\n    @ConditionalOnMissingBean(RestTemplate.class)\n    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory)\n    {\n        log.info(\"Init rest template!\");\n        RestTemplate restTemplate = new RestTemplate();\n        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));\n        restTemplate.setRequestFactory(clientHttpRequestFactory);\n\n        restTemplate.setErrorHandler(new DefaultResponseErrorHandler());\n\n        // 拦截\n        restTemplate.setInterceptors(Collections.singletonList(new RestInterceptor()));\n        return restTemplate;\n    }\n\n    /**\n     * [简要描述]:集成重试机制<br/>\n     * [详细描述]:<br/>\n     *\n     * @param restTemplate :\n     * @return com.purcotton.omni.rest.stater.common.service.impl.HttpRetryService\n     * xiaolinlin  2020/1/16 - 18:47\n     **/\n    @Bean\n    public HttpRetryService retryService(RestTemplate restTemplate)\n    {\n        log.info(\"Init http retry support!\");\n        return new HttpRetryService(restTemplate);\n    }\n\n    /**\n     * [简要描述]:http 同步服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param retryService: 支持重试请求\n     * @return com.purcotton.omni.rest.stater.common.service.HttpClientService\n     * xiaolinlin  2020/1/16 - 18:48\n     **/\n    @Bean\n    @ConditionalOnProperty(value = \"rest.http.service.sync\", havingValue = \"true\")\n    @ConditionalOnMissingBean(HttpClientService.class)\n    public HttpClientService httpClientService(HttpRetryService retryService)\n    {\n        log.info(\"Use sync http client service!\");\n        return new HttpClientServiceImpl(retryService);\n    }\n\n    /**\n     * [简要描述]:http 异步服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param retryService : 支持重试请求\n     * @return com.purcotton.omni.rest.stater.common.service.HttpClientService\n     * xiaolinlin  2020/1/16 - 18:48\n     **/\n    @Bean\n    @ConditionalOnProperty(value = \"rest.http.service.async\", havingValue = \"true\")\n    @ConditionalOnMissingBean(HttpClientService.class)\n    public HttpClientService asyncHttpClientService(HttpRetryService retryService)\n    {\n        log.info(\"User async http client service!\");\n        return new HttpClientAsyncServiceImpl(retryService);\n    }\n\n    /**\n     * [简要描述]:okhttp3 跳过https验证<br/>\n     * [详细描述]:<br/>\n     *\n     * @return okhttp3.OkHttpClient.Builder\n     * xiaolinlin  2020/1/4 - 10:31\n     **/\n    private OkHttpClient.Builder buildOkHttpsClient()\n    {\n        OkHttpClient.Builder builder = new OkHttpClient.Builder();\n        TrustManager[] trustAllCerts = buildTrustManagers();\n        SSLContext sslContext = buildSslContext();\n        if (null != sslContext && null != trustAllCerts)\n        {\n            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();\n            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);\n        }\n        builder.hostnameVerifier((hostname, session) -> true);\n        return builder;\n    }\n\n    private SSLContext buildSslContext()\n    {\n        TrustManager[] trustAllCerts = buildTrustManagers();\n        SSLContext sslContext = null;\n        try\n        {\n            sslContext = SSLContext.getInstance(\"SSL\");\n            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());\n        }\n        catch (NoSuchAlgorithmException | KeyManagementException e)\n        {\n            log.error(\"Init SSLContext error :\\n\", e);\n        }\n        return sslContext;\n    }\n\n    private TrustManager[] buildTrustManagers()\n    {\n        return new TrustManager[] { new X509TrustManager()\n        {\n            @Override\n            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)\n            {\n            }\n\n            @Override\n            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)\n            {\n            }\n\n            @Override\n            public java.security.cert.X509Certificate[] getAcceptedIssuers()\n            {\n                return new java.security.cert.X509Certificate[] {};\n            }\n        }\n        };\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/config/properties/HttpPoolProperties.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.config.properties;\n\nimport lombok.Data;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: http 连接池参数配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 11:09\n * @since JDK 1.8\n */\n@Component\n@ConfigurationProperties(prefix = \"rest.pool\")\n@ConditionalOnProperty(value = \"rest.pool.enable\", havingValue = \"true\")\n@Data\npublic class HttpPoolProperties\n{\n\n    private boolean enable;\n\n    /**\n     * 最大连接数\n     */\n    private Integer maxTotal = 20;\n\n    /**\n     * 最大路由数\n     */\n    private Integer defaultMaxPerRoute = 2;\n\n    /**\n     * 连接超时时间\n     */\n    private Integer connectTimeout = 5000;\n\n    /**\n     * 请求超时时间\n     */\n    private Integer connectionRequestTimeout = 1000;\n\n    /**\n     * socket超时时间\n     */\n    private Integer socketTimeout = 6500;\n\n    /**\n     * 校验时间\n     */\n    private Integer validateAfterInactivity = 2000;\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/config/properties/OkHttpProperties.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.config.properties;\n\nimport lombok.Data;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: ok http 参数配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 11:09\n * @since JDK 1.8\n */\n@Component\n@ConfigurationProperties(\"rest.okhttp\")\n@ConditionalOnProperty(value = \"rest.okhttp.enable\", havingValue = \"true\")\n@Data\npublic class OkHttpProperties\n{\n\n    private boolean enable;\n\n    /**\n     * 连接超时时间\n     */\n    private int connectionTimeout = 12000;\n\n    /**\n     * 读超时时间\n     */\n    private int readTimeout = 300000;\n\n    /**\n     * 写超时时间\n     */\n    private int writeTimeout = 120000;\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/dto/Request.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.dto;\n\nimport lombok.Data;\nimport org.springframework.http.HttpHeaders;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 13:48\n * @since JDK 1.8\n */\n@Data\npublic class Request\n{\n    public static final int POST = 0;\n    public static final int JSON = 1;\n\n    /**\n     * 请求uri\n     */\n    private String uri;\n    /**\n     * 返回值类型\n     */\n    private Class responseType;\n    /**\n     * 请求参数\n     */\n    private Object params;\n    /**\n     * 执行方式：0普通请求，1.JSON请求\n     */\n    private int method;\n\n    /**\n     * 执行请求的ID，用于重复请求更新操作\n     */\n    private Long requestId;\n\n    /**\n     * 自定义请求头\n     */\n    private HttpHeaders headers;\n\n    /**\n     * url变量\n     */\n    private Object uriVariables;\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/interceptor/RestInterceptor.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.interceptor;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.log.dto.HttpRequestLog;\nimport com.xiao.custom.rest.starter.autoconfigure.util.ThreadLocalUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpRequest;\nimport org.springframework.http.client.ClientHttpRequestExecution;\nimport org.springframework.http.client.ClientHttpRequestInterceptor;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.http.client.support.HttpRequestWrapper;\n\nimport java.io.IOException;\nimport java.sql.Timestamp;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * [简要描述]: restTemplate 拦截\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/23 16:47\n * @since JDK 1.8\n */\n@Slf4j\npublic class RestInterceptor implements ClientHttpRequestInterceptor\n{\n    /**\n     * Intercept the given request, and return a response. The given {@link ClientHttpRequestExecution} allows\n     * the interceptor to pass on the request and response to the next entity in the chain.\n     *\n     * <p>A typical implementation of this method would follow the following pattern:\n     * <ol>\n     * <li>Examine the {@linkplain HttpRequest request} and body</li>\n     * <li>Optionally {@linkplain HttpRequestWrapper wrap} the request to filter HTTP attributes.</li>\n     * <li>Optionally modify the body of the request.</li>\n     * <li><strong>Either</strong>\n     * <ul>\n     * <li>execute the request using {@link ClientHttpRequestExecution#execute(HttpRequest, byte[])},</li>\n     * <strong>or</strong>\n     * <li>do not execute the request to block the execution altogether.</li>\n     * </ul>\n     * <li>Optionally wrap the response to filter HTTP attributes.</li>\n     * </ol>\n     *\n     * @param request the request, containing method, URI, and headers\n     * @param body the body of the request\n     * @param execution the request execution\n     * @return the response\n     * @exception IOException in case of I/O errors\n     */\n    @Override\n    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)\n            throws IOException\n    {\n        HttpRequestLog requestLog = (HttpRequestLog) ThreadLocalUtil.get(HttpRequestLog.REQUEST_LOG);\n        if (null != requestLog)\n        {\n            requestLog.setMethod(request.getMethod().name());\n            requestLog.setHeader(JSONObject.toJSONString(this.filtrationHeaders(request.getHeaders())));\n            requestLog.setRequestTime(new Timestamp(System.currentTimeMillis()));\n        }\n\n        ClientHttpResponse response = execution.execute(request, body);\n\n        if (null != requestLog)\n        {\n            requestLog.setHttpStatus(response.getStatusCode().value());\n            requestLog.setResponseTime(new Timestamp(System.currentTimeMillis()));\n        }\n        return response;\n    }\n\n    private Map<String, Object> filtrationHeaders(HttpHeaders httpHeaders)\n    {\n        Map<String, Object> logMap = null;\n        if (null != httpHeaders)\n        {\n            logMap = new HashMap<>();\n            Map<String, List<String>> headerMap = (Map<String, List<String>>) JSONArray.toJSON(httpHeaders);\n            for (Map.Entry<String, List<String>> stringListEntry : headerMap.entrySet())\n            {\n\n                if (StringUtils.isNotBlank(stringListEntry.getKey()) && CollectionUtils\n                        .isNotEmpty(stringListEntry.getValue()))\n                {\n                    logMap.put(stringListEntry.getKey(), stringListEntry.getValue());\n                }\n            }\n        }\n        return logMap;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/log/annotation/RequestLog.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.log.annotation;\n\nimport java.lang.annotation.*;\n\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]: 请HTTP求日志注解\n * [详细描述]:\n * Retention 注解会在class字节码文件中存在，在运行时可以通过反射获取到\n * Inherited 说明子类可以继承父类中的该注解\n * Target 既可以在方法上，也可以在类上\n * Documented说明该注解将被包含在javadoc中\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 11:40\n * @since JDK 1.8\n */\n@Retention(RUNTIME)\n@Inherited\n@Target(ElementType.METHOD)\n@Documented\npublic @interface RequestLog\n{\n    String value() default \"\";\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/log/annotation/RequestLogAspect.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.log.annotation;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport com.xiao.custom.rest.starter.autoconfigure.log.dto.HttpRequestLog;\nimport com.xiao.custom.rest.starter.autoconfigure.log.service.HttpRequestLogService;\nimport com.xiao.custom.rest.starter.autoconfigure.util.ThreadLocalUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 请求日志切面\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 11:39\n * @since JDK 1.8\n */\n@Aspect\n@Component\n@Slf4j\npublic class RequestLogAspect\n{\n\n    /**\n     * 请求响应最大长度\n     */\n    private static final int MAX_PARAMS_LENGTH = 256;\n\n    /**\n     * 日志服务\n     */\n    @Autowired(required = false)\n    private HttpRequestLogService httpRequestLogService;\n\n    /**\n     * [简要描述]:定义一个annotation切入点<br/>\n     * [详细描述]:切入点<br/>\n     * llxiao  2018/9/2 - 17:02\n     **/\n    @Pointcut(\"@annotation(com.xiao.custom.rest.starter.autoconfigure.log.annotation.RequestLog)\")\n    public void logAnnotatison()\n    {\n\n    }\n\n    /**\n     * [简要描述]:around 切面强化<br/>\n     * [详细描述]:<br/>\n     *\n     * @param joinPoint :\n     * @return Object\n     * llxiao  2019/11/27 - 19:10\n     **/\n    @Around(\"logAnnotatison()\")\n    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable\n    {\n        HttpRequestLog requestLog = null;\n        Object retrunobj = null;\n        Object[] args = joinPoint.getArgs();\n        if (args.length > 0)\n        {\n\n            Object params = args[0];\n            if (params instanceof Request)\n            {\n                Request request = (Request) params;\n                Long requestId = request.getRequestId();\n                if (null == requestId)\n                {\n                    requestLog = new HttpRequestLog();\n                    requestLog.setCreateTime(new Timestamp(System.currentTimeMillis()));\n                    requestLog.setRequest(subParams(JSONObject.toJSONString(request)));\n                    requestLog.setUri(request.getUri());\n                    requestLog.setParams(subParams(JSONObject.toJSONString(request.getParams())));\n                    requestLog.setResponseType(request.getResponseType().getName());\n                }\n                ThreadLocalUtil.put(HttpRequestLog.REQUEST_LOG, requestLog);\n            }\n\n        }\n\n        try\n        {\n            retrunobj = joinPoint.proceed(args);\n            if (null != requestLog)\n            {\n                requestLog.setResponse(subParams(JSONObject.toJSONString(retrunobj)));\n            }\n        }\n        catch (Throwable e)\n        {\n            if (null != requestLog)\n            {\n                requestLog.setErrorMsg(e.getMessage());\n            }\n            log.error(\"Http 请求执行错误: \", e);\n            throw e;\n        }\n        finally\n        {\n            //删除当前线程保存数据，防止内存溢出\n            ThreadLocalUtil.remove();\n            if (null != httpRequestLogService)\n            {\n                httpRequestLogService.saveRequestLog(requestLog);\n            }\n            //            else\n            //            {\n            //                log.info(\"Http 执行日志：{}\", JSONObject.toJSONString(requestLog));\n            //            }\n\n        }\n\n        return retrunobj;\n    }\n\n    /**\n     * [简要描述]:参数截取，参数太长超过2000直接用*号代替<br/>\n     * [详细描述]:<br/>\n     *\n     * @param toJsonString :\n     * @return java.lang.String\n     * llxiao  2019/8/8 - 11:43\n     **/\n    private String subParams(String toJsonString)\n    {\n        String params = \"\";\n        if (StringUtils.isNotEmpty(toJsonString))\n        {\n            if (toJsonString.length() > MAX_PARAMS_LENGTH)\n            {\n                params = toJsonString.substring(0, MAX_PARAMS_LENGTH);\n            }\n            else\n            {\n                params = toJsonString;\n            }\n        }\n        return params;\n    }\n\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/log/dto/HttpRequestLog.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.log.dto;\n\nimport lombok.Data;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 请求日志，以此来做请求补偿，请求日志记录等等\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 10:00\n * @since JDK 1.8\n */\n@Data\npublic class HttpRequestLog\n{\n    public static final String REQUEST_LOG = \"HttpRequestLog\";\n\n    /**\n     * 主键ID\n     */\n    private Long id;\n    /**\n     * 请求Url\n     */\n    private String uri;\n    /**\n     * 请求方式\n     */\n    private String method;\n    /**\n     * JSON键值对header\n     */\n    private String header;\n    /**\n     * 请求参数，JSON数据\n     */\n    private String params;\n    /**\n     * 响应参数，JSON数据\n     */\n    private String response;\n    /**\n     * 响应参数需要转换的类型\n     */\n    private String responseType;\n    /**\n     * http状态\n     */\n    private int httpStatus;\n    /**\n     * 请求最终状态\n     */\n    private int status;\n\n    /**\n     * 尝试次数\n     */\n    private int tryNum;\n\n    /**\n     * 整个请求request-JSON串\n     */\n    private String request;\n\n    /**\n     * 错误消息\n     */\n    private String errorMsg;\n\n    /**\n     * 请求时间\n     */\n    private Timestamp requestTime;\n    /**\n     * 响应时间\n     */\n    private Timestamp responseTime;\n\n    private Timestamp createTime;\n    private Timestamp updateTime;\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/log/service/HttpRequestLogService.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.log.service;\n\nimport com.xiao.custom.rest.starter.autoconfigure.log.dto.HttpRequestLog;\n\n/**\n * [简要描述]: http 请求日志记录\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/29 15:33\n * @since JDK 1.8\n */\npublic interface HttpRequestLogService\n{\n    /**\n     * [简要描述]:保存日志信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param requestLog :\n     * llxiao  2019/4/24 - 14:42\n     **/\n    void saveRequestLog(HttpRequestLog requestLog);\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/service/HttpClientService.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.service;\n\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport org.springframework.http.ResponseEntity;\n\n/**\n * [简要描述]: http服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/23 19:53\n * @since JDK 1.8\n */\npublic interface HttpClientService\n{\n    /**\n     * [简要描述]:发起post请求<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request : 请求参数\n     * @return T\n     * llxiao  2019/4/23 - 19:56\n     **/\n    <T> T doForObject(Request request);\n\n    <T> T doRequest(Request request);\n\n    <T> T getForObject(Request request);\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return org.springframework.http.ResponseEntity<T>\n     * llxiao  2019/8/26 - 16:33\n     **/\n    <T> ResponseEntity<T> postFormData(Request request);\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/service/impl/HttpClientAsyncServiceImpl.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport com.xiao.custom.rest.starter.autoconfigure.log.annotation.RequestLog;\nimport com.xiao.custom.rest.starter.autoconfigure.service.HttpClientService;\nimport com.xiao.custom.rest.starter.autoconfigure.util.RequestValidatorParamsUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.ResponseEntity;\n\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\n\n/**\n * [简要描述]: CompletableFuture实现http异步服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 09:25\n * @since JDK 1.8\n */\n@Slf4j\npublic class HttpClientAsyncServiceImpl implements HttpClientService\n{\n    private HttpClientServiceImpl httpClientService;\n\n    public HttpClientAsyncServiceImpl(HttpRetryService retryService)\n    {\n        this.httpClientService = new HttpClientServiceImpl(retryService);\n    }\n\n    /**\n     * [简要描述]: 发起post请求<br/>\n     * [详细描述]: @Retryable默认重试 等待2000ms 3次\n     *\n     * @param request : 请求参数\n     * @return T\n     * llxiao  2019/4/23 - 19:56\n     **/\n    @Override\n    @RequestLog\n    public <T> T doForObject(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        CompletableFuture<T> tCompletableFuture = CompletableFuture\n                .supplyAsync(() -> httpClientService.doForObject(request));\n        return futureResult(tCompletableFuture, request);\n    }\n\n    @Override\n    @RequestLog\n    public <T> T doRequest(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        CompletableFuture<T> tCompletableFuture = CompletableFuture\n                .supplyAsync(() -> httpClientService.doRequest(request));\n        return futureResult(tCompletableFuture, request);\n    }\n\n    /**\n     * [简要描述]: 不进行encode编码的get请求\n     * [详细描述]: 请求参数中的url必须进行手动encode编码\n     *\n     * @param request : 请求参数\n     * @return T\n     * mjye  2019/10/23 - 11:32\n     **/\n    @Override\n    @RequestLog\n    public <T> T getForObject(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        CompletableFuture<T> future = CompletableFuture.supplyAsync(() -> httpClientService.doForObject(request));\n        return futureResult(future, request);\n    }\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return org.springframework.http.ResponseEntity<T>\n     * llxiao  2019/8/26 - 16:33\n     **/\n    @Override\n    @RequestLog\n    public <T> ResponseEntity<T> postFormData(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        CompletableFuture<ResponseEntity<T>> completableFuture = CompletableFuture\n                .supplyAsync(() -> httpClientService.postFormData(request));\n        return futureResult(completableFuture, request);\n    }\n\n    private <T> T futureResult(CompletableFuture<T> tCompletableFuture, Request request)\n    {\n        try\n        {\n            return tCompletableFuture.get();\n        }\n        catch (InterruptedException e)\n        {\n            log.error(\"请求参数：{}\", JSONObject.toJSONString(request));\n            log.error(\"Http异步请求线程中断:\", e);\n        }\n        catch (ExecutionException e)\n        {\n            log.error(\"请求参数：{}\", JSONObject.toJSONString(request));\n            log.error(\"Http异步请求异常:\", e);\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/service/impl/HttpClientServiceImpl.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport com.xiao.custom.rest.starter.autoconfigure.log.annotation.RequestLog;\nimport com.xiao.custom.rest.starter.autoconfigure.service.HttpClientService;\nimport com.xiao.custom.rest.starter.autoconfigure.util.RequestValidatorParamsUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\n\nimport java.util.Map;\n\n/**\n * [简要描述]: http同步阻塞服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 09:25\n * @since JDK 1.8\n */\n@Slf4j\npublic class HttpClientServiceImpl implements HttpClientService\n{\n    private static final String JSON_UTF_8 = \"application/json; charset=UTF-8\";\n\n    private static final String HEADER_ACCEPT = \"Accept\";\n\n    /**\n     * 带重试机制\n     */\n    private HttpRetryService retryService;\n\n    public HttpClientServiceImpl(HttpRetryService retryService)\n    {\n        this.retryService = retryService;\n    }\n\n    /**\n     * [简要描述]: 发起post请求<br/>\n     * [详细描述]: @Retryable默认重试 等待1000ms 3次\n     *\n     * @param request : 请求参数\n     * @return T\n     * llxiao  2019/4/23 - 19:56\n     **/\n    @Override\n    @RequestLog\n    public <T> T doForObject(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        T entity = null;\n        if (null != request)\n        {\n            String uri = request.getUri();\n            Object params = request.getParams();\n            int method = request.getMethod();\n            Class responseType = request.getResponseType();\n            HttpHeaders headers = request.getHeaders();\n            Object uriVariables = request.getUriVariables();\n\n            if (Request.POST == method)\n            {\n                entity = retryService.postForObject(uri, params, responseType, uriVariables);\n            }\n            else if (Request.JSON == method)\n            {\n                if (null == headers)\n                {\n                    headers = new HttpHeaders();\n                }\n                headers.setContentType(MediaType.parseMediaType(JSON_UTF_8));\n                headers.add(HEADER_ACCEPT, MediaType.APPLICATION_JSON.toString());\n                HttpEntity<String> formEntity = new HttpEntity<>(JSONObject.toJSONString(params), headers);\n                entity = retryService.postForObject(uri, formEntity, responseType, uriVariables);\n            }\n            else\n            {\n                log.error(\"当期请求暂不支持的操作，请求参数：{}\", JSONObject.toJSONString(request));\n            }\n        }\n        return entity;\n    }\n\n    /**\n     * [简要描述]:普通HTTP请求<br/>\n     * [详细描述]:喆道对接在使用<br/>\n     *\n     * @param request :\n     * @return T\n     * xiaolinlin  2020/1/16 - 18:38\n     **/\n    @Override\n    @RequestLog\n    public <T> T doRequest(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        return retryService.doRequest(request.getUri(), request.getParams(), request.getResponseType());\n    }\n\n    /**\n     * [简要描述]: 不进行encode编码的get请求\n     * [详细描述]: 请求参数中的url必须进行手动encode编码\n     *\n     * @param request : 请求参数\n     * @return T\n     * mjye  2019/10/23 - 11:32\n     **/\n    @Override\n    @RequestLog\n    public <T> T getForObject(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        return retryService.getForObject(request.getUri(), request.getHeaders(), request.getResponseType());\n    }\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return org.springframework.http.ResponseEntity<T>\n     * llxiao  2019/8/26 - 16:33\n     **/\n    @Override\n    @RequestLog\n    public <T> ResponseEntity<T> postFormData(Request request)\n    {\n        if (RequestValidatorParamsUtil.validateParams(request))\n        {\n            return null;\n        }\n        HttpEntity httpEntity = null;\n        Object params = request.getParams();\n        // 请求参数为httpEntity直接发送请求\n        if (params instanceof HttpEntity)\n        {\n            httpEntity = (HttpEntity) params;\n        }\n        // 需要重新组装 HttpEntity\n        else if (params instanceof MultiValueMap)\n        {\n            MultiValueMap multiValueMap = (MultiValueMap) params;\n            httpEntity = new HttpEntity<>(multiValueMap, request.getHeaders());\n        }\n        else if (params instanceof Map)\n        {\n            Map<String, String> parmasMap = (Map<String, String>) params;\n            MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();\n            for (Map.Entry<String, String> entry : parmasMap.entrySet())\n            {\n                multiValueMap.add(entry.getKey(), entry.getValue());\n            }\n            httpEntity = new HttpEntity<>(multiValueMap, request.getHeaders());\n        }\n        else\n        {\n            log.error(\"当亲请求暂不支持的操作请求，请求数据：{}\", JSONObject.toJSONString(request));\n        }\n        if (null != httpEntity)\n        {\n            return retryService.postFormData(httpEntity, request.getUri(), request.getResponseType());\n        }\n        else\n        {\n            log.error(\"请求异常，无法识别请求数据，请求数据：{}\", JSONObject.toJSONString(request));\n            return null;\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/service/impl/HttpRetryService.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.service.impl;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.retry.annotation.Backoff;\nimport org.springframework.retry.annotation.Retryable;\nimport org.springframework.web.client.RestTemplate;\nimport org.springframework.web.util.UriComponentsBuilder;\n\nimport java.net.SocketTimeoutException;\n\n/**\n * [简要描述]: 重试不能使用接口实现类\n * [详细描述]:\n * 重试机制注解说明（https://blog.csdn.net/u011116672/article/details/77823867）：\n * EnableRetry注解：\n * 能否重试，proxyTargetClass属性为true时（默认false），使用CGLIB代理\n * <p>\n * Retryable注解：注解需要被重试的方法\n * include 指定处理的异常类。默认为空\n * exclude指定不需要处理的异常。默认为空\n * vaue指定要重试的异常。默认为空\n * maxAttempts 最大重试次数。默认3次\n * backoff 重试等待策略。默认使用@Backoff注解\n * <p>\n * Backoff注解：重试回退策略（立即重试还是等待一会再重试）\n * 不设置参数时，默认使用FixedBackOffPolicy，重试等待1000ms\n * 只设置delay()属性时，使用FixedBackOffPolicy，重试等待指定的毫秒数\n * 当设置delay()和maxDealy()属性时，重试等待在这两个值之间均态分布\n * 使用delay()，maxDealy()和multiplier()属性时，使用ExponentialBackOffPolicy\n * 当设置multiplier()属性不等于0时，同时也设置了random()属性时，使用ExponentialRandomBackOffPolicy\n * <p>\n * Recover注解: 用于方法。\n * 用于@Retryable失败时的“兜底”处理方法。 @Recover注释的方法必须要与@Retryable注解的方法“签名”保持一致，第一入参为要重试的异常，其他参数与@Retryable保持一致，返回值也要一样，否则无法执行！\n * <p>\n * CircuitBreaker注解：用于方法，实现熔断模式。\n * include 指定处理的异常类。默认为空\n * exclude指定不需要处理的异常。默认为空\n * vaue指定要重试的异常。默认为空\n * maxAttempts 最大重试次数。默认3次\n * openTimeout 配置熔断器打开的超时时间，默认5s，当超过openTimeout之后熔断器电路变成半打开状态（只要有一次重试成功，则闭合电路）\n * resetTimeout 配置熔断器重新闭合的超时时间，默认20s，超过这个时间断路器关闭\n *\n * @author xiaolinlin\n * @version 1.0, 2020/1/16 17:45\n * @since JDK 1.8\n */\npublic class HttpRetryService\n{\n    private RestTemplate restTemplate;\n\n    public HttpRetryService(RestTemplate restTemplate)\n    {\n        this.restTemplate = restTemplate;\n    }\n\n    /**\n     * [简要描述]:发起post请求<br/>\n     * [详细描述]:<br/>\n     *\n     * @param uri :\n     * @param params :\n     * @param responseType :\n     * @param uriVariables :\n     * @return T\n     * xiaolinlin  2020/1/16 - 18:20\n     **/\n    @Retryable(value = SocketTimeoutException.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))\n    public <T> T postForObject(String uri, Object params, Class responseType, Object uriVariables)\n    {\n        if (StringUtils.isNotBlank(uri) && null != params && null != responseType)\n        {\n            ResponseEntity<T> responseEntity = restTemplate.postForEntity(uri, params, responseType, uriVariables);\n            return null == responseEntity ? null : responseEntity.getBody();\n        }\n        return null;\n    }\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param httpEntity :\n     * @param uri :\n     * @param responseType :\n     * @return org.springframework.http.ResponseEntity<T>\n     * xiaolinlin  2020/1/16 - 18:27\n     **/\n    @Retryable(value = SocketTimeoutException.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))\n    public <T> ResponseEntity<T> postFormData(HttpEntity httpEntity, String uri, Class responseType)\n    {\n        if (null != httpEntity && StringUtils.isNotBlank(uri) && null != responseType)\n        {\n            return restTemplate.postForEntity(uri, httpEntity, responseType);\n        }\n        return null;\n    }\n\n    /**\n     * [简要描述]:不进行encode编码的get请求<br/>\n     * [详细描述]:<br/>\n     *\n     * @param uri :\n     * @param headers :\n     * @param responseType :\n     * @return T\n     * xiaolinlin  2020/1/16 - 18:33\n     **/\n    @Retryable(value = SocketTimeoutException.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))\n    public <T> T getForObject(String uri, HttpHeaders headers, Class responseType)\n    {\n        if (StringUtils.isNotBlank(uri) && null != responseType)\n        {\n            HttpEntity<String> requestEntity = null;\n            if (null != headers)\n            {\n                requestEntity = new HttpEntity<>(null, headers);\n            }\n            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(uri);\n            ResponseEntity<T> resEntity = restTemplate\n                    .exchange(builder.build(true).toUri(), HttpMethod.GET, requestEntity, responseType);\n            return resEntity.getBody();\n        }\n        return null;\n\n    }\n\n    /**\n     * [简要描述]:普通post请求<br/>\n     * [详细描述]:<br/>\n     *\n     * @param uri :\n     * @param params :\n     * @param responseType :\n     * @return T\n     * xiaolinlin  2020/1/16 - 18:37\n     **/\n    @Retryable(value = SocketTimeoutException.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))\n    public <T> T doRequest(String uri, Object params, Class responseType)\n    {\n        if (StringUtils.isNotBlank(uri) && null != params && null != responseType)\n        {\n            return (T) restTemplate.postForObject(uri, params, responseType);\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/util/RequestValidatorParamsUtil.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.util.StringUtils;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/1/16 15:47\n * @since JDK 1.8\n */\n@Slf4j\npublic class RequestValidatorParamsUtil\n{\n    public static boolean validateParams(Request request)\n    {\n        if (null == request || StringUtils.isEmpty(request.getUri()) || null == request.getResponseType())\n        {\n            log.error(\"请求参数不能为空：{}\", null == request ? \"Request is null!\" : JSONObject.toJSONString(request));\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/java/com/xiao/custom/rest/starter/autoconfigure/util/ThreadLocalUtil.java",
    "content": "package com.xiao.custom.rest.starter.autoconfigure.util;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]: ThreadLocalUtil\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 09:25\n * @since JDK 1.8\n */\npublic class ThreadLocalUtil\n{\n    private static final ThreadLocal<Map<String, Object>> context = ThreadLocal.withInitial(() -> new HashMap<>());\n\n    public static Map<String, Object> getThreadLocal()\n    {\n        return context.get();\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal中获取一个线程变量<br/>\n     * [详细描述]:不存在，返回null<br/>\n     *\n     * @param key :\n     * @return java.lang.Object\n     * llxiao  2019/4/24 - 9:43\n     **/\n    public static Object get(String key)\n    {\n        Map<String, Object> map = context.get();\n        if (null != map)\n        {\n            return map.get(key);\n        }\n        return null;\n    }\n\n    /**\n     * [简要描述]:设置一个键值对到ThreadLocal中<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @param value :\n     * llxiao  2019/4/24 - 9:42\n     **/\n    public static void put(String key, Object value)\n    {\n        Map<String, Object> map = context.get();\n        if (null == map)\n        {\n            map = new HashMap<>();\n            context.set(map);\n        }\n        map.put(key, value);\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal的当前线程中删除一个key<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @return void\n     * llxiao  2019/4/24 - 9:41\n     **/\n    public static void remove(String key)\n    {\n        Map<String, Object> map = context.get();\n        if (null != map)\n        {\n            map.remove(key);\n        }\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal中移除当前线程的变量<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/4/24 - 9:41\n     **/\n    public static void remove()\n    {\n        context.remove();\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Autconfigure/src/main/resources/META-INF/spring.factories",
    "content": "org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.xiao.custom.rest.starter.autoconfigure.config.RestTemplateConfiguration"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/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>SpringBoot-Custom-Rest-Starter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringBoot-Custom-Rest-Example</artifactId>\n\n\n    <dependencies>\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>SpringBoot-Custom-Rest-Autconfigure</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${project.artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/main/java/com/xiao/custom/rest/example/RestExampleApp.java",
    "content": "package com.xiao.custom.rest.example;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/1/17 20:03\n * @since JDK 1.8\n */\n@SpringBootApplication\npublic class RestExampleApp\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(RestExampleApp.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/main/java/com/xiao/custom/rest/example/log/impl/HttpLogServiceImpl.java",
    "content": "package com.xiao.custom.rest.example.log.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.rest.starter.autoconfigure.log.dto.HttpRequestLog;\nimport com.xiao.custom.rest.starter.autoconfigure.log.service.HttpRequestLogService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: HTTP 日志处理实现类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:26\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class HttpLogServiceImpl implements HttpRequestLogService\n{\n    /**\n     * [简要描述]:保存日志信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param requestLog :\n     * llxiao  2019/4/24 - 14:42\n     **/\n    @Override\n    public void saveRequestLog(HttpRequestLog requestLog)\n    {\n        log.info(\"Example log : {}\", JSONObject.toJSONString(requestLog));\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/main/resources/application.yml",
    "content": "rest:\n  # okhttp 配置\n  okhttp:\n    enable: false\n    connection-timeout: 12000\n    read-timeout: 30000\n    write-timeout: 12000\n  # http pool\n  pool:\n    enable: true\n    max-total: 20\n    default-max-per-route: 2\n    validate-after-inactivity: 2000\n    connect-timeout: 10000\n    connection-request-timeout: 10000\n    socket-timeout: 10000\n  http:\n    service:\n      sync: true\n      async: false\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n\n    <!-- 控制台Appender -->\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"ERROR\"/>\n    <logger name=\"org.apache.zookeeper\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <!-- 启动的时候一些日志屏蔽 -->\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.jmx.export.annotation.AnnotationMBeanExporter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.mvc\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.web.servlet.FilterRegistrationBean\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.config.sources.URLConfigurationSource\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.ui.freemarker.SpringTemplateLoader\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.context.annotation.AnnotationConfigApplicationContext\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.support.DefaultListableBeanFactory\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter\" level=\"ERROR\"/>\n\n    <logger name=\"com.purcotton.omni.rest.stater\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n\n</configuration>"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/test/java/com/xiao/custom/rest/example/RestTemplateStarterAppTest.java",
    "content": "package com.xiao.custom.rest.example;\n\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:30\n * @since JDK 1.8\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RestTemplateStarterAppTest\n{\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/test/java/com/xiao/custom/rest/example/httpclient/HttpClientTest.java",
    "content": "package com.xiao.custom.rest.example.httpclient;\n\nimport com.xiao.custom.rest.example.RestTemplateStarterAppTest;\nimport com.xiao.custom.rest.starter.autoconfigure.dto.Request;\nimport com.xiao.custom.rest.starter.autoconfigure.service.HttpClientService;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * [简要描述]: HTTP client测试\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:32\n * @since JDK 1.8\n */\npublic class HttpClientTest extends RestTemplateStarterAppTest\n{\n    @Autowired\n    private HttpClientService httpClientService;\n\n    @Test\n    public void testHttpGet()\n    {\n        Request request = new Request();\n        request.setResponseType(String.class);\n        request.setUri(\"http://www.baidu.com\");\n        String forObject = httpClientService.getForObject(request);\n        System.out.println(forObject);\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/SpringBoot-Custom-Rest-Example/src/test/java/com/xiao/custom/rest/example/template/RestTemplateTest.java",
    "content": "package com.xiao.custom.rest.example.template;\n\nimport com.xiao.custom.rest.example.RestTemplateStarterAppTest;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * [简要描述]: resttemplate测试类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:31\n * @since JDK 1.8\n */\npublic class RestTemplateTest extends RestTemplateStarterAppTest\n{\n    @Autowired\n    private RestTemplate restTemplate;\n\n    @Test\n    public void testRest()\n    {\n\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Custom-Rest-Starter/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>pom</packaging>\n    <modules>\n        <module>SpringBoot-Custom-Rest-Autconfigure</module>\n        <module>SpringBoot-Custom-Rest-Example</module>\n    </modules>\n\n    <artifactId>SpringBoot-Custom-Rest-Starter</artifactId>\n\n</project>"
  },
  {
    "path": "SpringBoot-Stock-Demo/doc/bootstrap.sh",
    "content": "#!/bin/bash\n## 加载配置，避免获取不到java_home \nsource /etc/profile\n\nSERVICE_HOME=/home/admin/services\nSERVICE_NAME=omni-basis-service\n\ncd $SERVICE_HOME/$SERVICE_NAME\nPROG=$SERVICE_HOME/$SERVICE_NAME\nPIDFILE=$SERVICE_HOME/$SERVICE_NAME/$SERVICE_NAME.pid  \nJARFILE=$SERVICE_HOME/$SERVICE_NAME/$SERVICE_NAME.jar\n\nSKYWALKING_AGENT=-javaagent:/home/admin/agent/skywalking-agent.jar\nSKYWALKING_SERVCIE_NAME=OMNI-BASIS-SERVICE\n  \nstatus() {  \n    if [ -f $PIDFILE ]; then  \n        PID=$(cat $PIDFILE)  \n        if [ ! -x /proc/${PID} ]; then  \n            return 1  \n        else  \n            return 0  \n        fi  \n    else  \n        return 1  \n    fi  \n}  \n  \ncase \"$1\" in  \n    start)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            echo \"-----$PIDFILE exists, process is already running or crashed\"  \n            exit 1  \n        fi  \n        \n        ##检测 java环境\n        if [ ! -n $JAVA_HOME ]; then\n           echo \"-----Please check JAVA_HOME!\"\n           echo \"-----Exist\"\n           exist 1\n        else\n           echo \"-----Jave home: $JAVA_HOME\"\n           echo \"-----Starting $PROG ...\" \n           #nohup java -server -Xms512m -Xmx512m -jar $JARFILE  > $SERVICE_NAME.log 2>&1 &\n           nohup java -server -Xms512m -Xmx512m $SKYWALKING_AGENT -Dskywalking.agent.service_name=$SKYWALKING_SERVCIE_NAME -jar $JARFILE  > $SERVICE_NAME.log 2>&1 &\n\n           RETVAL=$?\n           if [ $RETVAL -eq 0 ]; then\n               echo \"-----$PROG is started\"\n               echo $! > $PIDFILE\n               exit 0\n           else\n               echo \"-----Stopping $PROG\"\n               rm -f $PIDFILE\n               exit 1\n           fi        \n        fi\n        ;;  \n    stop)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            echo \"-----Shutting down $PROG\"  \n            kill -15 `cat $PIDFILE`  \n            RETVAL=$?  \n            if [ $RETVAL -eq 0 ]; then  \n                rm -f $PIDFILE  \n            else  \n                echo \"-----Failed to stopping $PROG\"  \n            fi  \n        fi  \n        ;;  \n    status)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            PID=$(cat $PIDFILE)  \n            echo \"-----$PROG is running ($PID)\"  \n        else  \n            echo \"-----$PROG is not running\"  \n        fi  \n        ;;  \n    restart)  \n        $0 stop  \n        $0 start  \n        ;;  \n    *)  \n        echo \"Usage: $0 {start|stop|restart|status}\"  \n        ;;  \nesac  \n"
  },
  {
    "path": "SpringBoot-Stock-Demo/doc/stock.sql",
    "content": "CREATE TABLE `t_stock_demo`(\n  `id` bigint(64) NOT NULL AUTO_INCREMENT,\n  `product_no` varchar(64) NULL,\n  `shop_code` varchar(255) NULL,\n  `pre_stock` int(3) DEFAULT 0,\n  `ava_stock` int(3) DEFAULT 0,\n  `total_stock` int(3) DEFAULT 0 ,\n  `update_time` timestamp(0) NULL,\n  PRIMARY KEY (`id`)\n) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;\n\nCREATE TABLE `t_order_demo`(\n  `id` bigint(64) NOT NULL AUTO_INCREMENT,\n  `order_no` varchar(64) NULL,\n  `shop_code` varchar(255) NULL,\n  `product_no` varchar(64) DEFAULT 0,\n  `product_num` int(3) DEFAULT 0 ,\n  `status` int(3) NULL,\n  `update_time` timestamp(0) NULL,\n  PRIMARY KEY (`id`)\n) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;\n\nCREATE TABLE `t_stock_change_log_demo`(\n  `id` bigint(64) NOT NULL AUTO_INCREMENT,\n  `product_no` varchar(64) NULL,\n  `shop_code` varchar(255) NULL,\n\t`order_no`  varchar(255) NULL,\n\t`opt_type` varchar(255) NULL,\n  `pre_stock_after` int(3) DEFAULT 0,\n  `ava_stock_after` int(3) DEFAULT 0,\n  `total_stock_after` int(3) DEFAULT 0 ,\n\t`pre_stock_before` int(3) DEFAULT 0,\n  `ava_stock_before` int(3) DEFAULT 0,\n  `total_stock_before` int(3) DEFAULT 0 ,\n  `update_time` timestamp(0) NULL,\n  PRIMARY KEY (`id`)\n) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jmx",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jmeterTestPlan version=\"1.2\" properties=\"5.0\" jmeter=\"5.1.1 r1855137\">\n  <hashTree>\n    <TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"电商订单库存高并发模拟实操\" enabled=\"true\">\n      <stringProp name=\"TestPlan.comments\"></stringProp>\n      <boolProp name=\"TestPlan.functional_mode\">false</boolProp>\n      <boolProp name=\"TestPlan.tearDown_on_shutdown\">true</boolProp>\n      <boolProp name=\"TestPlan.serialize_threadgroups\">false</boolProp>\n      <elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\" guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n        <collectionProp name=\"Arguments.arguments\"/>\n      </elementProp>\n      <stringProp name=\"TestPlan.user_define_classpath\"></stringProp>\n    </TestPlan>\n    <hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"库存测试\" enabled=\"true\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"循环控制器\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">10</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">5</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">1</stringProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n        <stringProp name=\"TestPlan.comments\">JDBC操作、ifelse、随机数、用户参数、控制器、定时器、循环、计数器、变量、函数等等Jmeter并发操作库存实操，下单、取消单、出库、添加库存等操作并发执行，分布式并发执行。\n问题：jmeter并发执行操作订单(取消、出库)时，订单加redisson分布式锁解决订单重复操作问题\n</stringProp>\n      </ThreadGroup>\n      <hashTree>\n        <ConfigTestElement guiclass=\"HttpDefaultsGui\" testclass=\"ConfigTestElement\" testname=\"本地服务器\" enabled=\"false\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">172.16.80.194</stringProp>\n          <stringProp name=\"HTTPSampler.port\">7878</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\"></stringProp>\n          <stringProp name=\"HTTPSampler.concurrentPool\">6</stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </ConfigTestElement>\n        <hashTree/>\n        <ConfigTestElement guiclass=\"HttpDefaultsGui\" testclass=\"ConfigTestElement\" testname=\"远程服务器\" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">192.168.206.240</stringProp>\n          <stringProp name=\"HTTPSampler.port\">7878</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\"></stringProp>\n          <stringProp name=\"HTTPSampler.concurrentPool\">6</stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </ConfigTestElement>\n        <hashTree/>\n        <JDBCDataSource guiclass=\"TestBeanGUI\" testclass=\"JDBCDataSource\" testname=\"数据库\" enabled=\"true\">\n          <boolProp name=\"autocommit\">true</boolProp>\n          <stringProp name=\"checkQuery\">select 1</stringProp>\n          <stringProp name=\"connectionAge\">5000</stringProp>\n          <stringProp name=\"dataSource\">stockDemo</stringProp>\n          <stringProp name=\"dbUrl\">jdbc:mysql://192.168.206.201:3306/basisdb?useSSL=false&amp;allowMultiQueries=true</stringProp>\n          <stringProp name=\"driver\">com.mysql.jdbc.Driver</stringProp>\n          <stringProp name=\"initQuery\"></stringProp>\n          <boolProp name=\"keepAlive\">true</boolProp>\n          <stringProp name=\"password\">Basisuser123</stringProp>\n          <stringProp name=\"poolMax\">20</stringProp>\n          <stringProp name=\"timeout\">10000</stringProp>\n          <stringProp name=\"transactionIsolation\">DEFAULT</stringProp>\n          <stringProp name=\"trimInterval\">60000</stringProp>\n          <stringProp name=\"username\">basisuser</stringProp>\n        </JDBCDataSource>\n        <hashTree/>\n        <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"店铺编号\" enabled=\"true\">\n          <collectionProp name=\"UserParameters.names\">\n            <stringProp name=\"-345796093\">shopCode</stringProp>\n          </collectionProp>\n          <collectionProp name=\"UserParameters.thread_values\">\n            <collectionProp name=\"442864825\">\n              <stringProp name=\"1507423\">1000</stringProp>\n            </collectionProp>\n          </collectionProp>\n          <boolProp name=\"UserParameters.per_iteration\">false</boolProp>\n        </UserParameters>\n        <hashTree/>\n        <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"预占库存-下单\" enabled=\"true\"/>\n        <hashTree>\n          <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"随机商品编号\" enabled=\"false\">\n            <collectionProp name=\"UserParameters.names\">\n              <stringProp name=\"-1051830512\">productNo</stringProp>\n            </collectionProp>\n            <collectionProp name=\"UserParameters.thread_values\">\n              <collectionProp name=\"1909591592\">\n                <stringProp name=\"-1033350992\">A001001001</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909591556\">\n                <stringProp name=\"-1033350991\">A001001002</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909591520\">\n                <stringProp name=\"-1033350990\">A001001003</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590707\">\n                <stringProp name=\"-1033350989\">A001001004</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590671\">\n                <stringProp name=\"-1033350988\">A001001005</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590635\">\n                <stringProp name=\"-1033350987\">A001001006</stringProp>\n              </collectionProp>\n            </collectionProp>\n            <boolProp name=\"UserParameters.per_iteration\">true</boolProp>\n          </UserParameters>\n          <hashTree/>\n          <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"单个商品编号\" enabled=\"true\">\n            <collectionProp name=\"UserParameters.names\">\n              <stringProp name=\"-1051830512\">productNo</stringProp>\n            </collectionProp>\n            <collectionProp name=\"UserParameters.thread_values\">\n              <collectionProp name=\"1909591592\">\n                <stringProp name=\"-1033350992\">A001001001</stringProp>\n              </collectionProp>\n            </collectionProp>\n            <boolProp name=\"UserParameters.per_iteration\">false</boolProp>\n          </UserParameters>\n          <hashTree/>\n          <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"判断库存不足不进行处理\" enabled=\"false\"/>\n          <hashTree>\n            <JDBCSampler guiclass=\"TestBeanGUI\" testclass=\"JDBCSampler\" testname=\"查询可用库存\" enabled=\"true\">\n              <stringProp name=\"dataSource\">stockDemo</stringProp>\n              <stringProp name=\"queryType\">Select Statement</stringProp>\n              <stringProp name=\"query\">select ava_stock from `t_stock_demo` where shop_code = &apos;${shopCode}&apos; and product_no = &apos;${productNo}&apos;;</stringProp>\n              <stringProp name=\"queryArguments\"></stringProp>\n              <stringProp name=\"queryArgumentsTypes\"></stringProp>\n              <stringProp name=\"variableNames\">avaStock</stringProp>\n              <stringProp name=\"resultVariable\"></stringProp>\n              <stringProp name=\"queryTimeout\"></stringProp>\n              <stringProp name=\"resultSetHandler\">Store as String</stringProp>\n            </JDBCSampler>\n            <hashTree/>\n            <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"如果可用库存不为0\" enabled=\"true\">\n              <stringProp name=\"IfController.condition\">${__jexl3(${avaStock_1}&gt;0 ,)}</stringProp>\n              <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n              <boolProp name=\"IfController.useExpression\">true</boolProp>\n            </IfController>\n            <hashTree>\n              <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"随机库存\" enabled=\"true\">\n                <collectionProp name=\"UserParameters.names\">\n                  <stringProp name=\"109446\">num</stringProp>\n                </collectionProp>\n                <collectionProp name=\"UserParameters.thread_values\">\n                  <collectionProp name=\"85959\">\n                    <stringProp name=\"51\">3</stringProp>\n                  </collectionProp>\n                  <collectionProp name=\"85921\">\n                    <stringProp name=\"50\">2</stringProp>\n                  </collectionProp>\n                  <collectionProp name=\"85997\">\n                    <stringProp name=\"52\">4</stringProp>\n                  </collectionProp>\n                  <collectionProp name=\"85106\">\n                    <stringProp name=\"49\">1</stringProp>\n                  </collectionProp>\n                </collectionProp>\n                <boolProp name=\"UserParameters.per_iteration\">true</boolProp>\n              </UserParameters>\n              <hashTree/>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"预占库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"productNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${productNo}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">productNo</stringProp>\n                    </elementProp>\n                    <elementProp name=\"shopCode\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${shopCode}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">shopCode</stringProp>\n                    </elementProp>\n                    <elementProp name=\"num\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${num}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">num</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/preStock</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree>\n                <BeanShellAssertion guiclass=\"BeanShellAssertionGui\" testclass=\"BeanShellAssertion\" testname=\"BeanShell断言-返回结果是不是大于0-成功\" enabled=\"true\">\n                  <stringProp name=\"TestPlan.comments\">java 操作response as string。\nprev api : https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html\nbeanshell docs: https://jmeter.apache.org/usermanual/component_reference.html#BeanShell_Assertion</stringProp>\n                  <stringProp name=\"BeanShellAssertion.query\">String result = prev.getResponseDataAsString();\n\nif(&quot;0&quot;.equals(result)){\n  Failure = true;\n} \nelse \n{\n  Failure = false;\t\n}\n</stringProp>\n                  <stringProp name=\"BeanShellAssertion.filename\"></stringProp>\n                  <stringProp name=\"BeanShellAssertion.parameters\"></stringProp>\n                  <boolProp name=\"BeanShellAssertion.resetInterpreter\">false</boolProp>\n                </BeanShellAssertion>\n                <hashTree/>\n              </hashTree>\n            </hashTree>\n          </hashTree>\n          <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"普通下单，高并发请求\" enabled=\"true\"/>\n          <hashTree>\n            <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"随机库存\" enabled=\"true\">\n              <collectionProp name=\"UserParameters.names\">\n                <stringProp name=\"109446\">num</stringProp>\n              </collectionProp>\n              <collectionProp name=\"UserParameters.thread_values\">\n                <collectionProp name=\"85959\">\n                  <stringProp name=\"51\">3</stringProp>\n                </collectionProp>\n                <collectionProp name=\"85921\">\n                  <stringProp name=\"50\">2</stringProp>\n                </collectionProp>\n                <collectionProp name=\"85997\">\n                  <stringProp name=\"52\">4</stringProp>\n                </collectionProp>\n                <collectionProp name=\"85106\">\n                  <stringProp name=\"49\">1</stringProp>\n                </collectionProp>\n              </collectionProp>\n              <boolProp name=\"UserParameters.per_iteration\">true</boolProp>\n            </UserParameters>\n            <hashTree/>\n            <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"预占库存\" enabled=\"true\">\n              <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                <collectionProp name=\"Arguments.arguments\">\n                  <elementProp name=\"productNo\" elementType=\"HTTPArgument\">\n                    <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                    <stringProp name=\"Argument.value\">${productNo}</stringProp>\n                    <stringProp name=\"Argument.metadata\">=</stringProp>\n                    <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                    <stringProp name=\"Argument.name\">productNo</stringProp>\n                  </elementProp>\n                  <elementProp name=\"shopCode\" elementType=\"HTTPArgument\">\n                    <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                    <stringProp name=\"Argument.value\">${shopCode}</stringProp>\n                    <stringProp name=\"Argument.metadata\">=</stringProp>\n                    <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                    <stringProp name=\"Argument.name\">shopCode</stringProp>\n                  </elementProp>\n                  <elementProp name=\"num\" elementType=\"HTTPArgument\">\n                    <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                    <stringProp name=\"Argument.value\">${num}</stringProp>\n                    <stringProp name=\"Argument.metadata\">=</stringProp>\n                    <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                    <stringProp name=\"Argument.name\">num</stringProp>\n                  </elementProp>\n                </collectionProp>\n              </elementProp>\n              <stringProp name=\"HTTPSampler.domain\"></stringProp>\n              <stringProp name=\"HTTPSampler.port\"></stringProp>\n              <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n              <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n              <stringProp name=\"HTTPSampler.path\">/stock/preStock</stringProp>\n              <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n              <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n              <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n              <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n              <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n              <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n              <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n              <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n            </HTTPSamplerProxy>\n            <hashTree>\n              <BeanShellAssertion guiclass=\"BeanShellAssertionGui\" testclass=\"BeanShellAssertion\" testname=\"BeanShell断言-返回结果是不是大于0-成功\" enabled=\"true\">\n                <stringProp name=\"TestPlan.comments\">java 操作response as string。\nprev api : https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html\nbeanshell docs: https://jmeter.apache.org/usermanual/component_reference.html#BeanShell_Assertion</stringProp>\n                <stringProp name=\"BeanShellAssertion.query\">String result = prev.getResponseDataAsString();\n\nif(&quot;0&quot;.equals(result)){\n  Failure = true;\n  FailureMessage = &quot;下单失败，库存不足!&quot;;\n} \nelse \n{\n  Failure = false;\t\n}\n</stringProp>\n                <stringProp name=\"BeanShellAssertion.filename\"></stringProp>\n                <stringProp name=\"BeanShellAssertion.parameters\"></stringProp>\n                <boolProp name=\"BeanShellAssertion.resetInterpreter\">false</boolProp>\n              </BeanShellAssertion>\n              <hashTree/>\n            </hashTree>\n          </hashTree>\n        </hashTree>\n        <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"释放库存-取消订单\" enabled=\"true\"/>\n        <hashTree>\n          <JDBCSampler guiclass=\"TestBeanGUI\" testclass=\"JDBCSampler\" testname=\"JDBC查询订单为已确认的总数\" enabled=\"true\">\n            <stringProp name=\"dataSource\">stockDemo</stringProp>\n            <stringProp name=\"queryType\">Select Statement</stringProp>\n            <stringProp name=\"query\">SELECT count(order_no) FROM `t_order_demo` where status = 1;</stringProp>\n            <stringProp name=\"queryArguments\"></stringProp>\n            <stringProp name=\"queryArgumentsTypes\"></stringProp>\n            <stringProp name=\"variableNames\">count</stringProp>\n            <stringProp name=\"resultVariable\"></stringProp>\n            <stringProp name=\"queryTimeout\"></stringProp>\n            <stringProp name=\"resultSetHandler\">Store as String</stringProp>\n          </JDBCSampler>\n          <hashTree/>\n          <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"如果已确认的总数大于0，处理取消订单\" enabled=\"true\">\n            <stringProp name=\"TestPlan.comments\">tools 工具选项使用 jex13 表达式</stringProp>\n            <stringProp name=\"IfController.condition\">${__jexl3(${count_1}&gt;0 ,)}</stringProp>\n            <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n            <boolProp name=\"IfController.useExpression\">true</boolProp>\n          </IfController>\n          <hashTree>\n            <JDBCSampler guiclass=\"TestBeanGUI\" testclass=\"JDBCSampler\" testname=\"JDBC查询所有确认的订单号\" enabled=\"true\">\n              <stringProp name=\"dataSource\">stockDemo</stringProp>\n              <stringProp name=\"query\">SELECT order_no FROM `t_order_demo` where status = 1;\n</stringProp>\n              <stringProp name=\"queryArguments\"></stringProp>\n              <stringProp name=\"queryArgumentsTypes\"></stringProp>\n              <stringProp name=\"queryTimeout\"></stringProp>\n              <stringProp name=\"queryType\">Select Statement</stringProp>\n              <stringProp name=\"resultSetHandler\">Store as String</stringProp>\n              <stringProp name=\"resultVariable\"></stringProp>\n              <stringProp name=\"variableNames\">orderNo</stringProp>\n            </JDBCSampler>\n            <hashTree/>\n            <LoopController guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"循环批量处理取消订单\" enabled=\"false\">\n              <boolProp name=\"LoopController.continue_forever\">true</boolProp>\n              <stringProp name=\"TestPlan.comments\">获取 sql count返回的结果</stringProp>\n              <stringProp name=\"LoopController.loops\">${count_1}</stringProp>\n            </LoopController>\n            <hashTree>\n              <CounterConfig guiclass=\"CounterConfigGui\" testclass=\"CounterConfig\" testname=\"计数器\" enabled=\"true\">\n                <stringProp name=\"CounterConfig.start\">1</stringProp>\n                <stringProp name=\"CounterConfig.end\"></stringProp>\n                <stringProp name=\"CounterConfig.incr\">1</stringProp>\n                <stringProp name=\"CounterConfig.name\">index</stringProp>\n                <stringProp name=\"CounterConfig.format\">0</stringProp>\n                <boolProp name=\"CounterConfig.per_user\">true</boolProp>\n                <stringProp name=\"TestPlan.comments\">从1开始，递增1</stringProp>\n                <boolProp name=\"CounterConfig.reset_on_tg_iteration\">true</boolProp>\n              </CounterConfig>\n              <hashTree/>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"取消订单释放库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_${index})}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/releaseStock</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n            <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"查询结果&gt;1随机取消一个订单\" enabled=\"true\">\n              <stringProp name=\"IfController.condition\">${__jexl3(${count_1}&gt;1 ,)}</stringProp>\n              <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n              <boolProp name=\"IfController.useExpression\">true</boolProp>\n            </IfController>\n            <hashTree>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"取消订单释放库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_${__Random(1,${count_1})})}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/releaseStock</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n            <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"查询结果=1取释放当前订单\" enabled=\"true\">\n              <stringProp name=\"IfController.condition\">${__jexl3(${count_1}==1 ,)}</stringProp>\n              <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n              <boolProp name=\"IfController.useExpression\">true</boolProp>\n            </IfController>\n            <hashTree>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"取消订单释放库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_1)}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/releaseStock</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n          </hashTree>\n        </hashTree>\n        <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"扣减库存-发货出库\" enabled=\"true\"/>\n        <hashTree>\n          <JDBCSampler guiclass=\"TestBeanGUI\" testclass=\"JDBCSampler\" testname=\"JDBC查询订单为已确认的总数\" enabled=\"true\">\n            <stringProp name=\"dataSource\">stockDemo</stringProp>\n            <stringProp name=\"queryType\">Select Statement</stringProp>\n            <stringProp name=\"query\">SELECT count(order_no) FROM `t_order_demo` where status = 1;</stringProp>\n            <stringProp name=\"queryArguments\"></stringProp>\n            <stringProp name=\"queryArgumentsTypes\"></stringProp>\n            <stringProp name=\"variableNames\">count</stringProp>\n            <stringProp name=\"resultVariable\"></stringProp>\n            <stringProp name=\"queryTimeout\"></stringProp>\n            <stringProp name=\"resultSetHandler\">Store as String</stringProp>\n          </JDBCSampler>\n          <hashTree/>\n          <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"如果已确认的总数大于0，处理发货订单\" enabled=\"true\">\n            <stringProp name=\"IfController.condition\">${__jexl3(${count_1}&gt;0 ,)}</stringProp>\n            <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n            <boolProp name=\"IfController.useExpression\">true</boolProp>\n          </IfController>\n          <hashTree>\n            <JDBCSampler guiclass=\"TestBeanGUI\" testclass=\"JDBCSampler\" testname=\"JDBC查询所有确认的订单号\" enabled=\"true\">\n              <stringProp name=\"dataSource\">stockDemo</stringProp>\n              <stringProp name=\"query\">SELECT order_no FROM `t_order_demo` where status = 1;\n</stringProp>\n              <stringProp name=\"queryArguments\"></stringProp>\n              <stringProp name=\"queryArgumentsTypes\"></stringProp>\n              <stringProp name=\"queryTimeout\"></stringProp>\n              <stringProp name=\"queryType\">Select Statement</stringProp>\n              <stringProp name=\"resultSetHandler\">Store as String</stringProp>\n              <stringProp name=\"resultVariable\"></stringProp>\n              <stringProp name=\"variableNames\">orderNo</stringProp>\n            </JDBCSampler>\n            <hashTree/>\n            <LoopController guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"循环批量处理订单出库\" enabled=\"false\">\n              <boolProp name=\"LoopController.continue_forever\">true</boolProp>\n              <stringProp name=\"TestPlan.comments\">获取 sql count返回的结果</stringProp>\n              <stringProp name=\"LoopController.loops\">${count_1}</stringProp>\n            </LoopController>\n            <hashTree>\n              <CounterConfig guiclass=\"CounterConfigGui\" testclass=\"CounterConfig\" testname=\"计数器\" enabled=\"true\">\n                <stringProp name=\"CounterConfig.start\">1</stringProp>\n                <stringProp name=\"CounterConfig.end\"></stringProp>\n                <stringProp name=\"CounterConfig.incr\">1</stringProp>\n                <stringProp name=\"CounterConfig.name\">index</stringProp>\n                <stringProp name=\"CounterConfig.format\">0</stringProp>\n                <boolProp name=\"CounterConfig.per_user\">true</boolProp>\n                <stringProp name=\"TestPlan.comments\">从1开始，递增1</stringProp>\n                <boolProp name=\"CounterConfig.reset_on_tg_iteration\">true</boolProp>\n              </CounterConfig>\n              <hashTree/>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"订单出库减库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_${index})}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/releaseStock</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n            <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"查询结果&gt;1随机处理一个订单出库完成\" enabled=\"true\">\n              <stringProp name=\"IfController.condition\">${__jexl3(${count_1}&gt;1 ,)}</stringProp>\n              <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n              <boolProp name=\"IfController.useExpression\">true</boolProp>\n            </IfController>\n            <hashTree>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"订单出库减库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_${__Random(1,${count_1})})}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/warehouse</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n            <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"查询结果=取当前订单出库完成\" enabled=\"true\">\n              <stringProp name=\"IfController.condition\">${__jexl3(${count_1}==1 ,)}</stringProp>\n              <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n              <boolProp name=\"IfController.useExpression\">true</boolProp>\n            </IfController>\n            <hashTree>\n              <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"订单出库减库存\" enabled=\"true\">\n                <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n                  <collectionProp name=\"Arguments.arguments\">\n                    <elementProp name=\"orderNo\" elementType=\"HTTPArgument\">\n                      <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                      <stringProp name=\"Argument.value\">${__V(orderNo_1)}</stringProp>\n                      <stringProp name=\"Argument.metadata\">=</stringProp>\n                      <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                      <stringProp name=\"Argument.name\">orderNo</stringProp>\n                    </elementProp>\n                  </collectionProp>\n                </elementProp>\n                <stringProp name=\"HTTPSampler.domain\"></stringProp>\n                <stringProp name=\"HTTPSampler.port\"></stringProp>\n                <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n                <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n                <stringProp name=\"HTTPSampler.path\">/stock/warehouse</stringProp>\n                <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n                <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n                <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n                <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n                <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n                <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n                <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n                <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n              </HTTPSamplerProxy>\n              <hashTree/>\n            </hashTree>\n          </hashTree>\n        </hashTree>\n        <OnceOnlyController guiclass=\"OnceOnlyControllerGui\" testclass=\"OnceOnlyController\" testname=\"添加库存-同步库存\" enabled=\"true\">\n          <stringProp name=\"TestPlan.comments\">定时任务，每10分钟执行一次加库存操作</stringProp>\n        </OnceOnlyController>\n        <hashTree>\n          <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"随机商品编号\" enabled=\"false\">\n            <collectionProp name=\"UserParameters.names\">\n              <stringProp name=\"-1051830512\">productNo</stringProp>\n            </collectionProp>\n            <collectionProp name=\"UserParameters.thread_values\">\n              <collectionProp name=\"1909591592\">\n                <stringProp name=\"-1033350992\">A001001001</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909591556\">\n                <stringProp name=\"-1033350991\">A001001002</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909591520\">\n                <stringProp name=\"-1033350990\">A001001003</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590707\">\n                <stringProp name=\"-1033350989\">A001001004</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590671\">\n                <stringProp name=\"-1033350988\">A001001005</stringProp>\n              </collectionProp>\n              <collectionProp name=\"1909590635\">\n                <stringProp name=\"-1033350987\">A001001006</stringProp>\n              </collectionProp>\n            </collectionProp>\n            <boolProp name=\"UserParameters.per_iteration\">true</boolProp>\n          </UserParameters>\n          <hashTree/>\n          <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"单个商品编号\" enabled=\"true\">\n            <collectionProp name=\"UserParameters.names\">\n              <stringProp name=\"-1051830512\">productNo</stringProp>\n            </collectionProp>\n            <collectionProp name=\"UserParameters.thread_values\">\n              <collectionProp name=\"1909591592\">\n                <stringProp name=\"-1033350992\">A001001001</stringProp>\n              </collectionProp>\n            </collectionProp>\n            <boolProp name=\"UserParameters.per_iteration\">false</boolProp>\n          </UserParameters>\n          <hashTree/>\n          <UserParameters guiclass=\"UserParametersGui\" testclass=\"UserParameters\" testname=\"随机添加库存\" enabled=\"true\">\n            <collectionProp name=\"UserParameters.names\">\n              <stringProp name=\"109446\">num</stringProp>\n            </collectionProp>\n            <collectionProp name=\"UserParameters.thread_values\">\n              <collectionProp name=\"85106\">\n                <stringProp name=\"49\">1</stringProp>\n              </collectionProp>\n              <collectionProp name=\"85921\">\n                <stringProp name=\"50\">2</stringProp>\n              </collectionProp>\n              <collectionProp name=\"85959\">\n                <stringProp name=\"51\">3</stringProp>\n              </collectionProp>\n            </collectionProp>\n            <boolProp name=\"UserParameters.per_iteration\">true</boolProp>\n          </UserParameters>\n          <hashTree/>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"添加库存\" enabled=\"true\">\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"shopCode\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">${shopCode}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                  <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                  <stringProp name=\"Argument.name\">shopCode</stringProp>\n                </elementProp>\n                <elementProp name=\"num\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">${num}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                  <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                  <stringProp name=\"Argument.name\">num</stringProp>\n                </elementProp>\n                <elementProp name=\"productNo\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">${productNo}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                  <boolProp name=\"HTTPArgument.use_equals\">true</boolProp>\n                  <stringProp name=\"Argument.name\">productNo</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">/stock/addStock</stringProp>\n            <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ConstantTimer guiclass=\"ConstantTimerGui\" testclass=\"ConstantTimer\" testname=\"每30S执行一次加库存动作-固定定时器\" enabled=\"false\">\n              <stringProp name=\"ConstantTimer.delay\">30000</stringProp>\n            </ConstantTimer>\n            <hashTree/>\n          </hashTree>\n        </hashTree>\n        <ResultCollector guiclass=\"ViewResultsFullVisualizer\" testclass=\"ResultCollector\" testname=\"察看结果树\" enabled=\"false\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n        <ResultCollector guiclass=\"StatVisualizer\" testclass=\"ResultCollector\" testname=\"聚合报告\" enabled=\"true\">\n          <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n          <objProp>\n            <name>saveConfig</name>\n            <value class=\"SampleSaveConfiguration\">\n              <time>true</time>\n              <latency>true</latency>\n              <timestamp>true</timestamp>\n              <success>true</success>\n              <label>true</label>\n              <code>true</code>\n              <message>true</message>\n              <threadName>true</threadName>\n              <dataType>true</dataType>\n              <encoding>false</encoding>\n              <assertions>true</assertions>\n              <subresults>true</subresults>\n              <responseData>false</responseData>\n              <samplerData>false</samplerData>\n              <xml>false</xml>\n              <fieldNames>true</fieldNames>\n              <responseHeaders>false</responseHeaders>\n              <requestHeaders>false</requestHeaders>\n              <responseDataOnError>false</responseDataOnError>\n              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n              <assertionsResultsToSave>0</assertionsResultsToSave>\n              <bytes>true</bytes>\n              <sentBytes>true</sentBytes>\n              <url>true</url>\n              <threadCounts>true</threadCounts>\n              <idleTime>true</idleTime>\n              <connectTime>true</connectTime>\n            </value>\n          </objProp>\n          <stringProp name=\"filename\"></stringProp>\n        </ResultCollector>\n        <hashTree/>\n      </hashTree>\n    </hashTree>\n  </hashTree>\n</jmeterTestPlan>\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/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.purcotton.stock.demo</groupId>\n    <artifactId>stock-demo</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <spring-cloud.version>Dalston.RC1</spring-cloud.version>\n        <github.pagehelper>5.1.2</github.pagehelper>\n        <fstseriazle.version>2.04</fstseriazle.version>\n        <redission.version>3.11.4</redission.version>\n        <hutool.version>4.6.8</hutool.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.zaxxer</groupId>\n            <artifactId>HikariCP</artifactId>\n            <version>3.3.1</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n            <version>1.3.1</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper-spring-boot-starter</artifactId>\n            <version>1.2.5</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.1.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.18.4</version>\n            <scope>provided</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-collections4</artifactId>\n            <version>4.1</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.6</version>\n        </dependency>\n\n        <!-- for Redisson 3.x -->\n        <dependency>\n            <groupId>org.redisson</groupId>\n            <artifactId>redisson</artifactId>\n            <version>${redission.version}</version>\n        </dependency>\n\n        <!--工具类 -->\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>${hutool.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-captcha</artifactId>\n            <version>${hutool.version}</version>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <build>\n        <finalName>stock-demo</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringBoot-Stock-Demo/readme.md",
    "content": "**Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)**<br>\n涉及知识点：<br>\n   > java+springboot+mybatis开发<br>\n   > redis分布式锁+Redisson客户端<br>\n   > Jmeter各种骚操作：用户变量、随机取值、jdbc操作、if else操作、循环、控制器、beanshell断言等等<br> \n1. 环境工具：<br>\n   idea、jmeter<br>\n   jdk1.8、maven、mysql、redis<br>\n   三台服务器：两个4C16G服务节点+一个台nginx(淘宝的tengine-2.3.0)节点<br>\n2. 思路概要：<br>\n   >(1) 主要提供四个接口：下单、取消、出库、添加库存，四种操作在操作库存表t_stock_demo行的时候都需要添加Redis的锁，使用：``Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);``<br>\n   >(2) 另外取消和出库，因为是用Jmeter直接查询数据库获取可用的订单数量，为防止统一订单重复操作在RestSevice层使用订单号orderNo做了一层Redis分布式锁，订单已在操作直接返回结果。<br>\n   >(3) 使用jmeter的jdbc操作+函数、随机数获取已确认的订单结合if控制器判断结果，进行取消和出库操作<br>\n   >(4) 划重点：使用分布式锁和本地事物，一定要**先提交事物再释放锁、先提交事物再放锁、先提交事物再放锁**<br>\n3. SQL、jmeter脚本、jar包启动脚本请到[doc](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringBoot-Stock-Demo/doc)目录查看。\n4. 操作指南：\n   >(1) git clone https://github.com/Xlinlin/SpringCloud-Demo   <br>\n   >(2) cd SpringCloud-Demo/SpringBoot-Stock-Demo  <br>\n   >(3) 配置数据mysql和redis配置，application.yml文件，(自行准备mysql、redis环境) <br>\n   >(4) mvn install <br>\n   >(5) 拷贝stock_demo.jar和doc/bootstrap.sh到 linux服务器(自行准备java环境)上 <br>\n   >(6) 适当修改bootstrap.sh脚本目录，保持与springboot包在同一目录，直接执行脚本：``./bootstrap start`` <br>\n   >(7) 查看进程、端口是否启动：``jps 或 ps -ef|grep stock_demo 或 lsof -i:7878``<br>\n   >(8) 配好nginx跳转\n   >(9) 下载[jmeter](http://jmeter.apache.org/download_jmeter.cgi) ,解压进入jmeter目录，双击：ApacheJMeter<br>\n   >(10) 文件->打开->找到doc下的[.jmx](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jmx)文件，大概的画面：<br>\n   ![](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jpg?raw=true)<br>\n   >(11) 修改远程服务器地址信息为你的nginx服务<br>\n   >(12) 修改你的数据地址，此处需要将mysql的驱动jar包引入jmeter/lib目录下<br>\n   >(13) 线程、参数、请求调整好后，然后点击启动(Ctrl+R)<br>\n   部分截图：\n   >(14) 后台日志![](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/sever_console_log.jpg?raw=true)\n   >(15) 库存表![](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_query.jpg?raw=true)\n   >(16) 订单表![](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/order_query.jpg?raw=true)\n5. 遗留一个业务问题：<br>\n   总库存(Total) = 可用库存(Ava) + 预占库存(Prev)<br>\n   A:下单：T   A-  P+ <br>\n   B:取消：T   A+  P- <br>\n   C:出库：T-  A   P- <br>\n   D:同步库存+：T+ A+ P <br>\n   E:同步库存-：T- A- P <br>\n   如果仅仅只是 A+B 或者 A+C 或A B C并发跑能保证 T=P+A <br>\n   但是 A+C +D +E 并发跑，就一定会出现 打破这个 T=P+A的平衡，这个要业务逻辑要怎么处理？有大佬解答？<br>"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/StockDemoApplication.java",
    "content": "package com.xiao.stock.demo;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;\n\n/**\n * [简要描述]: 库存扣减测试\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 09:23\n * @since JDK 1.8\n */\n@SpringBootApplication(scanBasePackages = \"com.purcotton.stock.demo\", exclude = DataSourceAutoConfiguration.class)\n@MapperScan(\"com.purcotton.stock.demo.mapper\")\npublic class StockDemoApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(StockDemoApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/common/StockOptTypeEnum.java",
    "content": "package com.xiao.stock.demo.common;\n\n/**\n * [简要描述]: 库存操作记录\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 15:13\n * @since JDK 1.8\n */\npublic enum StockOptTypeEnum\n{\n    LOCK_STOCK(\"LOCK_STOCK\", \"预占锁库存\"),\n    RELEASE_STOCK(\"RELEASE_STOCK\", \"释放预占库存\"),\n    OUT_WAREHOUSE_STOCK(\"OUT_WAREHOUSE_STOCK\", \"订单出库\"),\n    ADD_STOCK(\"ADD_STOCK\",\"添加库存\");\n\n    private String optType;\n    private String optName;\n\n    StockOptTypeEnum(String optType, String optName)\n    {\n        this.optType = optType;\n        this.optName = optName;\n    }\n\n    public String getOptType()\n    {\n        return optType;\n    }\n\n    public String getOptName()\n    {\n        return optName;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/configure/DataSourceConfiguration.java",
    "content": "package com.xiao.stock.demo.configure;\n\nimport com.zaxxer.hikari.HikariDataSource;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport javax.sql.DataSource;\n\n@Configuration\npublic class DataSourceConfiguration\n{\n\n    @Value(value = \"${hikari-jdbc-url}\")\n    private String hikariJdbcUrl = \"\";\n    @Value(value = \"${hikari-jdbc-password}\")\n    private String hikariJdbcPassword;\n    @Value(value = \"${hikari-jdbc-username}\")\n    private String hikariJdbcUsername;\n    @Value(value = \"${hikari-jdbc-driver-class-name}\")\n    private String hikariJdbcDriverClassName;\n    @Value(value = \"${hikari-jdbc-pool-size}\")\n    private int hikariJdbcPoolSize;\n\n    // Hikari 连接池\n    @Bean(name = \"dataSource\")\n    public DataSource dataSource()\n    {\n        HikariDataSource ds = new HikariDataSource();\n        ds.setJdbcUrl(hikariJdbcUrl);\n        ds.setUsername(hikariJdbcUsername);\n        ds.setPassword(hikariJdbcPassword);\n        ds.setDriverClassName(hikariJdbcDriverClassName);\n        ds.setMaximumPoolSize(hikariJdbcPoolSize);\n        ds.setConnectionInitSql(\"set names utf8mb4;\");\n        return ds;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/configure/RedissonConfiguration.java",
    "content": "package com.xiao.stock.demo.configure;\n\nimport org.redisson.Redisson;\nimport org.redisson.api.RedissonClient;\nimport org.redisson.config.Config;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 10:49\n * @since JDK 1.8\n */\n@Configuration\npublic class RedissonConfiguration\n{\n    @Value(\"${redisson.host}\")\n    private String redisHost;\n    @Value(\"${redisson.password}\")\n    private String password;\n\n    @Value(\"${thread.pool.core.size:50}\")\n    private int coreSize;\n    @Value(\"${thread.pool.max.size:100}\")\n    private int maxSize;\n    @Value(\"${thread.pool.queue.capacity:10000}\")\n    private int queueCapacity;\n\n    @Bean\n    public Config config()\n    {\n        Config config = new Config();\n        config.useSingleServer().setAddress(redisHost);\n        config.useSingleServer().setPassword(password);\n        return config;\n    }\n\n    @Bean\n    public RedissonClient redissonClient(Config config)\n    {\n        return Redisson.create(config);\n    }\n\n    @Bean\n    public ThreadPoolTaskExecutor threadPoolTaskExecutor()\n    {\n        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();\n        threadPoolTaskExecutor.setCorePoolSize(coreSize);\n        threadPoolTaskExecutor.setMaxPoolSize(maxSize);\n        threadPoolTaskExecutor.setQueueCapacity(queueCapacity);\n        threadPoolTaskExecutor.setKeepAliveSeconds(60);\n        threadPoolTaskExecutor.setThreadNamePrefix(\"Stock-Demo-\");\n        return threadPoolTaskExecutor;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/entity/OrderDemo.java",
    "content": "package com.xiao.stock.demo.entity;\n\nimport lombok.*;\n\nimport java.util.Date;\n\n/**\n * t_order_demo\n * Created by Mybatis Generator on 2019/10/19\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@ToString\npublic class OrderDemo\n{\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.id\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private Long id;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.order_no\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private String orderNo;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.shop_code\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private String shopCode;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.product_no\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private String productNo;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.product_num\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private Integer productNum;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_order_demo.update_time\n     *\n     * @mbggenerated Sat Oct 19 09:17:42 CST 2019\n     */\n    private Date updateTime;\n\n    private Integer status;\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/entity/StockChangeLodDemo.java",
    "content": "package com.xiao.stock.demo.entity;\n\nimport lombok.*;\n\nimport java.util.Date;\n\n/**\n * t_stock_change_log_demo\n * Created by Mybatis Generator on 2019/10/17\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@ToString\npublic class StockChangeLodDemo\n{\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.id\n     */\n    private Long id;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.product_no\n     */\n    private String productNo;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.shop_code\n     */\n    private String shopCode;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.order_no\n     */\n    private String orderNo;\n\n    /**\n     * 操作类型\n     */\n    private String optType;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.pre_stock_after\n     */\n    private Integer preStockAfter;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.ava_stock_after\n     */\n    private Integer avaStockAfter;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.total_stock_after\n     */\n    private Integer totalStockAfter;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.pre_stock_before\n     */\n    private Integer preStockBefore;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.ava_stock_before\n     */\n    private Integer avaStockBefore;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.total_stock_before\n     */\n    private Integer totalStockBefore;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_change_log_demo.update_time\n     */\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/entity/StockDemo.java",
    "content": "package com.xiao.stock.demo.entity;\n\nimport lombok.*;\n\nimport java.util.Date;\n\n/**\n * t_stock_demo\n * Created by Mybatis Generator on 2019/10/17\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@ToString\npublic class StockDemo\n{\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.id\n     */\n    private Long id;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.product_no\n     */\n    private String productNo;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.shop_code\n     */\n    private String shopCode;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.pre_stock\n     */\n    private Integer preStock;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.ava_stock\n     */\n    private Integer avaStock;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.total_stock\n     */\n    private Integer totalStock;\n\n    /**\n     * This field was generated by MyBatis Generator.\n     * This field corresponds to the database column t_stock_demo.update_time\n     */\n    private Date updateTime;\n\n    /**\n     * 订单号\n     */\n    private String orderNo;\n\n    /**\n     * 商品数量\n     */\n    private int productNum;\n\n    /**\n     * 更新预占库存\n     */\n    private Integer newPreStock;\n    /**\n     * 更新可用库存\n     */\n    private Integer newAvaStock;\n    /**\n     * 更新总库存\n     */\n    private Integer newTotalStock;\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/mapper/OrderDemoMapper.java",
    "content": "package com.xiao.stock.demo.mapper;\n\nimport com.xiao.stock.demo.entity.OrderDemo;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2019/10/19\n */\npublic interface OrderDemoMapper\n{\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    int deleteByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    int insert(OrderDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    int insertSelective(OrderDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    OrderDemo selectByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    int updateByPrimaryKeySelective(OrderDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_order_demo\n     */\n    int updateByPrimaryKey(OrderDemo record);\n\n    // 获取订单信息\n    OrderDemo getOrderByNo(String orderNo);\n\n    // 取消订单\n    int updateByOrderNo(@Param(\"orderNo\") String orderNo, @Param(\"status\") int status);\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/mapper/StockChangeLodDemoMapper.java",
    "content": "package com.xiao.stock.demo.mapper;\n\nimport com.xiao.stock.demo.entity.StockChangeLodDemo;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2019/10/17\n */\npublic interface StockChangeLodDemoMapper\n{\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    int deleteByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    int insert(StockChangeLodDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    int insertSelective(StockChangeLodDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    StockChangeLodDemo selectByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    int updateByPrimaryKeySelective(StockChangeLodDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_change_log_demo\n     */\n    int updateByPrimaryKey(StockChangeLodDemo record);\n\n    /**\n     * 订单、商品、操作类型查询库存记录\n     *\n     * @param orderNo\n     * @param productNo\n     * @param optType\n     * @return\n     */\n    StockChangeLodDemo selectByOrderNo(@Param(\"orderNo\") String orderNo, @Param(\"productNo\") String productNo,\n            @Param(\"optType\") String optType);\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/mapper/StockDemoMapper.java",
    "content": "package com.xiao.stock.demo.mapper;\n\nimport com.xiao.stock.demo.entity.StockDemo;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2019/10/17\n */\npublic interface StockDemoMapper\n{\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    int deleteByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    int insert(StockDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    int insertSelective(StockDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    StockDemo selectByPrimaryKey(Long id);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    int updateByPrimaryKeySelective(StockDemo record);\n\n    /**\n     * This method was generated by MyBatis Generator.\n     * This method corresponds to the database table t_stock_demo\n     */\n    int updateByPrimaryKey(StockDemo record);\n\n    /**\n     * [简要描述]:商品店铺查询库存数据<br/>\n     * [详细描述]:<br/>\n      * @param productNo :\n     * @param shopCode :\n     * @param random :\n     * @return\n     * llxiao  2019/10/18 - 14:39\n     **/\n    StockDemo queryByProduct(@Param(\"productNo\") String productNo, @Param(\"shopCode\") String shopCode,\n            @Param(\"random\") int random);\n\n    /**\n     * 预占库存<br>\n     *\n     * @param tempStock\n     * @return\n     */\n    int preStock(StockDemo tempStock);\n}"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/rest/StockRestService.java",
    "content": "package com.xiao.stock.demo.rest;\n\nimport com.xiao.stock.demo.common.StockOptTypeEnum;\nimport com.xiao.stock.demo.entity.OrderDemo;\nimport com.xiao.stock.demo.entity.StockDemo;\nimport com.xiao.stock.demo.service.StockDemoService;\nimport com.xiao.stock.demo.util.OrderNoUtil;\nimport com.xiao.stock.demo.util.StockUtil;\nimport org.redisson.api.RLock;\nimport org.redisson.api.RedissonClient;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]: 库存接口服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 17:28\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/stock\")\npublic class StockRestService\n{\n    @Autowired\n    private StockDemoService stockDemoService;\n\n    @Autowired\n    private OrderNoUtil orderNoUtil;\n\n    @Autowired\n    private RedissonClient redissonClient;\n\n    /**\n     * 预占库存\n     *\n     * @param productNo\n     * @param shopCode\n     * @param num 下单数量\n     * @return\n     */\n    @RequestMapping(\"/preStock\")\n    public int preStock(@RequestParam(\"productNo\") String productNo, @RequestParam(\"shopCode\") String shopCode,\n            @RequestParam(value = \"num\", required = false) int num)\n    {\n        return optStock(productNo, shopCode, num, StockOptTypeEnum.LOCK_STOCK, orderNoUtil.buildOrderNo());\n    }\n\n    /**\n     * 取消释放库存，实际释放的应该是订单明细商品的数量\n     *\n     * @param orderNo: 订单编号\n     * @return\n     */\n    @RequestMapping(\"/releaseStock\")\n    public int releaseStock(@RequestParam(\"orderNo\") String orderNo)\n    {\n        RLock fairLock = redissonClient.getFairLock(StockUtil.getOrderLockPath(orderNo));\n        try\n        {\n            // 并发防止重复处理订单\n            if (fairLock.tryLock())\n            {\n                OrderDemo orderDemo = stockDemoService.getOrderByNo(orderNo);\n                return optStock(orderDemo.getProductNo(), orderDemo.getShopCode(), orderDemo\n                        .getProductNum(), StockOptTypeEnum.RELEASE_STOCK, orderNo);\n            }\n        }\n        finally\n        {\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    /**\n     * 出库，实际应该是订单明细里面的数据<br>\n     * 仓库发货回写应该是具体的订单明细的商品数据和数量<br>\n     *\n     * @param orderNo: 订单编号\n     * @return\n     */\n    @RequestMapping(\"/warehouse\")\n    public int warehouse(@RequestParam(\"orderNo\") String orderNo)\n    {\n        RLock fairLock = redissonClient.getFairLock(StockUtil.getOrderLockPath(orderNo));\n        try\n        {\n            if (fairLock.tryLock())\n            {\n                OrderDemo orderDemo = stockDemoService.getOrderByNo(orderNo);\n                return optStock(orderDemo.getProductNo(), orderDemo.getShopCode(), orderDemo\n                        .getProductNum(), StockOptTypeEnum.OUT_WAREHOUSE_STOCK, orderNo);\n            }\n        }\n        finally\n        {\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    @RequestMapping(\"/addStock\")\n    public int addStock(@RequestParam(\"productNo\") String productNo, @RequestParam(\"shopCode\") String shopCode,\n            @RequestParam(value = \"num\", required = false) int num)\n    {\n        return optStock(productNo, shopCode, num, StockOptTypeEnum.ADD_STOCK, orderNoUtil.buildOrderNo());\n    }\n\n    /**\n     * 库存操作\n     *\n     * @param productNo\n     * @param shopCode\n     * @param num 下单数量\n     * @return\n     */\n    public int optStock(String productNo, String shopCode, int num, StockOptTypeEnum stockOptTypeEnum, String orderNo)\n    {\n        StockDemo stockDemo = new StockDemo();\n        stockDemo.setShopCode(shopCode);\n        stockDemo.setProductNo(productNo);\n        stockDemo.setProductNum(num);\n        stockDemo.setOrderNo(orderNo);\n\n        Long result = 0L;\n        switch (stockOptTypeEnum)\n        {\n            case LOCK_STOCK:\n                result = stockDemoService.preStock(stockDemo);\n                break;\n            case RELEASE_STOCK:\n                result = stockDemoService.releaseStock(stockDemo);\n                break;\n            case OUT_WAREHOUSE_STOCK:\n                result = stockDemoService.outHourse(stockDemo);\n                break;\n            case ADD_STOCK:\n                result = stockDemoService.addStock(stockDemo);\n                break;\n            default:\n                break;\n        }\n        return result.intValue();\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/service/StockDemoService.java",
    "content": "package com.xiao.stock.demo.service;\n\nimport com.xiao.stock.demo.entity.OrderDemo;\nimport com.xiao.stock.demo.entity.StockDemo;\n\n/**\n * [简要描述]: 库存操作服务\n * [详细描述]:\n * 1.使用redis 分布式锁\n * 2.\n * 3.使用分布式锁，必须要先提交事务在释放锁，否则下一个锁拿到的数据就是上一次未提交的数据\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 09:33\n * @since JDK 1.8\n */\npublic interface StockDemoService\n{\n    /**\n     * 预占库存\n     *\n     * @param stockDemo\n     * @return\n     */\n    long preStock(StockDemo stockDemo);\n\n    /**\n     * 释放库存\n     *\n     * @param stockDemo\n     * @return\n     */\n    long releaseStock(StockDemo stockDemo);\n\n    /**\n     * 出库\n     *\n     * @param stockDemo\n     * @return\n     */\n    long outHourse(StockDemo stockDemo);\n\n    /**\n     * [简要描述]:添加总库存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param stockDemo :\n     * @return long\n     * llxiao  2019/10/19 - 8:41\n     **/\n    long addStock(StockDemo stockDemo);\n\n    /**\n     * 获取订单信息\n     * @param orderNo\n     * @return\n     */\n    OrderDemo getOrderByNo(String orderNo);\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/service/impl/StockDemoServiceImpl.java",
    "content": "package com.xiao.stock.demo.service.impl;/**\n * [简要描述]:\n * [详细描述]:\n *\n * @since JDK 1.8\n */\n\nimport com.xiao.stock.demo.common.StockOptTypeEnum;\nimport com.xiao.stock.demo.entity.OrderDemo;\nimport com.xiao.stock.demo.entity.StockChangeLodDemo;\nimport com.xiao.stock.demo.entity.StockDemo;\nimport com.xiao.stock.demo.mapper.OrderDemoMapper;\nimport com.xiao.stock.demo.mapper.StockChangeLodDemoMapper;\nimport com.xiao.stock.demo.mapper.StockDemoMapper;\nimport com.xiao.stock.demo.service.StockDemoService;\nimport com.xiao.stock.demo.util.StockUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.redisson.api.RLock;\nimport org.redisson.api.RedissonClient;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Propagation;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SecureRandom;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 10:45\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class StockDemoServiceImpl implements StockDemoService\n{\n    @Autowired\n    private RedissonClient redissonClient;\n\n    @Autowired\n    private StockDemoMapper stockDemoMapper;\n\n    @Autowired\n    private StockChangeLodDemoMapper stockChangeLodDemoMapper;\n\n    @Autowired\n    private OrderDemoMapper orderDemoMapper;\n\n    /**\n     * 下单预占库存\n     *\n     * @param stockDemo\n     * @return\n     */\n    @Override\n    public long preStock(StockDemo stockDemo)\n    {\n        if (checkStock(stockDemo, StockOptTypeEnum.LOCK_STOCK.getOptType()))\n        {\n            return 0;\n        }\n\n        String productNo = stockDemo.getProductNo();\n        String shopCode = stockDemo.getShopCode();\n\n        SecureRandom secureRandom = null;\n        try\n        {\n            secureRandom = SecureRandom.getInstance(\"SHA1PRNG\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            e.printStackTrace();\n        }\n\n        // 公平锁\n        final RLock fairLock = redissonClient.getFairLock(StockUtil.getLockPath(productNo, shopCode));\n        // 异步 尝试加锁，最多等待50秒，上锁以后10秒自动解锁\n        Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);\n\n        try\n        {\n            //final boolean lock = fairLock.tryLock(50, 10, TimeUnit.SECONDS);\n            if (res.get())\n            {\n                //System.out.println(Thread.currentThread().getName() + \"Redis获得锁。。。\" + System.currentTimeMillis());\n                // 校验\n                StockDemo stock = stockDemoMapper\n                        .queryByProduct(stockDemo.getProductNo(), stockDemo.getShopCode(), secureRandom.nextInt(9999));\n                if (null == stock)\n                {\n                    // 如果不存在直接抛异常扣库存失败\n                    log.error(\"商品不存在库存信息：{}\", stockDemo);\n                    return 0;\n                }\n                // 需要再次从新获取，库存数据\n                StockDemo tempStock = null;\n                boolean preStatus = false;\n                // 重试次数，5次更新机会\n                int tryPreTimes = 0;\n                while (null != stock)\n                {\n                    //System.out.println(Thread.currentThread().getName() + \"查询的===========：\" + stock);\n                    int avaStock = stock.getAvaStock();\n                    int productNum = stockDemo.getProductNum();\n                    if (productNum > avaStock)\n                    {\n                        // 预占库存不足，抛异常，下单失败\n                        log.error(\"下单失败，可用库存不足，单号：{}，店铺：{}\", stockDemo.getOrderNo(), shopCode);\n                        log.error(\"商品：{}，预占库存：{}，实际可用库存：{}\", productNo, productNum, avaStock);\n                        throw new Exception(\"下单失败，库存不足!\");\n                    }\n                    int preStock = stock.getPreStock();\n\n                    // 预占+ 可用-\n                    int newAvaStock = avaStock - productNum;\n                    int newPreStock = preStock + productNum;\n                    tempStock = new StockDemo();\n                    tempStock.setId(stock.getId());\n                    // 旧库存 预占和可用库存\n                    tempStock.setAvaStock(stock.getAvaStock());\n                    tempStock.setPreStock(stock.getPreStock());\n                    // 新库存 预占和可用库存\n                    tempStock.setNewAvaStock(newAvaStock);\n                    tempStock.setNewPreStock(newPreStock);\n\n                    tempStock.setTotalStock(stock.getTotalStock());\n                    //System.out.println(Thread.currentThread().getName() + \"更新的===========：\" + tempStock);\n\n                    //尝试CAS，先比较旧值，再更新\n                    if (optStock(tempStock) > 0)\n                    {\n                        // 库存扣减成功\n                        log.info(\"下单成功，订单号：{}，预占库存数量：{}\", stockDemo.getOrderNo(), productNum);\n                        addOrder(stockDemo);\n                        preStatus = true;\n                        break;\n                    }\n                    else\n                    {\n                        // 库存扣减与预期的值不对，更新失败，尝试重新更新\n                        log.info(\"库存扣减与预期的值不对，更新失败，尝试重新更新！\");\n                        //                                            tryPreTimes++;\n                        stock = stockDemoMapper.queryByProduct(productNo, shopCode, secureRandom.nextInt(9999));\n                    }\n                }\n\n                // 总库存\n                tempStock.setTotalStock(stock.getTotalStock());\n                tempStock.setNewTotalStock(stock.getTotalStock());\n\n                // 预占成功处理日志\n                return saveChangeLog(stockDemo, productNo, shopCode, stock, tempStock, preStatus, StockOptTypeEnum.LOCK_STOCK);\n            }\n            else\n            {\n                // 此处需要考虑下单失败后，补偿下单扣库存的\n                log.error(\"下单失败，获取不到锁!\");\n                throw new Exception(\"下单失败，获取不到锁\");\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"库存占用失败!\");\n        }\n        finally\n        {\n            //System.out.println(Thread.currentThread().getName() + \"Redis释放锁。。。\" + System.currentTimeMillis());\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    // 下单\n    @Transactional(rollbackFor = Exception.class)\n    public void addOrder(StockDemo stockDemo)\n    {\n        OrderDemo orderDemo = new OrderDemo();\n        orderDemo.setOrderNo(stockDemo.getOrderNo());\n        orderDemo.setProductNo(stockDemo.getProductNo());\n        orderDemo.setStatus(1);\n        orderDemo.setProductNum(stockDemo.getProductNum());\n        orderDemo.setShopCode(stockDemo.getShopCode());\n        orderDemoMapper.insert(orderDemo);\n    }\n\n    // 更新订单状态\n    @Transactional(rollbackFor = Exception.class)\n    public int updateOrderStatus(String orderNo, int status)\n    {\n        return orderDemoMapper.updateByOrderNo(orderNo, status);\n    }\n\n    /**\n     * 释放库存\n     *\n     * @param stockDemo\n     * @return\n     */\n    @Override\n    public long releaseStock(StockDemo stockDemo)\n    {\n        if (checkStock(stockDemo, StockOptTypeEnum.RELEASE_STOCK.getOptType()))\n        {\n            return 0;\n        }\n        String productNo = stockDemo.getProductNo();\n        String shopCode = stockDemo.getShopCode();\n        SecureRandom secureRandom = null;\n        try\n        {\n            secureRandom = SecureRandom.getInstance(\"SHA1PRNG\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            e.printStackTrace();\n        }\n\n        // 公平锁\n        final RLock fairLock = redissonClient.getFairLock(StockUtil.getLockPath(productNo, shopCode));\n        // 异步 尝试加锁，最多等待50秒，上锁以后10秒自动解锁\n        Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);\n        try\n        {\n            //final boolean lock = fairLock.tryLock(50, 10, TimeUnit.SECONDS);\n            if (res.get())\n            {\n                //System.out.println(Thread.currentThread().getName() + \"Redis获得锁。。。\" + System.currentTimeMillis());\n                // 校验\n                StockDemo stock = stockDemoMapper\n                        .queryByProduct(stockDemo.getProductNo(), stockDemo.getShopCode(), secureRandom.nextInt(9999));\n                if (null == stock)\n                {\n                    // 如果不存在直接抛异常扣库存失败\n                    log.error(\"商品不存在库存信息：{}\", stockDemo);\n                    return 0;\n                }\n                StockDemo tempStock = null;\n                boolean release = false;\n                // 重试次数，5次更新机会\n                while (null != stock)\n                {\n                    //System.out.println(Thread.currentThread().getName() + \"查询的===========：\" + stock);\n                    int avaStock = stock.getAvaStock();\n                    int preStock = stock.getPreStock();\n                    int productNum = stockDemo.getProductNum();\n\n                    // 可用+ 预占-\n                    int newAvaStock = avaStock + productNum;\n                    int newPreStock = preStock - productNum;\n\n                    // 释放的库存必须是原有订单的库存数，也就是释放的库存不能为负数，否则就会出现数据异常\n                    if (productNum > preStock)\n                    {\n                        log.error(\"释放库存异常，释放库存已经大与现有的预占库存，释放库存数据本身有问题\");\n                        throw new Exception(\"释放库存已经大与现有的预占库存!\");\n                    }\n\n                    int totalStock = stock.getTotalStock();\n\n                    // 预占+可用应该永远是=总库存的。即使总库存真实的减了，预占库存应该会对应的减\n                    if (newAvaStock + newPreStock != totalStock)\n                    {\n                        //\n                        log.error(\"库存释放异常，可用库存+预占库存与总库存数量不符合!总库存：{}，预占库存：{}，可用库存：{}\", totalStock, newPreStock, newAvaStock);\n                        throw new Exception(\"库存扣释放异常，可用库存+预占库存与总库存数量不符合\");\n                    }\n\n                    tempStock = new StockDemo();\n                    tempStock.setId(stock.getId());\n                    // 旧库存  可用库存和预占库存\n                    tempStock.setAvaStock(stock.getAvaStock());\n                    tempStock.setPreStock(stock.getPreStock());\n                    // 新库存 可用库存和预占库存\n                    tempStock.setNewAvaStock(newAvaStock);\n                    tempStock.setNewPreStock(newPreStock);\n\n                    //System.out.println(Thread.currentThread().getName() + \"更新的===========：\" + tempStock);\n                    //尝试CAS，先比较旧值，再更新\n                    if (optStock(tempStock) > 0)\n                    {\n                        // 库存释放成功\n                        log.info(\"库存释放成功，订单号：{},释放数量：{}\", stockDemo.getOrderNo(), productNum);\n                        release = true;\n                        // 订单已完成\n                        this.updateOrderStatus(stockDemo.getOrderNo(), 0);\n                        break;\n                    }\n                    else\n                    {\n                        // 库存释放与预期的值不对，更新失败，尝试重新更新\n                        log.info(\"库存释放更新时与预期的值不对，更新失败，尝试重新更新！\");\n                        //                                            tryPreTimes++;\n                        stock = stockDemoMapper.queryByProduct(productNo, shopCode, secureRandom.nextInt(9999));\n                    }\n                }\n                // 总库存\n                tempStock.setTotalStock(stock.getTotalStock());\n                tempStock.setNewTotalStock(stock.getTotalStock());\n\n                // 预占成功处理日志\n                return saveChangeLog(stockDemo, productNo, shopCode, stock, tempStock, release, StockOptTypeEnum.RELEASE_STOCK);\n            }\n            else\n            {\n                // 此处需要考虑下单失败后，补偿下单扣库存的\n                log.error(\"库存释放失败，获取不到锁!\");\n                throw new Exception(\"库存释放失败，获取不到锁\");\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"库存释放失败!\");\n        }\n        finally\n        {\n            //System.out.println(Thread.currentThread().getName() + \"释放锁。。。\" + System.currentTimeMillis());\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    /**\n     * 出库\n     *\n     * @param stockDemo\n     * @return\n     */\n    @Override\n    public long outHourse(StockDemo stockDemo)\n    {\n        if (checkStock(stockDemo, StockOptTypeEnum.OUT_WAREHOUSE_STOCK.getOptType()))\n        {\n            return 0;\n        }\n        String productNo = stockDemo.getProductNo();\n        String shopCode = stockDemo.getShopCode();\n\n        SecureRandom secureRandom = null;\n        try\n        {\n            secureRandom = SecureRandom.getInstance(\"SHA1PRNG\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            e.printStackTrace();\n        }\n        // 公平锁\n        final RLock fairLock = redissonClient.getFairLock(StockUtil.getLockPath(productNo, shopCode));\n        // 异步 尝试加锁，最多等待50秒，上锁以后10秒自动解锁\n        Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);\n        try\n        {\n            //            final boolean lock = fairLock.tryLock(50, 10, TimeUnit.SECONDS);\n            if (res.get())\n            {\n                // 校验\n                StockDemo stock = stockDemoMapper\n                        .queryByProduct(stockDemo.getProductNo(), stockDemo.getShopCode(), secureRandom.nextInt(999));\n                if (null == stock)\n                {\n                    // 如果不存在直接抛异常扣库存失败\n                    log.error(\"商品不存在库存信息：{}\", stockDemo);\n                    return 0;\n                }\n                StockDemo tempStock = null;\n                boolean outHourse = false;\n                // 重试次数，5次更新机会\n                int tryPreTimes = 0;\n                //&& tryPreTimes < 5\n                while (null != stock)\n                {\n                    //                    System.out.println(\"查询的===========：\" + stock);\n                    int preStock = stock.getPreStock();\n                    int totalStock = stock.getTotalStock();\n                    int productNum = stockDemo.getProductNum();\n\n                    // 出库查库存应该是原来总库存中的数据，不能出现扣库存超数量情况\n                    if (productNum > preStock || productNum > totalStock)\n                    {\n                        log.error(\"扣减实际库存异常，释放库存已经大与现有的预占库存或大与现有的总库存，扣减库存数据本身有问题\");\n                        throw new Exception(\"扣减实际库存大与现有的预占和总库存!\");\n                    }\n\n                    //预占-，总库存-\n                    int newPreStock = preStock - productNum;\n                    int newTotalStock = totalStock - productNum;\n\n                    int avaStock = stock.getAvaStock();\n                    // 预占+可用应该永远是=总库存的。即使总库存真实的减了，预占库存应该会对应的减\n                    if (avaStock + newPreStock != newTotalStock)\n                    {\n                        //\n                        log.error(\"库存扣减异常，可用库存+预占库存与总库存数量不符合!总库存：{}，预占库存：{}，可用库存：{}\", totalStock, newPreStock, avaStock);\n                        throw new Exception(\"库存扣减放异常，可用库存+预占库存与总库存数量不符合\");\n                    }\n\n                    tempStock = new StockDemo();\n                    tempStock.setId(stock.getId());\n                    // 旧库 总库存和预占库存\n                    tempStock.setTotalStock(totalStock);\n                    tempStock.setPreStock(stock.getPreStock());\n                    // 新库存 总库存和预占库存\n                    tempStock.setNewPreStock(newPreStock);\n                    tempStock.setNewTotalStock(newTotalStock);\n\n                    //                    tempStock.setAvaStock(stock.getAvaStock());\n                    //                    System.out.println(\"更新的===========：\" + tempStock);\n                    //尝试CAS，先比较旧值，再更新\n                    if (optStock(tempStock) > 0)\n                    {\n                        // 总库存减成功\n                        log.info(\"总库存减成功，订单号：{}，减库存数量：{}\", stockDemo.getOrderNo(), productNum);\n                        outHourse = true;\n                        // 订单已完成\n                        this.updateOrderStatus(stockDemo.getOrderNo(), 2);\n                        break;\n                    }\n                    else\n                    {\n                        // 库存释放与预期的值不对，更新失败，尝试重新更新\n                        log.info(\"总库存更新与预期的值不对，库存出库扣减失败，尝试重新更新！\");\n                        //                        tryPreTimes++;\n                        stock = stockDemoMapper.queryByProduct(productNo, shopCode, secureRandom.nextInt(9999));\n                    }\n                }\n                // 可用库存\n                tempStock.setAvaStock(stock.getAvaStock());\n                tempStock.setNewAvaStock(stock.getAvaStock());\n\n                // 预占成功处理日志\n                return saveChangeLog(stockDemo, productNo, shopCode, stock, tempStock, outHourse, StockOptTypeEnum.OUT_WAREHOUSE_STOCK);\n            }\n            else\n            {\n                // 此处需要考虑下单失败后，补偿下单扣库存的\n                log.error(\"库存出库扣减失败，获取不到锁!\");\n                throw new Exception(\"库存出库扣减失败，获取不到锁\");\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"库存出库扣减失败!\");\n        }\n        finally\n        {\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    /**\n     * [简要描述]:添加总库存<br/>\n     * [详细描述]:<br/>\n     * // 总库存+、可用库存+ 总之要保证：可用库存+预占库存=总库存\n     *\n     * @param stockDemo :\n     * @return long\n     * llxiao  2019/10/19 - 8:41\n     **/\n    @Override\n    public long addStock(StockDemo stockDemo)\n    {\n        if (checkStock(stockDemo, StockOptTypeEnum.ADD_STOCK.getOptType()))\n        {\n            log.error(\"库存添加校验不通过!\");\n            return 0;\n        }\n\n        String productNo = stockDemo.getProductNo();\n        String shopCode = stockDemo.getShopCode();\n\n        SecureRandom secureRandom = null;\n        try\n        {\n            secureRandom = SecureRandom.getInstance(\"SHA1PRNG\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            e.printStackTrace();\n        }\n        // 公平锁\n        final RLock fairLock = redissonClient.getFairLock(StockUtil.getLockPath(productNo, shopCode));\n        // 异步 尝试加锁，最多等待50秒，上锁以后10秒自动解锁\n        Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);\n        try\n        {\n            //final boolean lock = fairLock.tryLock(50, 10, TimeUnit.SECONDS);\n            if (res.get())\n            {\n                // 校验\n                StockDemo stock = stockDemoMapper\n                        .queryByProduct(stockDemo.getProductNo(), stockDemo.getShopCode(), secureRandom.nextInt(999));\n                if (null == stock)\n                {\n                    // 如果不存在直接抛异常扣库存失败\n                    log.error(\"商品不存在库存信息：{}\", stockDemo);\n                    return 0;\n                }\n                StockDemo tempStock = null;\n                boolean addStatus = false;\n                // 重试次数，5次更新机会\n                while (null != stock)\n                {\n                    int avaStock = stock.getAvaStock();\n                    int totalStock = stock.getTotalStock();\n                    int productNum = stockDemo.getProductNum();\n\n                    //可用+，总库存+\n                    int newAvaStock = avaStock + productNum;\n                    int newTotalStock = totalStock + productNum;\n\n                    int preStock = stock.getPreStock();\n                    // 预占+可用应该永远是=总库存的。即使总库存真实的减了，预占库存应该会对应的减\n                    if (newAvaStock + preStock != newTotalStock)\n                    {\n                        log.error(\"库存扣减异常，可用库存+预占库存与总库存数量不符合!总库存：{}，预占库存：{}，可用库存：{}\", totalStock, preStock, newAvaStock);\n                        throw new Exception(\"库存扣减放异常，可用库存+预占库存与总库存数量不符合\");\n                    }\n\n                    tempStock = new StockDemo();\n                    tempStock.setId(stock.getId());\n                    // 旧库 总库存和预占库存\n                    tempStock.setTotalStock(totalStock);\n                    tempStock.setPreStock(stock.getPreStock());\n                    tempStock.setAvaStock(avaStock);\n                    // 新库存 总库存和预占库存\n                    tempStock.setNewPreStock(stock.getPreStock());\n                    tempStock.setNewTotalStock(newTotalStock);\n                    tempStock.setNewAvaStock(newAvaStock);\n\n                    //System.out.println(\"更新的===========：\" + tempStock);\n                    //尝试CAS，先比较旧值，再更新\n                    if (optStock(tempStock) > 0)\n                    {\n                        // 总库存减成功\n                        log.info(\"总库存添加成功功，添加数量：{}，总库存存数量：{}\", productNum, newTotalStock);\n                        addStatus = true;\n                        break;\n                    }\n                    else\n                    {\n                        // 库存释放与预期的值不对，更新失败，尝试重新更新\n                        log.info(\"总库存更新与预期的值不对，更新失败，尝试重新更新！\");\n                        //                        tryPreTimes++;\n                        stock = stockDemoMapper.queryByProduct(productNo, shopCode, secureRandom.nextInt(9999));\n                    }\n                }\n\n                // 预占成功处理日志\n                return saveChangeLog(stockDemo, productNo, shopCode, stock, tempStock, addStatus, StockOptTypeEnum.OUT_WAREHOUSE_STOCK);\n            }\n            else\n            {\n                // 此处需要考虑下单失败后，补偿下单扣库存的\n                log.error(\"库存释放失败，获取不到锁!\");\n                throw new Exception(\"库存释放失败，获取不到锁\");\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"库存释放失败!错误消息：\", e.getMessage());\n        }\n        finally\n        {\n            fairLock.unlock();\n        }\n        return 0;\n    }\n\n    /**\n     * 获取订单信息\n     *\n     * @param orderNo\n     * @return\n     */\n    @Override\n    public OrderDemo getOrderByNo(String orderNo)\n    {\n        return orderDemoMapper.getOrderByNo(orderNo);\n    }\n\n    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)\n    public int optStock(StockDemo updateStock)\n    {\n        return stockDemoMapper.preStock(updateStock);\n    }\n\n    private boolean checkStock(StockDemo stockDemo, String optType)\n    {\n        if (null == stockDemo || StringUtils.isBlank(stockDemo.getOrderNo()) || StringUtils\n                .isBlank(stockDemo.getShopCode()) || StringUtils.isBlank(stockDemo.getProductNo()))\n        {\n            // 参数为直接抛异常扣库存失败\n            log.error(\"请求参数为空：{}\", stockDemo);\n            return true;\n        }\n\n        StockChangeLodDemo stockChangeLodDemo = stockChangeLodDemoMapper\n                .selectByOrderNo(stockDemo.getOrderNo(), stockDemo.getProductNo(), optType);\n        if (null != stockChangeLodDemo)\n        {\n            log.error(\"预占库存失败，库存日志记录已经存在，订单号：{}，商品SKU：{}\", stockDemo.getOrderNo(), stockDemo.getProductNo());\n            return true;\n        }\n        return false;\n    }\n\n    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)\n    public long saveChangeLog(StockDemo stockDemo, String productNo, String shopCode, StockDemo stock,\n            StockDemo tempStock, boolean release, StockOptTypeEnum optTypeEnum) throws Exception\n    {\n        if (release)\n        {\n            tempStock.setProductNo(stockDemo.getProductNo());\n            tempStock.setShopCode(stockDemo.getShopCode());\n            tempStock.setOrderNo(stockDemo.getOrderNo());\n            return saveStockChangeLog(tempStock, optTypeEnum);\n        }\n        else\n        {\n            log.error(\"下单失败，可用库存不足，单号：{}，店铺：{}\", stockDemo.getOrderNo(), shopCode);\n            log.error(\"商品：{}，预占库存：{}\", productNo, stockDemo.getProductNum());\n            throw new Exception(\"下单失败，库存不足!\");\n        }\n    }\n\n    private Long saveStockChangeLog(StockDemo stockDemo, StockOptTypeEnum stockOptTypeEnum)\n    {\n        StockChangeLodDemo stockChangeLodDemo = new StockChangeLodDemo();\n        stockChangeLodDemo.setOrderNo(stockDemo.getOrderNo());\n        stockChangeLodDemo.setProductNo(stockDemo.getProductNo());\n        stockChangeLodDemo.setShopCode(stockDemo.getShopCode());\n        stockChangeLodDemo.setAvaStockBefore(stockDemo.getAvaStock());\n        stockChangeLodDemo.setPreStockBefore(stockDemo.getPreStock());\n        stockChangeLodDemo.setTotalStockBefore(stockDemo.getTotalStock());\n        stockChangeLodDemo.setAvaStockAfter(stockDemo.getNewAvaStock());\n        stockChangeLodDemo.setPreStockAfter(stockDemo.getNewPreStock());\n        stockChangeLodDemo.setTotalStockAfter(stockDemo.getNewTotalStock());\n        stockChangeLodDemo.setOptType(stockOptTypeEnum.getOptType());\n        //        System.out.println(\"保存日志：\" + stockChangeLodDemo);\n        stockChangeLodDemoMapper.insert(stockChangeLodDemo);\n        return stockChangeLodDemo.getId();\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/util/OrderNoUtil.java",
    "content": "package com.xiao.stock.demo.util;\n\nimport cn.hutool.core.lang.Snowflake;\nimport cn.hutool.core.net.NetUtil;\nimport cn.hutool.core.util.IdUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\n/**\n * 订单枷锁工具\n */\n@Component\n@Slf4j\npublic class OrderNoUtil\n{\n    private static long workerId = 0;\n    private static Snowflake snowflake;\n\n    static\n    {\n        try\n        {\n\n            workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());\n        }\n        catch (Exception e)\n        {\n            log.warn(\"获取机器 ID 失败\", e);\n            workerId = NetUtil.getLocalhost().hashCode();\n        }\n        workerId = workerId % 32;\n        log.info(\"当前机器 workerId: {}\", workerId);\n        // workerId 0~31\n        snowflake = IdUtil.createSnowflake(workerId, workerId + 1);\n    }\n\n    public synchronized long snowflakeId()\n    {\n        return snowflake.nextId();\n    }\n\n    public synchronized long snowflakeId(long workerId, long dataCenterId)\n    {\n        Snowflake snowflake = IdUtil.createSnowflake(workerId, dataCenterId);\n        return snowflake.nextId();\n    }\n\n    /**\n     * 订单编号规则：14位毫秒时间戳+3位顺序编号\n     *\n     * @return\n     */\n    public String buildOrderNo()\n    {\n        return \"O\" + snowflakeId();\n    }\n\n    public String buildOrderItemNo()\n    {\n        return \"OI\" + snowflakeId();\n    }\n\n    /**\n     * 快递单号\n     *\n     * @return\n     */\n    public String buildDeliveryNo()\n    {\n        return \"D\" + snowflakeId();\n    }\n\n    /**\n     * 预售单号\n     *\n     * @return\n     */\n    public String buildAdvanceSaleOrderNo()\n    {\n        return \"Y\" + snowflakeId();\n    }\n\n    /**\n     * 跨境购生成单号\n     *\n     * @return\n     */\n    public String buildHaitaoOrderNo()\n    {\n        return \"H\" + snowflakeId();\n    }\n\n    /**\n     * [简要描述]:内购会生成订单,由I变更为O，便于识别<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.lang.String\n     * llxiao  2019/9/18 - 14:19\n     **/\n    public String buildInOrderNo()\n    {\n        return \"N\" + snowflakeId();\n    }\n\n    /**\n     * 拼团单号\n     *\n     * @return\n     */\n    public String buildPintuanOrderNo()\n    {\n        return \"P\" + snowflakeId();\n    }\n\n    /**\n     * 拼明细单号\n     *\n     * @return\n     */\n    public String buildPintuanOrderItemNo()\n    {\n        return \"PI\" + snowflakeId();\n    }\n\n    /**\n     * 团号\n     *\n     * @return\n     */\n    public String buildTuanNo()\n    {\n        return \"T\" + snowflakeId();\n    }\n\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/java/com/xiao/stock/demo/util/StockUtil.java",
    "content": "package com.xiao.stock.demo.util;/**\n * [简要描述]:\n * [详细描述]:\n *\n * @since JDK 1.8\n */\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/10/17 11:38\n * @since JDK 1.8\n */\npublic class StockUtil\n{\n    private static final String STOCK_LOCK_PATH = \"/stock/\";\n    private static final String ORDER_LOCK_PATH = \"/order/\";\n\n    /**\n     * 店铺+产品编号    获取redisson 锁\n     *\n     * @return\n     */\n    public static String getLockPath(String productNo, String shopCode)\n    {\n        return STOCK_LOCK_PATH + shopCode + '/' + productNo;\n    }\n\n    /**\n     * 订单编号 redisson 锁\n     *\n     * @param orderNo\n     * @return\n     */\n    public static String getOrderLockPath(String orderNo)\n    {\n        return ORDER_LOCK_PATH + orderNo;\n    }\n}\n"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: stock-demo\nserver:\n  port: 7878\n  ## tomcat 最大线程池配置\n  tomcat:\n    # 最大连接数\n    max-connections: 10000\n    # 最大线程数\n    max-threads: 500\n    # 最小线程数\n    min-spare-threads: 20\n    #最大队列长度\n    accept-count: 1000\nredisson:\n  host: redis://192.168.206.204:6789\n  password: jl!@12\nthread:\n  pool:\n    core: 50\n    max: 100\n  queue:\n    capacity: 10000\nhikari-jdbc-url: jdbc:mysql://192.168.206.201:3306/basisdb?useSSL=false&allowMultiQueries=true\nhikari-jdbc-username: basisuser\nhikari-jdbc-password: Basisuser123\nhikari-jdbc-driver-class-name: com.mysql.jdbc.Driver\nhikari-jdbc-pool-size: 10"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/resources/com/xiao/stock/demo/mapper/OrderDemoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.stock.demo.mapper.OrderDemoMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.stock.demo.entity.OrderDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"order_no\" property=\"orderNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"shop_code\" property=\"shopCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"product_no\" property=\"productNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"product_num\" property=\"productNum\" jdbcType=\"INTEGER\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        id, order_no, shop_code, product_no, product_num,status, update_time\n    </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_order_demo\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n\n    <select id=\"getOrderByNo\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.String\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_order_demo\n        where order_no = #{orderNo,jdbcType=VARCHAR}\n    </select>\n\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        delete from t_order_demo\n        where id = #{id,jdbcType=BIGINT}\n    </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.stock.demo.entity.OrderDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        insert into t_order_demo (id, order_no, shop_code,\n        product_no, product_num,status, update_time\n        )\n        values (#{id,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, #{shopCode,jdbcType=VARCHAR},\n        #{productNo,jdbcType=VARCHAR}, #{productNum,jdbcType=INTEGER},#{status,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}\n        )\n    </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.stock.demo.entity.OrderDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        insert into t_order_demo\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"orderNo != null\">\n                order_no,\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code,\n            </if>\n            <if test=\"productNo != null\">\n                product_no,\n            </if>\n            <if test=\"productNum != null\">\n                product_num,\n            </if>\n            <if test=\"status != null\">\n                status,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"orderNo != null\">\n                #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"productNo != null\">\n                #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"productNum != null\">\n                #{productNum,jdbcType=INTEGER},\n            </if>\n            <if test=\"status != null\">\n                #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.stock.demo.entity.OrderDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        update t_order_demo\n        <set>\n            <if test=\"orderNo != null\">\n                order_no = #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code = #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"productNo != null\">\n                product_no = #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"productNum != null\">\n                product_num = #{productNum,jdbcType=INTEGER},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.stock.demo.entity.OrderDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Sat Oct 19 09:17:42 CST 2019.\n        -->\n        update t_order_demo\n        set order_no = #{orderNo,jdbcType=VARCHAR},\n        shop_code = #{shopCode,jdbcType=VARCHAR},\n        product_no = #{productNo,jdbcType=VARCHAR},\n        product_num = #{productNum,jdbcType=INTEGER},\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n        status = #{status,jdbcType=INTEGER}\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n\n    <update id=\"updateByOrderNo\">\n        update t_order_demo set status = #{status} where order_no = #{orderNo}\n    </update>\n</mapper>"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/resources/com/xiao/stock/demo/mapper/StockChangeLodDemoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.stock.demo.mapper.StockChangeLodDemoMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.stock.demo.entity.StockChangeLodDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"product_no\" property=\"productNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"shop_code\" property=\"shopCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"order_no\" property=\"orderNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"opt_type\" property=\"optType\" jdbcType=\"VARCHAR\"/>\n        <result column=\"pre_stock_after\" property=\"preStockAfter\" jdbcType=\"INTEGER\"/>\n        <result column=\"ava_stock_after\" property=\"avaStockAfter\" jdbcType=\"INTEGER\"/>\n        <result column=\"total_stock_after\" property=\"totalStockAfter\" jdbcType=\"INTEGER\"/>\n        <result column=\"pre_stock_before\" property=\"preStockBefore\" jdbcType=\"INTEGER\"/>\n        <result column=\"ava_stock_before\" property=\"avaStockBefore\" jdbcType=\"INTEGER\"/>\n        <result column=\"total_stock_before\" property=\"totalStockBefore\" jdbcType=\"INTEGER\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        id, product_no, shop_code, order_no, opt_type, pre_stock_after, ava_stock_after, total_stock_after,\n        pre_stock_before, ava_stock_before, total_stock_before, update_time\n    </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_stock_change_log_demo\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        delete from t_stock_change_log_demo\n        where id = #{id,jdbcType=BIGINT}\n    </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.stock.demo.entity.StockChangeLodDemo\" useGeneratedKeys=\"true\"\n            keyProperty=\"id\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        insert into t_stock_change_log_demo (id, product_no, shop_code,\n        order_no,opt_type, pre_stock_after, ava_stock_after,\n        total_stock_after, pre_stock_before, ava_stock_before,\n        total_stock_before, update_time)\n        values (#{id,jdbcType=BIGINT}, #{productNo,jdbcType=VARCHAR}, #{shopCode,jdbcType=VARCHAR},\n        #{orderNo,jdbcType=VARCHAR},#{optType,jdbcType=VARCHAR}, #{preStockAfter,jdbcType=INTEGER},\n        #{avaStockAfter,jdbcType=INTEGER},\n        #{totalStockAfter,jdbcType=INTEGER}, #{preStockBefore,jdbcType=INTEGER}, #{avaStockBefore,jdbcType=INTEGER},\n        #{totalStockBefore,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP})\n    </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.stock.demo.entity.StockChangeLodDemo\"\n            useGeneratedKeys=\"true\"\n            keyProperty=\"id\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        insert into t_stock_change_log_demo\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"productNo != null\">\n                product_no,\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code,\n            </if>\n            <if test=\"orderNo != null\">\n                order_no,\n            </if>\n            <if test=\"optType != null\">\n                opt_type,\n            </if>\n            <if test=\"preStockAfter != null\">\n                pre_stock_after,\n            </if>\n            <if test=\"avaStockAfter != null\">\n                ava_stock_after,\n            </if>\n            <if test=\"totalStockAfter != null\">\n                total_stock_after,\n            </if>\n            <if test=\"preStockBefore != null\">\n                pre_stock_before,\n            </if>\n            <if test=\"avaStockBefore != null\">\n                ava_stock_before,\n            </if>\n            <if test=\"totalStockBefore != null\">\n                total_stock_before,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"productNo != null\">\n                #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"orderNo != null\">\n                #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"optType != null\">\n                #{optType,jdbcType=VARCHAR},\n            </if>\n            <if test=\"preStockAfter != null\">\n                #{preStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStockAfter != null\">\n                #{avaStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStockAfter != null\">\n                #{totalStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"preStockBefore != null\">\n                #{preStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStockBefore != null\">\n                #{avaStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStockBefore != null\">\n                #{totalStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.stock.demo.entity.StockChangeLodDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        update t_stock_change_log_demo\n        <set>\n            <if test=\"productNo != null\">\n                product_no = #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code = #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"orderNo != null\">\n                order_no = #{orderNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"optType != null\">\n                opt_type = #{optType,jdbcType=VARCHAR},\n            </if>\n            <if test=\"preStockAfter != null\">\n                pre_stock_after = #{preStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStockAfter != null\">\n                ava_stock_after = #{avaStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStockAfter != null\">\n                total_stock_after = #{totalStockAfter,jdbcType=INTEGER},\n            </if>\n            <if test=\"preStockBefore != null\">\n                pre_stock_before = #{preStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStockBefore != null\">\n                ava_stock_before = #{avaStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStockBefore != null\">\n                total_stock_before = #{totalStockBefore,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.stock.demo.entity.StockChangeLodDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        update t_stock_change_log_demo\n        set product_no = #{productNo,jdbcType=VARCHAR},\n        shop_code = #{shopCode,jdbcType=VARCHAR},\n        order_no = #{orderNo,jdbcType=VARCHAR},\n        opt_type = #{optType,jdbcType=VARCHAR},\n        pre_stock_after = #{preStockAfter,jdbcType=INTEGER},\n        ava_stock_after = #{avaStockAfter,jdbcType=INTEGER},\n        total_stock_after = #{totalStockAfter,jdbcType=INTEGER},\n        pre_stock_before = #{preStockBefore,jdbcType=INTEGER},\n        ava_stock_before = #{avaStockBefore,jdbcType=INTEGER},\n        total_stock_before = #{totalStockBefore,jdbcType=INTEGER},\n        update_time = #{updateTime,jdbcType=TIMESTAMP}\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n\n    <!-- 库存操作记录 -->\n    <select id=\"selectByOrderNo\" resultMap=\"BaseResultMap\" >\n       select\n        <include refid=\"Base_Column_List\"/>\n       from t_stock_change_log_demo\n       where order_no = #{orderNo,jdbcType=VARCHAR}\n        and product_no = #{productNo,jdbcType=VARCHAR}\n        and opt_type = #{optType,jdbcType=VARCHAR}\n    </select>\n</mapper>"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/resources/com/xiao/stock/demo/mapper/StockDemoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.stock.demo.mapper.StockDemoMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.stock.demo.entity.StockDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"product_no\" property=\"productNo\" jdbcType=\"VARCHAR\"/>\n        <result column=\"shop_code\" property=\"shopCode\" jdbcType=\"VARCHAR\"/>\n        <result column=\"pre_stock\" property=\"preStock\" jdbcType=\"INTEGER\"/>\n        <result column=\"ava_stock\" property=\"avaStock\" jdbcType=\"INTEGER\"/>\n        <result column=\"total_stock\" property=\"totalStock\" jdbcType=\"INTEGER\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        id, product_no, shop_code, pre_stock, ava_stock, total_stock, update_time\n    </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_stock_demo\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <select id=\"queryByProduct\" resultType=\"com.xiao.stock.demo.entity.StockDemo\" resultMap=\"BaseResultMap\" useCache=\"false\" flushCache=\"true\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_stock_demo\n        where product_no = #{productNo} and shop_code = #{shopCode}\n        and ('random' = #{random} or 1 = 1)\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        delete from t_stock_demo\n        where id = #{id,jdbcType=BIGINT}\n    </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.stock.demo.entity.StockDemo\" useGeneratedKeys=\"true\"\n            keyProperty=\"id\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        insert into t_stock_demo (id, product_no, shop_code,\n        pre_stock, ava_stock, total_stock,\n        update_time)\n        values (#{id,jdbcType=BIGINT}, #{productNo,jdbcType=VARCHAR}, #{shopCode,jdbcType=VARCHAR},\n        #{preStock,jdbcType=INTEGER}, #{avaStock,jdbcType=INTEGER}, #{totalStock,jdbcType=INTEGER},\n        #{updateTime,jdbcType=TIMESTAMP})\n    </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.stock.demo.entity.StockDemo\" useGeneratedKeys=\"true\"\n            keyProperty=\"id\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        insert into t_stock_demo\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"productNo != null\">\n                product_no,\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code,\n            </if>\n            <if test=\"preStock != null\">\n                pre_stock,\n            </if>\n            <if test=\"avaStock != null\">\n                ava_stock,\n            </if>\n            <if test=\"totalStock != null\">\n                total_stock,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"productNo != null\">\n                #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"preStock != null\">\n                #{preStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStock != null\">\n                #{avaStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStock != null\">\n                #{totalStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.stock.demo.entity.StockDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        update t_stock_demo\n        <set>\n            <if test=\"productNo != null\">\n                product_no = #{productNo,jdbcType=VARCHAR},\n            </if>\n            <if test=\"shopCode != null\">\n                shop_code = #{shopCode,jdbcType=VARCHAR},\n            </if>\n            <if test=\"preStock != null\">\n                pre_stock = #{preStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"avaStock != null\">\n                ava_stock = #{avaStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"totalStock != null\">\n                total_stock = #{totalStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.stock.demo.entity.StockDemo\">\n        <!--\n          WARNING - @mbggenerated\n          This element is automatically generated by MyBatis Generator, do not modify.\n          This element was generated on Thu Oct 17 09:29:23 CST 2019.\n        -->\n        update t_stock_demo\n        set product_no = #{productNo,jdbcType=VARCHAR},\n        shop_code = #{shopCode,jdbcType=VARCHAR},\n        pre_stock = #{preStock,jdbcType=INTEGER},\n        ava_stock = #{avaStock,jdbcType=INTEGER},\n        total_stock = #{totalStock,jdbcType=INTEGER},\n        update_time = #{updateTime,jdbcType=TIMESTAMP}\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n\n    <update id=\"preStock\" parameterType=\"com.xiao.stock.demo.entity.StockDemo\">\n        update t_stock_demo\n        <set>\n            <if test=\"null != newAvaStock\">\n                ava_stock = #{newAvaStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"null != newPreStock\">\n                pre_stock = #{newPreStock,jdbcType=INTEGER},\n            </if>\n            <if test=\"null != newTotalStock\">\n                total_stock = #{newTotalStock,jdbcType=INTEGER},\n            </if>\n        </set>\n        <where>\n            id = #{id,jdbcType=BIGINT}\n            <if test=\"null != avaStock\">\n                and ava_stock = #{avaStock,jdbcType=INTEGER}\n            </if>\n            <if test=\"null != preStock\">\n                and pre_stock = #{preStock,jdbcType=INTEGER}\n            </if>\n            <if test=\"totalStock != totalStock\">\n                and total_stock = #{totalStock,jdbcType=INTEGER}\n            </if>\n        </where>\n    </update>\n</mapper>"
  },
  {
    "path": "SpringBoot-Stock-Demo/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n    <!-- logback加载优先于application.yml文件，因此需要从bootstrap.yml文件中读取spring.application.name信息 -->\n    <springProperty scope=\"context\" name=\"springAppName\" source=\"spring.application.name\"/>\n    <springProperty scope=\"context\" name=\"ip\" source=\"spring.cloud.client.ipAddress\"/>\n    <springProperty scope=\"context\" name=\"active\" source=\"spring.profiles.active\"/>\n    <!-- 日志在工程中的输出位置 -->\n    <!-- 控制台的日志输出样式 -->\n    <property name=\"CONSOLE_LOG_PATTERN\"\n              value=\"%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\"/>\n\n    <!-- 控制台Appender -->\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"ERROR\"/>\n    <logger name=\"org.apache.zookeeper\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <!-- 启动的时候一些日志屏蔽 -->\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.jmx.export.annotation.AnnotationMBeanExporter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.mvc\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.web.servlet.FilterRegistrationBean\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.config.sources.URLConfigurationSource\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.ui.freemarker.SpringTemplateLoader\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.context.annotation.AnnotationConfigApplicationContext\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.support.DefaultListableBeanFactory\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter\" level=\"ERROR\"/>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "SpringCloud-Canal/doc/ServerRunningMonitor源码注解.md",
    "content": "设计到主要知识点:\n 1. Zookeeper 临时节点创建\n 2. CAS 操作\n 3. MDC 线程安全的存放诊断日志的容器\n\n```html\npublic ServerRunningMonitor(){\n        // 创建父节点\n        IZkDataListener dataListener = new IZkDataListener() {\n\n            // ZK节点数据出现变更，比如：主动释放、激活、新增等\n            public void handleDataChange(String dataPath, Object data) throws Exception {\n                // 线程安全的存放诊断日志的容器,其实是放到当前线程的ThreadLocalMap中，不明所以？\n                MDC.put(\"destination\", destination);\n                ServerRunningData runningData = JsonUtils.unmarshalFromByte((byte[]) data, ServerRunningData.class);\n\n                // 如果不是本机节点\n                if (!isMine(runningData.getAddress())) {\n                    // 互斥设置false，内部使用CAS操作\n                    mutex.set(false);\n                }\n\n                // zk上现有节点不活跃，且zk的节点是本机节点，说明是主动释放\n                if (!runningData.isActive() && isMine(runningData.getAddress())) { // 说明出现了主动释放的操作，并且本机之前是active\n                    release = true;\n                    // 从zk上删除节点\n                    releaseRunning();// 彻底释放mainstem\n                }\n\n                // 设置当前活动节点为zk上正在运行的节点\n                activeData = (ServerRunningData) runningData;\n            }\n\n            // 节点删除\n            public void handleDataDeleted(String dataPath) throws Exception {\n                MDC.put(\"destination\", destination);\n                // 互斥设置false，内部使用CAS操作\n                mutex.set(false);\n\n                //  不为释放状态、活动节点不会为空且为本机节点，则即时触发一下active抢占\n                if (!release && activeData != null && isMine(activeData.getAddress())) {\n                    initRunning();\n                } else {\n                    // 否则就是等待delayTime，避免因网络瞬端或者zk异常，导致出现频繁的切换操作\n                    delayExector.schedule(new Runnable() {\n                        public void run() {\n                            initRunning();\n                        }\n                    }, delayTime, TimeUnit.SECONDS);\n                }\n            }\n\n        };\n\n    }\n    \n    private void initRunning() {\n    \n            // 不是运行中直接返回\n            if (!isStart()) {\n                return;\n            }\n    \n            // 生产当前运行的实例的节点信息：/otter/canal/destinations/{0} 实例信息如example\n            String path = ZookeeperPathUtils.getDestinationServerRunning(destination);\n            // 序列化 当前运行的节点，此处应该是本机的节点\n            byte[] bytes = JsonUtils.marshalToByte(serverData);\n            try {\n                // 互斥false CAS操作  阻塞?\n                mutex.set(false);\n                // ZK上创建临时节点(带open ACL)并设置数据\n                zkClient.create(path, bytes, CreateMode.EPHEMERAL);\n                activeData = serverData;\n                // 触发激活事件\n                processActiveEnter();\n                // 设置互斥  CAS操作，释放一下锁对象，唤醒一下阻塞的Thread\n                mutex.set(true);\n            } catch (ZkNodeExistsException e) {\n                // 节点已经存在，或去数据\n                bytes = zkClient.readData(path, true);\n                if (bytes == null) {\n                    // 节点中的数据为空，则立即出发抢占\n                    initRunning();\n                } else {\n                    // 反之设置当前可用节点为ZK上的节点\n                    activeData = JsonUtils.unmarshalFromByte(bytes, ServerRunningData.class);\n                }\n            } catch (ZkNoNodeException e) {\n                // 不存在则创建父节点，尝试抢占动作\n                zkClient.createPersistent(ZookeeperPathUtils.getDestinationPath(destination), true);\n                initRunning();\n            }\n        }\n\n```"
  },
  {
    "path": "SpringCloud-Canal/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Canal</artifactId>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <!-- cananl -->\n        <dependency>\n            <groupId>com.alibaba.otter</groupId>\n            <artifactId>canal.client</artifactId>\n            <version>1.1.2</version>\n        </dependency>\n\n        <!-- disruptor -->\n        <dependency>\n            <groupId>com.lmax</groupId>\n            <artifactId>disruptor</artifactId>\n            <version>3.4.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>${lombok.version}</version>\n        </dependency>\n\n        <!--工具类 -->\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>4.1.12</version>\n        </dependency>\n\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Canal/readme.md",
    "content": "1. 本DEMO主要实现：Canal+disruptor+springboot，订阅mysql binlog日志，实现数据同步，比如缓存，ES等。<br>\n\n2. 组件简介：<br>\n    [Canal](https://github.com/alibaba/canal)-阿里巴巴mysql数据库binlog的增量订阅&消费组件<br>\n    [Disruptor](https://github.com/LMAX-Exchange/disruptor)-开源的并发框架，能够在无锁的情况下实现网络的Queue并发操作<br>\n\n3. 使用方式：<br>\n    Canal的服务端搭建[参考](https://www.jianshu.com/p/6299048fad66)<br>\n    Disruptor+Canal异步操作[参考](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Canal/src/main/java/com/xiao/springcloud)<br>\n    业务集成时在[DisruptorServiceImpl](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/service/impl/DisruptorServiceImpl.java)<br>\n    服务中实现自己的业务逻辑即可，代码片段：<br>\n   ```$xslt\n    public void execute(TableData tableData)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"接受数据更新请求，更新表名:{},更新的主键为:{}\", tableData.getTableName(), tableData.getId());\n        }\n        if (null != tableData)\n        {\n            //业务处理 TODO\n        }\n    }\n   ```\n   在[CanalClientService](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Canal/src/main/java/com/xiao/springcloud/canal/CanalClientService.java)中定制自己需要的binlog事件处理<br>\n   代码片段：\n   ```$xslt\n     private void processData(List<CanalEntry.Entry> entrys)\n        {\n            if (log.isDebugEnabled())\n            {\n                log.debug(\"接收到需要处理数据，总数量：{}\", entrys.size());\n            }\n    \n            List<TableData> tableDataList = new ArrayList<>(entrys.size());\n            // 表名\n            String tableName;\n            TableData tableData;\n            CanalEntry.RowChange rowChange;\n            for (CanalEntry.Entry entry : entrys)\n            {\n                // 事物数据不处理\n                if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN\n                        || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND)\n                {\n                    continue;\n                }\n    \n                if (entry.getEntryType() != CanalEntry.EntryType.ROWDATA)\n                {\n                    continue;\n                }\n    \n                //获取表名\n                tableName = entry.getHeader().getTableName();\n    \n                //仅处理部分表接口数据\n                if (tableNames.contains(tableName))\n                {\n                    try\n                    {\n                        rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());\n                        // RowData --具体insert/update/delete的变更数据，可为多条，1个binlog event事件可对应多条变更，比如批处理\n                        for (CanalEntry.RowData rowData : rowChange.getRowDatasList())\n                        {\n                            switch (rowChange.getEventType())\n                            {\n                                //当前仅处理Insert和更新数据\n                                case INSERT:\n                                case UPDATE:\n                                    tableData = new TableData();\n                                    tableData.setTableName(tableName);\n                                    tableData.setId(parseKey(rowData.getAfterColumnsList()));\n                                    tableDataList.add(tableData);\n                                    break;\n                                default:\n                                    break;\n                            }\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        log.error(\"当前行数据解析错误：\", e);\n                    }\n                }\n            }\n            if (CollectionUtil.isNotEmpty(tableDataList))\n            {\n                //发送数据到异步队列框架\n                disruptorProducer.send(tableDataList);\n            }\n            if (log.isDebugEnabled())\n            {\n                log.debug(\"接收到Mysql更新数据，总数量：{}\", tableDataList.size());\n            }\n        }\n   ```\n\n4. Canal使用——数据库初始化配置（5.* 必须）<br>\n    _tips: mysql 8.* 默认开启以下配置_ <br>\n    在[mysqld]下配置：<br>\n    ```$xslt\n    log-bin=mysql-bin \n    binlog-format=ROW \n    server_id=1(任意id即可，但不能与canal中指定的id相同)\n   ```\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/alibaba/canal/simple/ClientSample.java",
    "content": "package com.alibaba.canal.simple;\n\nimport com.alibaba.otter.canal.client.CanalConnector;\nimport com.alibaba.otter.canal.client.CanalConnectors;\nimport com.alibaba.otter.canal.protocol.CanalEntry;\nimport com.alibaba.otter.canal.protocol.Message;\n\nimport java.net.InetSocketAddress;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/19 11:50\n * @since JDK 1.8\n */\npublic class ClientSample\n{\n    public static void main(String[] args)\n    {\n        // 创建链接\n        CanalConnector connector = CanalConnectors\n                .newSingleConnector(new InetSocketAddress(\"192.168.206.210\", 5555), \"example\", \"\", \"\");\n        int batchSize = 1000;\n        int emptyCount = 0;\n        try\n        {\n            connector.connect();\n            // .*代表database，..*代表table\n            connector.subscribe(\"basisdb\\\\..*\");\n            connector.rollback();//\n            int totalEmptyCount = 120;\n            while (emptyCount < totalEmptyCount)\n            {\n                // 获取指定数量的数据\n                Message message = connector.getWithoutAck(batchSize);\n                long batchId = message.getId();\n                int size = message.getEntries().size();\n                if (batchId == -1 || size == 0)\n                {\n                    emptyCount++;\n                    try\n                    {\n                        Thread.sleep(1000);\n                    }\n                    catch (InterruptedException e)\n                    {\n                    }\n                }\n                else\n                {\n                    emptyCount = 0;\n                    printEntry(message.getEntries());\n                }\n                // 提交确认\n                connector.ack(batchId);\n                // connector.rollback(batchId); // 处理失败, 回滚数据\n            }\n            System.out.println(\"empty too many times, exit\");\n        }\n        finally\n        {\n            connector.disconnect();\n        }\n    }\n\n    private static void printEntry(List<CanalEntry.Entry> entrys)\n    {\n        for (CanalEntry.Entry entry : entrys)\n        {\n            // 事物数据不处理\n            if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN\n                    || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND)\n            {\n                continue;\n            }\n\n            if (entry.getEntryType() != CanalEntry.EntryType.ROWDATA)\n            {\n                continue;\n            }\n\n            System.out.println(\"Db name:\" + entry.getHeader().getSchemaName());\n            System.out.println(\"table name: \" + entry.getHeader().getTableName());\n\n            CanalEntry.RowChange rowChange = null;\n            try\n            {\n                rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());\n            }\n            catch (Exception e)\n            {\n                throw new RuntimeException(\n                        \"ERROR ## parser of eromanga-event has an error,data:\" + entry.toString(), e);\n            }\n\n            //是否是ddl变更操作，比如create table/drop table\n            if (rowChange.getIsDdl())\n            {\n                //具体的ddl sql\n                System.out.println(rowChange.getSql());\n            }\n\n            // RowData --具体insert/update/delete的变更数据，可为多条，1个binlog event事件可对应多条变更，比如批处理\n            for (CanalEntry.RowData rowData : rowChange.getRowDatasList())\n            {\n                //insert只有after columns, delete只有before columns，而update则会有before / after columns数据.\n                //变更前的字段数据\n                List<CanalEntry.Column> beforeColumns = rowData.getBeforeColumnsList();\n                //变更后的字段数据\n                List<CanalEntry.Column> afterColumns = rowData.getAfterColumnsList();\n\n                switch (rowChange.getEventType())\n                {\n                    case INSERT:\n                    case UPDATE:\n                        System.out.print(\"UPSERT \");\n                        printColumns(rowData.getAfterColumnsList());\n\n                        if (\"retl_buffer\".equals(entry.getHeader().getTableName()))\n                        {\n                            String tableName = rowData.getAfterColumns(1).getValue();\n                            String pkValue = rowData.getAfterColumns(2).getValue();\n                            System.out.println(\"SELECT * FROM \" + tableName + \" WHERE id = \" + pkValue);\n                        }\n                        break;\n\n                    case DELETE:\n                        System.out.print(\"DELETE \");\n                        printColumns(rowData.getBeforeColumnsList());\n                        break;\n                    case QUERY:\n                        System.out.println(rowChange.getSql());\n                    default:\n                        break;\n                }\n            }\n        }\n    }\n\n    /**\n     * index\n     * <p>\n     * sqlType     [jdbc type]\n     * <p>\n     * name        [字段名]\n     * <p>\n     * isKey       [是否为主键]\n     * <p>\n     * updated     [是否发生过变更]\n     * <p>\n     * isNull      [值是否为null]\n     * <p>\n     * value       [具体的内容，注意为string文本]\n     *\n     * @param columns\n     */\n    private static void printColumns(List<CanalEntry.Column> columns)\n    {\n        // 获取操作后完整的整条记录\n        String line = columns.stream().map(column -> column.getName() + \"=\" + column.getValue())\n                .collect(Collectors.joining(\",\"));\n        System.out.println(line);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/CanalSimpleApplication.java",
    "content": "package com.xiao.springcloud;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]: Canal+Disruptor 集成到springboot 案列\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 09:00\n * @since JDK 1.8\n */\n@SpringBootApplication\npublic class CanalSimpleApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(CanalSimpleApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/canal/CanalClientService.java",
    "content": "package com.xiao.springcloud.canal;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.otter.canal.client.CanalConnector;\nimport com.alibaba.otter.canal.client.CanalConnectors;\nimport com.alibaba.otter.canal.protocol.CanalEntry;\nimport com.alibaba.otter.canal.protocol.Message;\nimport com.alibaba.otter.canal.protocol.exception.CanalClientException;\nimport com.xiao.springcloud.disruptor.DisruptorProducer;\nimport com.xiao.springcloud.disruptor.DisruptorThreadFactory;\nimport com.xiao.springcloud.disruptor.TableData;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.stereotype.Component;\n\nimport java.net.InetSocketAddress;\nimport java.util.*;\nimport java.util.concurrent.*;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\n/**\n * [简要描述]: Canal客户端服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 15:27\n * @since JDK 1.8\n */\n@Component\n@Slf4j\npublic class CanalClientService implements DisposableBean, ApplicationListener<ContextRefreshedEvent>\n{\n\n    private CanalConfig canalConfig;\n\n    // disruptor异步队列\n    private DisruptorProducer disruptorProducer;\n\n    //定时任务检查 canal连接状态\n    private ScheduledExecutorService scheduledExecutorService;\n\n    //canal线程处理，不阻塞springboot主流程\n    private ExecutorService canalExecutor;\n\n    private static volatile boolean start;\n\n    private CanalConnector connector;\n\n    //需要监听过滤的一些表\n    private static Set<String> tableNames = new HashSet<>();\n\n    static\n    {\n        //初始化一些需要监听的表\n        tableNames.add(\"t_table_test\");\n    }\n\n    @Autowired\n    public CanalClientService(CanalConfig canalConfig, DisruptorProducer disruptorProducer)\n    {\n        this.canalConfig = canalConfig;\n        this.disruptorProducer = disruptorProducer;\n    }\n\n    @Override\n    public void destroy() throws Exception\n    {\n        log.error(\">>> 即将关闭Canal连接，销毁线程池.....\");\n        if (start)\n        {\n            try\n            {\n                connector.disconnect();\n            }\n            catch (CanalClientException e)\n            {\n                log.error(\">>> 关闭Canal连接异常：\", e);\n            }\n        }\n        canalExecutor.shutdown();\n        scheduledExecutorService.shutdown();\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)\n    {\n\n        log.info(\">>> Canal启动......\");\n        init();\n        // 执行启动\n        canalExecutor.execute(() -> start());\n        // 启动后5S开始检查connector的状态，每个2两分钟执行一次\n        scheduledExecutorService.scheduleAtFixedRate(() -> check(), 1, 2, TimeUnit.MINUTES);\n\n    }\n\n    private void start()\n    {\n        try\n        {\n            connector.connect();\n            connector.subscribe(canalConfig.getListenerDb() + \"\\\\..*\");\n            start = true;\n            log.info(\">>> Canal连接成功，订阅DB：{}下所有表信息\", canalConfig.getListenerDb());\n        }\n        catch (CanalClientException e)\n        {\n            log.error(\">>> Canal服务连接失败：\", e);\n            start = false;\n        }\n\n        if (start)\n        {\n            processBinlog();\n        }\n    }\n\n    private void processBinlog()\n    {\n        //每一次拉取100条数据\n        int batchSize = 100;\n        Message msg;\n        while (true)\n        {\n            try\n            {\n                msg = connector.getWithoutAck(batchSize);\n                long batchId = msg.getId();\n                int size = msg.getEntries().size();\n                //没有数据，休眠5秒\n                if (batchId < 0 || size == 0)\n                {\n                    try\n                    {\n                        Thread.sleep(5000);\n                    }\n                    catch (InterruptedException e)\n                    {\n                        log.error(\">>> 休眠线程中断.......\");\n                    }\n                }\n                else\n                {\n                    // 数据处理\n                    processData(msg.getEntries());\n                }\n                connector.ack(batchId);\n            }\n            catch (Exception e)\n            {\n                // 客户端异常，中断当前循环，等待定时任务重连操作\n                log.error(\">>> Canal 客户端异常，中断操作，并断开现有连接，等待定时任务定期重连操作...\", e);\n                this.close();\n                break;\n            }\n        }\n    }\n\n    private void processData(List<CanalEntry.Entry> entrys)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"接收到需要处理数据，总数量：{}\", entrys.size());\n        }\n\n        List<TableData> tableDataList = new ArrayList<>(entrys.size());\n        // 表名\n        String tableName;\n        TableData tableData;\n        CanalEntry.RowChange rowChange;\n        for (CanalEntry.Entry entry : entrys)\n        {\n            // 事物数据不处理\n            if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN\n                    || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND)\n            {\n                continue;\n            }\n\n            if (entry.getEntryType() != CanalEntry.EntryType.ROWDATA)\n            {\n                continue;\n            }\n\n            //获取表名\n            tableName = entry.getHeader().getTableName();\n\n            //仅处理部分表接口数据\n            if (tableNames.contains(tableName))\n            {\n                try\n                {\n                    rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());\n                    // RowData --具体insert/update/delete的变更数据，可为多条，1个binlog event事件可对应多条变更，比如批处理\n                    // insert 只有after数据，delete只有 before数据，update会有after和before数据\n                    for (CanalEntry.RowData rowData : rowChange.getRowDatasList())\n                    {\n                        switch (rowChange.getEventType())\n                        {\n                            //当前仅处理Insert和更新数据\n                            case INSERT:\n                            case UPDATE:\n                                tableData = new TableData();\n                                tableData.setTableName(tableName);\n                                tableData.setId(parseKey(rowData.getAfterColumnsList()));\n                                tableDataList.add(tableData);\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                }\n                catch (Exception e)\n                {\n                    log.error(\"当前行数据解析错误：\", e);\n                }\n            }\n        }\n        if (CollectionUtil.isNotEmpty(tableDataList))\n        {\n            //发送数据到异步队列框架\n            disruptorProducer.send(tableDataList);\n        }\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"接收到Mysql更新数据，总数量：{}\", tableDataList.size());\n        }\n    }\n\n    /**\n     * 解析主键KEY<br>\n     * CanalEntry.Column字段：<br>\n     * <p>\n     * sqlType     [jdbc type]\n     * <p>\n     * name        [字段名]\n     * <p>\n     * isKey       [是否为主键]\n     * <p>\n     * updated     [是否发生过变更]\n     * <p>\n     * isNull      [值是否为null]\n     * <p>\n     * value       [具体的内容，注意为string文本]\n     *\n     * @param columns\n     */\n    private Long parseKey(List<CanalEntry.Column> columns)\n    {\n        // 获取操作后完整的整条记录\n        String line = columns.stream().map(column -> column.getName() + \"=\" + column.getValue())\n                .collect(Collectors.joining(\",\"));\n        //只保留主键Key的数据\n        Stream<CanalEntry.Column> columnStream = columns.stream().filter(column -> column.getIsKey());\n        // 返回第一个数据\n        Optional<CanalEntry.Column> first = columnStream.findFirst();\n        return Long.parseLong(first.get().getValue());\n    }\n\n    private void check()\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\">>> 开始执行检测Canal连接状态...\");\n        }\n        if (!start)\n        {\n            log.warn(\">>> 开始执行重连Canal服务...\");\n            this.start();\n        }\n    }\n\n    private void init()\n    {\n        log.info(\">>> 初始化Canal连接信息.......\");\n        int threads = Runtime.getRuntime().availableProcessors();\n        scheduledExecutorService = new ScheduledThreadPoolExecutor(threads, DisruptorThreadFactory\n                .create(\"Scheduled check Canal connector-\", true));\n\n        canalExecutor = Executors.newSingleThreadExecutor(DisruptorThreadFactory.create(\"Canal servers-\", true));\n\n        if (canalConfig.isCluster())\n        {\n            log.info(\">>> 建立ZK集群Canal连接信息：{}\", canalConfig.getZkServers());\n            connector = CanalConnectors\n                    .newClusterConnector(canalConfig.getZkServers(), canalConfig.getDestination(), canalConfig\n                            .getUserName(), canalConfig.getPassword());\n        }\n        else\n        {\n            log.info(\">>> 建立单Canal连接信息：{}\", canalConfig.getHostName());\n            connector = CanalConnectors.newSingleConnector(new InetSocketAddress(canalConfig.getHostName(), canalConfig\n                    .getPort()), canalConfig.getDestination(), canalConfig.getUserName(), canalConfig.getPassword());\n        }\n    }\n\n    private void close()\n    {\n        try\n        {\n            if (start)\n            {\n                connector.disconnect();\n            }\n        }\n        catch (CanalClientException e)\n        {\n            log.error(\"关闭Canal连接错误：\", e);\n        }\n        finally\n        {\n            start = false;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/canal/CanalConfig.java",
    "content": "package com.xiao.springcloud.canal;\n\nimport lombok.Data;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * [简要描述]: Canal服务配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 15:18\n * @since JDK 1.8\n */\n@Configuration\n@Data\npublic class CanalConfig\n{\n    @Value(\"${spring.cache.server.cluster:false}\")\n    private boolean cluster;\n\n    @Value(\"${spring.cache.server.hostName:localhost}\")\n    private String hostName;\n\n    @Value(\"${spring.cache.server.port:11111}\")\n    private int port;\n\n    @Value(\"${spring.cache.server.destination:example}\")\n    private String destination;\n\n    @Value(\"${spring.cache.server.userName:}\")\n    private String userName;\n\n    @Value(\"${spring.cache.server.password:}\")\n    private String password;\n\n    @Value(\"${spring.cache.server.zkServers:}\")\n    private String zkServers;\n\n    @Value(\"${spring.cache.server.dbName:}\")\n    private String listenerDb;\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DataEvent.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: 定义事件\n * [详细描述]:通过 Disruptor 进行交换的数据类型\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:12\n * @since JDK 1.8\n */\n@Data\npublic class  DataEvent\n{\n    private TableData data;\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DataEventFactory.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport com.lmax.disruptor.EventFactory;\n\n/**\n * [简要描述]: 定义事件工厂\n * [详细描述]: 定义了如何实例化定义的事件(Event)\n * Disruptor 通过 EventFactory 在 RingBuffer 中预创建 Event 的实例<p>\n * 一个 Event 实例实际上被用作一个“数据槽”，发布者发布前，先从 RingBuffer 获得一个 Event 的实例，然后往 Event 实例中填充数据，<br>\n * 之后再发布到 RingBuffer 中，之后由 Consumer 获得该 Event 实例并从中读取数据<br>\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:17\n * @since JDK 1.8\n */\npublic class DataEventFactory implements EventFactory<DataEvent>\n{\n    @Override\n    public DataEvent newInstance()\n    {\n        return new DataEvent();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DisruptorConsumer.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport com.lmax.disruptor.EventHandler;\nimport com.lmax.disruptor.WorkHandler;\nimport com.xiao.springcloud.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.concurrent.Executor;\n\n/**\n * [简要描述]: Disruptor消费者之Handler。\n * [详细描述]:\n * <br>\n * 单消费者：实现EventHandler接口(DataEvent dataEvent, long sequence, boolean endOfBatch)方法<br>\n * 多消费者：实现WorkHandler接口的onEvent(DataEvent dataEvent)方法<br>\n * --广播：对于多个消费者，每条信息会达到所有的消费者，被多次处理，一般每个消费者业务逻辑不通，用于同一个消息的不同业务逻辑处理<br>\n * --消费者之间无依赖关系 disruptor.handleEventsWith(handler1,handler2,handler3);<br>\n * --假设handler3必须在handler1，handler2处理完成后进行处理:disruptor.handleEventsWith(handler1,handler2).then(handler3);<br>\n * --分组：对于同一组内的多个消费者，每条信息只会被组内一个消费者处理，每个消费者业务逻辑一般相同，用于多消费者并发处理一组消息<br>\n * --假设handler1，handler2，handler3都实现了WorkHandler，则调用以下代码就可以实现分组：<br>\n * --disruptor.handleEventsWithWorkerPool(handler1, handler2, handler3);<br>\n * 广播和分组之间也是可以排列组合的<br>\n * link：http://www.importnew.com/27652.html\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:20\n * @since JDK 1.8\n */\n@Slf4j\npublic class DisruptorConsumer implements EventHandler<DataEvent>, WorkHandler<DataEvent>\n{\n    //具体的服务\n    private DisruptorService disruptorService;\n\n    /**\n     *\n     */\n    private final Executor executor;\n\n    public DisruptorConsumer(DisruptorService disruptorService, Executor executor)\n    {\n        this.disruptorService = disruptorService;\n        this.executor = executor;\n    }\n\n    @Override\n    public void onEvent(DataEvent dataEvent) throws Exception\n    {\n        if (log.isDebugEnabled())\n        {\n            log.info(\"接受到数据更新请求  >>>\" + dataEvent);\n        }\n        executor.execute(() ->\n        {\n            disruptorService.execute(dataEvent.getData());\n        });\n\n    }\n\n    @Override\n    public void onEvent(DataEvent dataEvent, long sequence, boolean endOfBatch) throws Exception\n    {\n        if (log.isDebugEnabled())\n        {\n            log.info(\"接受到数据更新请求  >>>{}\", dataEvent);\n            log.info(\"Sequence:{}\", sequence);\n            log.info(\"End Of Batch：{}\", endOfBatch);\n        }\n        this.onEvent(dataEvent);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DisruptorExceptionHandler.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport com.lmax.disruptor.ExceptionHandler;\nimport com.xiao.springcloud.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * [简要描述]: Disruptor自定义异常处理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:42\n * @since JDK 1.8\n */\n@Slf4j\npublic class DisruptorExceptionHandler implements ExceptionHandler<DataEvent>\n{\n    private DisruptorService disruptorService;\n\n    public DisruptorExceptionHandler(DisruptorService disruptorService)\n    {\n        this.disruptorService = disruptorService;\n    }\n\n    /**\n     * 事件处理异常\n     */\n    @Override\n    public void handleEventException(Throwable throwable, long sequence, DataEvent dataEvent)\n    {\n        //事件处理异常里面进行补偿执行\n        disruptorService.execute(dataEvent.getData());\n        log.error(\">>> Disruptor事件处理异常，进行立即执行补偿操作..........\");\n        log.error(\">>> 异常信息如下：\", throwable.getMessage());\n    }\n\n    /**\n     * 启动异常\n     *\n     * @param throwable\n     */\n    @Override\n    public void handleOnStartException(Throwable throwable)\n    {\n        log.error(\">>> Disruptor 启动异常：{}\", throwable.getMessage());\n    }\n\n    /**\n     * 关闭异常\n     *\n     * @param throwable\n     */\n    @Override\n    public void handleOnShutdownException(Throwable throwable)\n    {\n        log.error(\">>> Disruptro 关闭异常：{}\", throwable.getMessage());\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DisruptorProducer.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.lmax.disruptor.EventTranslatorOneArg;\nimport com.lmax.disruptor.RingBuffer;\nimport com.lmax.disruptor.WaitStrategy;\nimport com.lmax.disruptor.YieldingWaitStrategy;\nimport com.lmax.disruptor.dsl.Disruptor;\nimport com.lmax.disruptor.dsl.ProducerType;\nimport com.xiao.springcloud.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.concurrent.*;\n\n/**\n * [简要描述]: Disruptor生产者\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:37\n * @since JDK 1.8\n */\n@Component\n@Slf4j\npublic class DisruptorProducer implements DisposableBean, ApplicationListener<ContextRefreshedEvent>\n{\n    /**\n     * RingBuffer 大小，必须是 2 的 N 次方；\n     */\n    private int ringBufferSize = 1024 * 1024;\n\n    private Disruptor<DataEvent> disruptor;\n\n    private boolean isMultiProducer;\n\n    /**\n     * 等待策略\n     * 例如，BlockingWaitStrategy、SleepingWaitStrategy、YieldingWaitStrategy 等，其中，\n     * BlockingWaitStrategy 是最低效的策略，但其对CPU的消耗最小并且在各种不同部署环境中能提供更加一致的性能表现；\n     * SleepingWaitStrategy 的性能表现跟 BlockingWaitStrategy 差不多，对 CPU 的消耗也类似，但其对生产者线程的影响最小，适合用于异步日志类似的场景；\n     * YieldingWaitStrategy 的性能是最好的，适合用于低延迟的系统。在要求极高性能且事件处理线数小于 CPU 逻辑核心数的场景中，推荐使用此策略；例如，CPU开启超线程的特性。\n     */\n    private WaitStrategy waitStrategy;\n\n    private RingBuffer<DataEvent> ringBuffer;\n\n    private volatile boolean isStart;\n\n    private DisruptorService disruptorService;\n\n    private ExecutorService executor;\n    private int threads;\n\n    @Autowired\n    public DisruptorProducer(DisruptorService disruptorService)\n    {\n\n        threads = Runtime.getRuntime().availableProcessors();\n        this.disruptorService = disruptorService;\n\n        //单生产者\n        isMultiProducer = true;\n        ProducerType producerType = ProducerType.SINGLE;\n        if (isMultiProducer)\n        {\n            //多生产者\n            producerType = ProducerType.MULTI;\n        }\n        // 等待策略\n        waitStrategy = new YieldingWaitStrategy();\n\n        //初始化disruptor\n        disruptor = new Disruptor<>(new DataEventFactory(), ringBufferSize, DisruptorThreadFactory\n                .create(\"Disruptor Main-\", false), producerType, waitStrategy);\n\n        executor = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), DisruptorThreadFactory\n                .create(\"Disruptor Producer-\", false), new ThreadPoolExecutor.AbortPolicy());\n    }\n\n    /**\n     * [简要描述]:发送事件处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param dataList : 待处理的数据\n     * llxiao  2019/3/25 - 15:10\n     **/\n    public void send(List<TableData> dataList)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"批量发送数据给消费者，总数量：{}\", CollectionUtil.isNotEmpty(dataList) ? 0 : dataList.size());\n        }\n        if (CollectionUtil.isNotEmpty(dataList))\n        {\n            executor.execute(() ->\n            {\n                for (TableData tableData : dataList)\n                {\n                    translator(tableData);\n                }\n            });\n        }\n    }\n\n    private void translator(TableData tableData)\n    {\n        EventTranslatorOneArg<DataEvent, TableData> eventTranslatorOneArg = (event, sequence, message1) -> event\n                .setData(tableData);\n        ringBuffer.publishEvent(eventTranslatorOneArg, tableData);\n    }\n\n    @Override\n    public void destroy() throws Exception\n    {\n        if (isStart)\n        {\n            //关闭 disruptor，方法会堵塞，直至所有的事件都得到处理；\n            disruptor.shutdown();\n        }\n        executor.shutdown();\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)\n    {\n        log.info(\">>> Disruptor producer 启动......\");\n        doStart();\n    }\n\n    private void doStart()\n    {\n        //CPU可使用数量\n        final Executor executor = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), DisruptorThreadFactory\n                .create(\"Disruptor consumer-\", false), new ThreadPoolExecutor.AbortPolicy());\n        DisruptorConsumer[] disruptorConsumers = new DisruptorConsumer[threads];\n        for (int i = 0; i < threads; i++)\n        {\n            disruptorConsumers[i] = new DisruptorConsumer(disruptorService, executor);\n        }\n        //设置消费者Handler\n        // 广播 消费者之间无依赖关系\n        //        disruptor.handleEventsWith(ArrayUtil.toArray(handlers, EventHandler.class));\n        // 关闭 消费间有依赖关系,假设：2号需要在0号和1号处理完才能进行\n        //        disruptor.handleEventsWith(handlers.get(0),handlers.get(1)).then(handlers.get(2));\n        // 分组  List<WorkHandler> workHandlers\n        disruptor.handleEventsWithWorkerPool(disruptorConsumers);\n\n        //设置异常处理\n        disruptor.setDefaultExceptionHandler(new DisruptorExceptionHandler(disruptorService));\n\n        ringBuffer = disruptor.start();\n        this.isStart = true;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/DisruptorThreadFactory.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 14:49\n * @since JDK 1.8\n */\npublic class DisruptorThreadFactory implements ThreadFactory\n{\n    private static final AtomicLong THREAD_NUMBER = new AtomicLong(1);\n\n    private static final ThreadGroup THREAD_GROUP = new ThreadGroup(\"disruptor\");\n\n    private static volatile boolean daemon;\n\n    private final String namePrefix;\n\n    private DisruptorThreadFactory(final String namePrefix, final boolean daemon)\n    {\n        this.namePrefix = namePrefix;\n        DisruptorThreadFactory.daemon = daemon;\n    }\n\n    /**\n     * Constructs a new {@code Thread}.  Implementations may also initialize\n     * priority, name, daemon status, {@code ThreadGroup}, etc.\n     *\n     * @param r a runnable to be executed by new thread instance\n     * @return constructed thread, or {@code null} if the request to\n     * create a thread is rejected\n     */\n    @Override\n    public Thread newThread(Runnable r)\n    {\n        Thread thread = new Thread(THREAD_GROUP, r,\n                THREAD_GROUP.getName() + \"-\" + namePrefix + \"-\" + THREAD_NUMBER.getAndIncrement());\n        thread.setDaemon(daemon);\n        if (thread.getPriority() != Thread.NORM_PRIORITY)\n        {\n            thread.setPriority(Thread.NORM_PRIORITY);\n        }\n        return thread;\n    }\n\n    /**\n     * 自定义线程factory\n     *\n     * @param namePrefix\n     * @param daemon\n     * @return\n     */\n    public static ThreadFactory create(final String namePrefix, final boolean daemon)\n    {\n        return new DisruptorThreadFactory(namePrefix, daemon);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/TableData.java",
    "content": "package com.xiao.springcloud.disruptor;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 09:48\n * @since JDK 1.8\n */\n@Data\npublic class TableData\n{\n    /**\n     * 主键ID\n     */\n    private Long id;\n\n    /**\n     * 表名\n     */\n    private String tableName;\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/service/DisruptorService.java",
    "content": "package com.xiao.springcloud.disruptor.service;\n\nimport com.xiao.springcloud.disruptor.TableData;\n\n/**\n * [简要描述]: 异步队列服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 09:50\n * @since JDK 1.8\n */\npublic interface DisruptorService\n{\n    /**\n     * [简要描述]:异步处理服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param tableData :\n     * llxiao  2019/3/25 - 9:51\n     **/\n    void execute(TableData tableData);\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/java/com/xiao/springcloud/disruptor/service/impl/DisruptorServiceImpl.java",
    "content": "package com.xiao.springcloud.disruptor.service.impl;\n\nimport com.xiao.springcloud.disruptor.TableData;\nimport com.xiao.springcloud.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: 异步队列服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 09:51\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class DisruptorServiceImpl implements DisruptorService, ApplicationListener<ContextRefreshedEvent>\n{\n\n    /**\n     * [简要描述]:异步处理服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param tableData :\n     * @return void\n     * llxiao  2019/3/25 - 9:51\n     **/\n    @Override\n    public void execute(TableData tableData)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"接受数据更新请求，更新表名:{},更新的主键为:{}\", tableData.getTableName(), tableData.getId());\n        }\n        if (null != tableData)\n        {\n            //业务处理 TODO\n        }\n    }\n\n    /**\n     * 初始化所有的service服务\n     */\n    private void initAllCacheService()\n    {\n        log.info(\">>> 初始化所有需要缓存的服务对象.....\");\n        //业务需要初始化一些处理\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)\n    {\n        initAllCacheService();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Canal/src/main/resources/application.properties",
    "content": "### canal config\n#是否集群,暂且支持zk的集群\nspring.canal.server.cluster=false\n  #canal服务\nspring.canal.server.hostName=192.168.206.210\nspring.canal.server.port=5555\nspring.canal.server.destination=example\nspring.canal.server.userName=\nspring.canal.server.password=\n  #ZK服务地址\nspring.canal.server.zkServers=\n  # 监听的数据库名称\nspring.canal.server.dbName=basisdb"
  },
  {
    "path": "SpringCloud-Common/README.md",
    "content": "公共包：<br>\n提供一些公共的组件：\n>feign的一些公共配置和一些坑的解决:requestmapping问题、服务内部交互异常和数据传输处理<br>\n>日志记录注解<br>\n>参数校验注解<br>\n"
  },
  {
    "path": "SpringCloud-Common/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/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <artifactId>SpringCloud-Demo</artifactId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <artifactId>SpringCloud-Common</artifactId>\n    <packaging>jar</packaging>\n\n    <properties>\n        <disruptor.version>3.4.2</disruptor.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12 使用logback slf4j包冲突警告问题，另外还有一个zookeeper的包-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <!--工具类-->\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>4.1.12</version>\n        </dependency>\n        <!-- fast json-->\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-collections</groupId>\n            <artifactId>commons-collections</artifactId>\n            <version>3.2.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.redisson</groupId>\n            <artifactId>redisson</artifactId>\n            <version>3.5.7</version>\n        </dependency>\n\n        <!--guava缓存cache-->\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <version>29.0-jre</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-cache</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.lmax</groupId>\n            <artifactId>disruptor</artifactId>\n            <version>${disruptor.version}</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Common/script/auto_deploy.sh",
    "content": "#!/bin/bash\n\n## jenkins 自动部署脚本   jekins 项目 Post Steps设置 启动该脚本，配置如下：\n#  BUILD_ID=DONTKILLME\n#  bash /home/omni-services/remote-deploy/auto_deploy.sh\n\nSERVICE_NAME=content-management-service\nJARPATH=/root/.jenkins/workspace/$SERVICE_NAME-perf/target/$SERVICE_NAME.jar\necho \"service name:$SERVICE_NAME\"\nSERVICE_HOME=/home/omni-services/$SERVICE_NAME\nJARFILE=$SERVICE_HOME/$SERVICE_NAME.jar\nBOOTSTRAP_FILE=$SERVICE_HOME/bootstrap.sh\n\necho \"=====service name: $SERVICE_NAME\"\necho \"=====service home: $SERVICE_HOME\"\necho \"=====service resouce jar path: $JARPATH\"\necho \"=====service bootstrap file: $BOOTSTRAP_FILE\"\necho \"=====service jar: $JARFILE\"\n\n## 停止原来的服务\necho \"-----Stop service\"\nbash $BOOTSTRAP_FILE stop\n\n## 备份原来的Jar包\necho \"-----Bach source jar file: $JARFILE\"\nmv $JARFILE $SERVICE_HOME/$SERVICE_NAME-`date \"+%Y-%m-%d %H:%M:%S\"`.jar\n\n## 复制新包\necho \"-----Copy $JARPATH to $SERVICE_HOME\"\ncp $JARPATH $SERVICE_HOME\nCOPYRULST=$?\n\n## 复制OK，开始启动\nif [ $COPYRULST -eq 0 ]; \nthen\n    echo \"-----Copy success,wait start service.....\"\n    bash $BOOTSTRAP_FILE start\n    RETVAL=$?\n    if [ $RETVAL -eq 0 ];\n    then\n       echo \"-----$SERVICE_NAME started!\"\n    else\n       echo \"-----$SERVICE_NAME start failed!\"\n    fi\nelse\n    echo \"-----Not exist $SERVICE_NAME jar\"\n    exit 1\nfi\n\n\n"
  },
  {
    "path": "SpringCloud-Common/script/bootstrap.sh",
    "content": "#!/bin/bash\n## 加载配置，避免获取不到java_home \nsource /etc/profile\n\nSERVICE_NAME=appname\nSERVICE_HOME=/home/admin/services\nPROG=$SERVICE_HOME/$SERVICE_NAME\nPIDFILE=$SERVICE_HOME/$SERVICE_NAME/$SERVICE_NAME.pid\ncd $SERVICE_HOME/$SERVICE_NAME\n\n# skywalking探针参数\nSKYWALKING_AGENT_PATH=/home/admin/agent/skywalking-agent.jar\nSKYWALKING_SERVCIE_NAME=$SERVICE_NAME\n\n# GC参数\nLOG_TIMESTAMP=`date \"+%Y%m%d%H%M%S\"`\nLOG_HOME=/data/logs/$SERVICE_NAME\nOOM_FILE=$LOG_HOME/oom-$LOG_TIMESTAMP.hprof\nGC_FILE=$LOG_HOME/gc-$LOG_TIMESTAMP.log\n\n\n#堆配置：服务模式(启动慢，一次编译，运行效率高)、最小内存512m、最大内存512m、年轻代大512m\nHEAP_OPTIONS=\"-server -Xms512m -Xmx512m -Xmn256m\"\n#栈配置：设置每个线程的栈大小，DK5.0以后每个线程栈大小为1M，依据实际情况设定。较少的值内存能生成更多的线程（受系统限制），较大的值可（如2M）能会再一定程度上降低性能。\n#STACKS_OPTIONS=-Xss128K\n## GC配置：gc详情、gc时间、gc日志文件位置、gc堆栈信息\nGC_OPTIONS=\"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$SERVICE_HOME/$SERVICE_NAME_gc.log -XX:+PrintHeapAtGC\"\n## gc收集器：Java提供串行收集器、并行收集器、并发收集器三种，串行收集器只适用于小数据量的情况，并行收集器主要以到达一定的吞吐量为目标\n# 并行垃圾收集器：配置仅对年轻代有效、并行线程数20(建议与处理器数目相等)\nGC_COLLECTOR_PARAL=\"-XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC\"\n## 老年代垃圾收集器：年老代垃圾收集方式为并行收集(1.6以后支持)\n# CMS垃圾收集器：初始标记->并发标记->并发预清理->重新标记->并发清理->并发重置(标记-清理 算法),CMS默认在老年代空间使用68%时候启动垃圾回收。可以通过-XX:CMSinitiatingOccupancyFraction=n来设置这个阀值。\n#GC_COLLECTOR_CMS=\"-XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=4\"\n## oom配置：OOM时导出堆到文件、导出OOM的路径\n#-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid ，即当程序OOM时，在D:/a.txt中将会生成线程的dump。\nOOM_OPTIONS=\"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$SERVICE_HOME/$SERVICE_NAME.dump\"\n## 类加载监控\n#CLASS_LOAD_MONITOR=\"-XX:+TraceClassLoading -XX:+PrintClassHistogram\"\n## 其他配置：新生的转老年代GC次数、禁止程序GC、set/get使用本地方法、加快编译、锁机制的性能改善\n#OTHER_OPTIONS=\"-XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking\"\n## jvm 参数配置\nJAVA_OPTS=\"$HEAP_OPTIONS $GC_OPTIONS $GC_COLLECTOR_PARAL $OOM_OPTIONS\"\n\n\ncd $SERVICE_HOME\n\nstatus() {\n    if [ -f $PIDFILE ]; then\n        PID=$(cat $PIDFILE)\n        if [ ! -x /proc/${PID} ]; then\n            return 1\n        else\n            return 0\n        fi\n    else\n        return 1\n    fi\n}\n\ncase \"$1\" in\n    start)\n        status\n        RETVAL=$?\n        if [ $RETVAL -eq 0 ]; then\n            echo \"-----$PIDFILE exists, process is already running or crashed\"\n            exit 1\n        fi\n\n        ##检测 java环境\n        if [ ! -n $JAVA_HOME ]; then\n           echo \"-----Please check JAVA_HOME!\"\n           echo \"-----Exit\"\n           exit 1\n        else\n           echo \"-----Jave home: $JAVA_HOME\"\n           echo \"-----Starting $PROG ...\"\n           echo \"-----Java options: $JAVA_OPTS\"\n           #nohup java $JAVA_OPTS -jar $JARFILE  > $LOG_FILE 2>&1 &\n           # GC参数+skywalking探针设置\n           nohup  java -server -Xms2048m -Xmx2048m -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$OOM_FILE -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:$GC_FILE  -javaagent:$SKYWALKING_AGENT_PATH -Dskywalking.agent.service_name=$SKYWALKING_SERVCIE_NAME -jar $SERVICE_HOME/$SERVICE_NAME/$SERVICE_NAME.jar  > $SERVICE_NAME.log 2>&1 &\n\n           RETVAL=$?\n           if [ $RETVAL -eq 0 ]; then\n               echo \"-----$PROG is started\"\n               echo $! > $PIDFILE\n               exit 0\n           else\n               echo \"-----Stopping $PROG\"\n               rm -f $PIDFILE\n               exit 1\n           fi\n        fi\n        ;;\n    stop)\n        status\n        RETVAL=$?\n        if [ $RETVAL -eq 0 ]; then\n            echo \"-----Shutting down $PROG\"\n            kill -9 `cat $PIDFILE`\n            RETVAL=$?\n            if [ $RETVAL -eq 0 ]; then\n                LS_DATE=`date +%Y%m%d`\n                BACK_LOG=$SERVICE_NAME-$LS_DATE.log\n                BACK_LOG_FILE=$SERVICE_HOME/$BACK_LOG\n                ## 备份日志文件\n                if [  -f \"$BACK_LOG_FILE\" ]; then\n                    echo \"-----Back log file $BACK_LOG exist and copy log to back file!\"\n                    echo \"--------------------------------------------------------------------------------------------------------------------\" >> $BACK_LOG\n                    echo `date \"+%Y-%m-%d %H:%M:%S\"` >> $BACK_LOG\n                    echo \"-----------------------------------------重新启动-------------------------------------------------------------------\" >> $BACK_LOG\n                    cat $LOG_FILE >> $BACK_LOG\n                    ## 删除日志文件\n                    rm -f $LOG_FILE\n                else\n                    echo \"-----Back log file to $BACK_LOG....\"\n                    mv $LOG_FILE $BACK_LOG\n                fi\n                ## 删除Pid文件\n                rm -f $PIDFILE\n            else\n                echo \"-----Failed to stopping $PROG\"\n            fi\n        fi\n        ;;\n    status)\n        status\n        RETVAL=$?\n        if [ $RETVAL -eq 0 ]; then\n            PID=$(cat $PIDFILE)\n            echo \"-----$PROG is running ($PID)\"\n        else\n            echo \"-----$PROG is not running\"\n        fi\n        ;;\n    restart)\n        $0 stop\n        $0 start\n        ;;\n    *)\n        echo \"Usage: $0 {start|stop|restart|status}\"\n        ;;\nesac\n"
  },
  {
    "path": "SpringCloud-Common/script/remote_deploy.sh",
    "content": "#!/bin/bash\n\n## jenkins 自动部远程署脚本，需要配置两个服务器之间免密登录\n## 免登陆配置参考：https://blog.csdn.net/u011186019/article/details/51737760?utm_source=blogxgwz4\n##jekins 项目 Post Steps设置 启动该脚本，配置如下：\n#BUILD_ID=DONTKILLME   -- 表示Jenkins执行完后不杀死该进程，否则会再jenkins执行完后杀死启动的进程\n#bash /home/omni-services/remote-deploy/remote-deploy.sh\n\nSERVICE_NAME=appname\nREMOTE_SERVICES_HOME=/home/services\nREMOTE_SERVICE_IP=目标服务器IP\nREMOTE_SERVICE_HOME=$REMOTE_SERVICES_HOME/$SERVICE_NAME\n##服务jar\nREMOTE_SERVICE_JAR=$REMOTE_SERVICE_HOME/$SERVICE_NAME.jar\n##启动脚本\nREMOTE_SERVICE_BOOTSTRAP=$REMOTE_SERVICE_HOME/bootstrap.sh\n##jenkins编译完成后服务Jar包位置\nLOCAL_JAR_PATH=/root/.jenkins/workspace/$SERVICE_NAME-perf/target/$SERVICE_NAME.jar\n\necho \"=============Service name: $SERVICE_NAME\"\necho \"=============Remote services home: $REMOTE_SERVICES_HOME\"\necho \"=============Remote server ip: $REMOTE_SERVICE_IP\"\necho \"=============Remote service home: $REMOTE_SERVICE_HOME\"\necho \"=============Remote service jar: $REMOTE_SERVICE_JAR\"\necho \"=============Remote service bootstrap file: $REMOTE_SERVICE_BOOTSTRAP\"\n\n## 远程操作，停止并备份原来的服务\necho \"-----Stop and Delete remote service: $SERVICE_NAME\"\nssh -T root@$REMOTE_SERVICE_IP << remotessh\nsh $REMOTE_SERVICE_BOOTSTRAP stop\nmv $REMOTE_SERVICE_JAR $REMOTE_SERVICE_HOME/$SERVICE_NAME-`date \"+%Y-%m-%d %H:%M:%S\"`.jar\nexit\nremotessh\n\n##复制一份新的服务Jar\necho \"-----Scp $LOCAL_JAR_PATH to $REMOTE_SERVICE_HOME\"\nscp $LOCAL_JAR_PATH root@$REMOTE_SERVICE_IP:$REMOTE_SERVICE_HOME \n\n##远程启动服务\necho \"-----Start remote service\"\nssh -T root@$REMOTE_SERVICE_IP << remotessh\nsh $REMOTE_SERVICE_BOOTSTRAP start\nexit\nremotessh\n\nexit\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/SkywalkingService.java",
    "content": "/*\n * Winner \n * 文件名  :SkywalkingService.java\n * 创建人  :llxiao\n * 创建时间:2018年3月29日\n*/\n\npackage com.xiao.springcloud.demo.common;\n\n/**\n * [简要描述]:<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年3月29日\n * @since 项目名称 项目版本\n */\npublic interface SkywalkingService\n{\n    String skywalking(String test);\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/README.md",
    "content": "1. redisson yml配置加载，支持单机、集群、云托管、sentinel模式<br>\n2. 配置文件中添加配置文件即可开启redisson的配置：<br>\n`` redisson.fileName: redission-cluster(自定义)``\n3. 提供缓存基本服务和分布式服务: <br>\n``> CacheService 提供缓存基础服务`` <br>\n``> DistributedService 提供分布式**可重入公平/非公平锁**、**读写锁**、**闭锁**``<br>\n\n20181018  添加本地缓存\n1. 引入spring cache和guava jar包\n```\n       <dependency> \n            <groupId>com.google.guava</groupId> \n            <artifactId>guava</artifactId> \n            <version>25.1-jre</version> \n        </dependency> \n        <dependency> \n            <groupId>org.springframework.boot</groupId> \n            <artifactId>spring-boot-starter-cache</artifactId> \n        </dependency> \n```\n2. 代码方法上使用\n```\n@Cacheable(value = \"methodName\", key = \"'methodName'.concat({#param1}).concat({#parma2})\")\n```\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/code/FastJsonCodec.java",
    "content": "package com.xiao.springcloud.demo.common.cache.code;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.buffer.ByteBufAllocator;\nimport io.netty.buffer.ByteBufInputStream;\nimport io.netty.buffer.ByteBufOutputStream;\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.client.codec.Codec;\nimport org.redisson.client.handler.State;\nimport org.redisson.client.protocol.Decoder;\nimport org.redisson.client.protocol.Encoder;\n\nimport java.io.IOException;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author zhdong\n * @version 1.0,  2018/9/20\n * @since JDK 1.8\n */\n@Slf4j\npublic class FastJsonCodec implements Codec\n{\n\n    public static final FastJsonCodec INSTANCE = new FastJsonCodec();\n    private Encoder encoder = null;\n    private Decoder<Object> decoder = null;\n    private Encoder keyEncoder = null;\n    private Decoder<Object> keyDecoder = null;\n\n    public FastJsonCodec()\n    {\n        this.encoder = new Encoder()\n        {\n            public ByteBuf encode(Object in) throws IOException\n            {\n                ByteBuf out = ByteBufAllocator.DEFAULT.buffer();\n                try\n                {\n                    SerializerObject serial = new SerializerObject(in);\n                    ByteBufOutputStream os = new ByteBufOutputStream(out);\n\n                    JSON.writeJSONString(os, serial, SerializerFeature.WriteMapNullValue,  //是否输出值为null的字段,默认为false\n                            SerializerFeature.DisableCircularReferenceDetect, //消除循环引用\n                            SerializerFeature.WriteClassName,//写入类名便于序列化解析\n                            SerializerFeature.WriteNullStringAsEmpty);\n                    return os.buffer();\n                }\n                catch (IOException var4)\n                {\n                    out.release();\n                    throw var4;\n                }\n            }\n        };\n        this.decoder = new Decoder<Object>()\n        {\n            public Object decode(ByteBuf buf, State state) throws IOException\n            {\n                SerializerObject serial = JSON.parseObject(new ByteBufInputStream(buf), SerializerObject.class);\n                return serial.getValue();\n            }\n        };\n\n        this.keyEncoder = new Encoder()\n        {\n            public ByteBuf encode(Object in) throws IOException\n            {\n                ByteBuf out = ByteBufAllocator.DEFAULT.buffer();\n                try\n                {\n                    ByteBufOutputStream os = new ByteBufOutputStream(out);\n                    JSON.writeJSONString(os, in);\n                    return os.buffer();\n                }\n                catch (IOException var4)\n                {\n                    out.release();\n                    throw var4;\n                }\n            }\n        };\n\n        this.keyDecoder = new Decoder<Object>()\n        {\n            public Object decode(ByteBuf buf, State state) throws IOException\n            {\n                return JSON.parseObject(new ByteBufInputStream(buf), String.class);\n            }\n        };\n\n    }\n\n    @Override\n    public Decoder<Object> getMapValueDecoder()\n    {\n        return decoder;\n    }\n\n    @Override\n    public Encoder getMapValueEncoder()\n    {\n        return encoder;\n    }\n\n    @Override\n    public Decoder<Object> getMapKeyDecoder()\n    {\n        return keyDecoder;\n    }\n\n    @Override\n    public Encoder getMapKeyEncoder()\n    {\n        return keyEncoder;\n    }\n\n    @Override\n    public Decoder<Object> getValueDecoder()\n    {\n        return decoder;\n    }\n\n    @Override\n    public Encoder getValueEncoder()\n    {\n        return encoder;\n    }\n\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/code/SerializerObject.java",
    "content": "package com.xiao.springcloud.demo.common.cache.code;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\n\n/**\n * [简要描述]: 使用fastjson序列化的类\n * [详细描述]:\n *\n * @author zhdong\n * @version 1.0,  2018/9/21\n * @since JDK 1.8\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class SerializerObject implements Serializable\n{\n\n    private Object value;\n\n}\n\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/conf/RedissonConfig.java",
    "content": "package com.xiao.springcloud.demo.common.cache.conf;\n\nimport com.xiao.springcloud.demo.common.cache.code.FastJsonCodec;\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.Redisson;\nimport org.redisson.api.RedissonClient;\nimport org.redisson.config.Config;\nimport org.redisson.connection.balancer.RoundRobinLoadBalancer;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.net.URLConnection;\n\n@Configuration\n@Slf4j\n// 属性值存在该配置才会生效\n@ConditionalOnProperty(name = RedissonConfig.REDISSON_FILE_NAME)\npublic class RedissonConfig\n{\n    public static final String REDISSON_FILE_NAME = \"redisson.fileName\";\n\n    @Value(\"${spring.cloud.config.uri:}\")\n    private String configUrl;\n    @Value(\"${spring.cloud.config.label:}\")\n    private String label;\n    @Value(\"${spring.cloud.config.profile:}\")\n    private String profile;\n    /* redissoin配置文件名称 */\n    @Value(\"${redisson.fileName:redission}\")\n    private String redissionFileName;\n\n    // 配置中心读取ression.yml文件\n    private String getYamlFromConfig() throws IOException\n    {\n        String uri = configUrl + label + \"/\" + redissionFileName + \"-\" + profile + \".yml\";\n        log.info(\"redission配置文件uri:\" + uri);\n        URL url = new URL(uri);\n        URLConnection connection = url.openConnection();\n        StringBuilder buffer = new StringBuilder();\n        try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())))\n        {\n            String msg = null;\n            while ((msg = br.readLine()) != null)\n            {\n                buffer.append(msg).append(\"\\r\\n\");\n            }\n        }\n        return buffer.toString();\n    }\n\n    @Bean\n    public Config config() throws IOException\n    {\n\n        Config config = Config.fromYAML(getYamlFromConfig());\n        if (config.isClusterConfig())\n        {\n            config.useClusterServers().setLoadBalancer(new RoundRobinLoadBalancer());\n        }\n\n        return config;\n    }\n\n    @Bean(destroyMethod = \"shutdown\")\n    public RedissonClient redissonClient(Config config) throws IOException\n    {\n        log.info(\"create RedissonClient, config is : {}\", config.toJSON());\n\n        //序列化统一使用fastjson\n        config.setCodec(FastJsonCodec.INSTANCE);\n        return Redisson.create(config);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/dto/EntryDto.java",
    "content": "package com.xiao.springcloud.demo.common.cache.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/15 17:18\n * @since JDK 1.8\n */\n@Data\npublic class EntryDto<T>\n{\n    private String key;\n    private T value;\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/local/SpringGuavaCacheConfig.java",
    "content": "package com.xiao.springcloud.demo.common.cache.local;\n\nimport com.google.common.cache.CacheBuilder;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.guava.GuavaCacheManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]: guava+springcache实现本地缓存\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/29 17:28\n * @since JDK 1.8\n */\n@Configuration\npublic class SpringGuavaCacheConfig\n{\n    @Bean\n    public CacheManager cacheManager()\n    {\n        GuavaCacheManager cacheManager = new GuavaCacheManager();\n        cacheManager\n                // 3S过期时间，初始容量1000个，最大10000个\n                .setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(3, TimeUnit.SECONDS).initialCapacity(1000)\n                        .maximumSize(10000));\n        return cacheManager;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/service/CacheService.java",
    "content": "package com.xiao.springcloud.demo.common.cache.service;\n\nimport com.xiao.springcloud.demo.common.cache.dto.EntryDto;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * [简要描述]: 缓存服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/11 13:45\n * @since JDK 1.8\n */\npublic interface CacheService\n{\n\n    /**\n     * [简要描述]:缓存中获取一个string<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @return java.lang.String\n     * llxiao  2018/10/11 - 16:02\n     **/\n    String get(String key);\n\n    /**\n     * [简要描述]:添加一个string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : V\n     * llxiao  2018/10/11 - 16:02\n     **/\n    void set(String key, String value);\n\n    /**\n     * [简要描述]:批量设置string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param list : 批量string数据\n     * llxiao  2018/10/15 - 10:07\n     **/\n    void batchSet(List<EntryDto<String>> list);\n\n    /**\n     * [简要描述]:添加一个string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : V\n     * @param leaseTime : 存活时间，单位秒\n     * llxiao  2018/10/11 - 16:02\n     **/\n    void set(String key, String value, long leaseTime);\n\n    /**\n     * [简要描述]:获取一个缓存对象<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @return java.lang.Object\n     * llxiao  2018/10/11 - 15:41\n     **/\n    <T> T getObject(String key);\n\n    /**\n     * [简要描述]:添加一个对象到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param value : 值\n     * llxiao  2018/10/11 - 15:59\n     **/\n    <T> void setObject(String key, T value);\n\n    /**\n     * [简要描述]:批量设置Object到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param objs : 数据集合\n     * llxiao  2018/10/15 - 10:08\n     **/\n    <T> void batchSetObj(List<EntryDto<Object>> objs);\n\n    /**\n     * [简要描述]:添加一个对象到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param value : 值\n     * @param leaseTime : 存活时间，单位秒\n     * llxiao  2018/10/11 - 15:59\n     **/\n    <T> void setObject(String key, T value, long leaseTime);\n\n    /**\n     * [简要描述]:从map中获取指定key的值<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param field : 属性名\n     * @return java.lang.Object\n     * llxiao  2018/10/11 - 16:23\n     **/\n    <T> T hget(String key, String field);\n\n    /**\n     * [简要描述]:设置一个值到map中<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param field : 属性名\n     * @param value : 属性值\n     * llxiao  2018/10/11 - 16:32\n     **/\n    <T> void hset(String key, String field, T value);\n\n    /**\n     * [简要描述]:指定key的map<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @return java.util.Map\n     * llxiao  2018/10/11 - 19:45\n     **/\n    <T> Map<String, T> hgetAll(String key);\n\n    /**\n     * [简要描述]:设置map集<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key ：key\n     * @param maps : 集合\n     * llxiao  2018/10/11 - 19:47\n     **/\n    <T> void hsetAll(String key, Map<String, T> maps);\n\n    /**\n     * [简要描述]:批量hset<br/>\n     * [详细描述]:<br/>\n     *\n     * @param maps :  KEY,MAP集合\n     * llxiao  2018/10/15 - 11:16\n     **/\n    <T> void batchHset(List<EntryDto<Map<String, Object>>> maps);\n\n    /**\n     * [简要描述]:Set中添加一个元素<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : 值\n     * llxiao  2018/10/11 - 19:57\n     **/\n    <T> void addSet(String key, T value);\n\n    /**\n     * [简要描述]:获取一个set集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : Key\n     * @return Set\n     * llxiao  2018/10/11 - 19:59\n     **/\n    <T> Set<T> getSet(String key);\n\n    /**\n     * [简要描述]:Set中移除一个元素<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : 元素\n     * llxiao  2018/10/11 - 20:00\n     **/\n    <T> void removeSet(String key, T value);\n\n    /**\n     * [简要描述]:批量从缓存获取对象集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param keys : KEY\n     * @return java.util.List<T>\n     * llxiao  2018/10/15 - 10:00\n     **/\n    <T> List<T> batchGet(List<String> keys);\n\n    /**\n     * [简要描述]:批量从缓存获取MAP集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param keys : KEY\n     * @return java.util.List<java.util.Map>\n     * llxiao  2018/10/15 - 10:01\n     **/\n    <T> List<Map<String, T>> batchGetMap(List<String> keys);\n\n    /**\n     * [简要描述]:删除一个对象<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * llxiao  2018/10/15 - 14:40\n     **/\n    void delObject(String key);\n\n    /**\n     * [简要描述]:清空一个map<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : KEY\n     * llxiao  2018/10/15 - 14:41\n     **/\n    void delMap(String key);\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/service/DistributedService.java",
    "content": "package com.xiao.springcloud.demo.common.cache.service;\n\nimport org.redisson.api.RCountDownLatch;\nimport org.redisson.api.RLock;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]: 分布式服务：<br>\n * [详细描述]: 分布式锁、分布式同步器等 <br>\n * 公平锁：排队获取锁，保证先来先服务\n * 非公平锁：类似随机，即新来的线程可能会优先于已经在队列中的线程获取到锁，但只要进入了队列就会保证公平。ReentrantLock默认实现为非公平锁\n * 读写锁：允许多个多锁，但只能又一个写锁。读写、写写互斥\n * 闭锁：CountDownLatch\n *\n * @author llxiao\n * @version 1.0, 2018/10/11 09:04\n * @since JDK 1.8\n */\npublic interface DistributedService\n{\n    /**\n     * [简要描述]:获取分布式非公平可重入锁<br>\n     * [详细描述]:阻塞式获取，直到获取锁<br>\n     * <p>\n     * Redisson内部提供了一个监控锁的看门狗，它的作用是在Redisson实例被关闭前，不断的延长锁的有效期。<br>\n     * 默认情况下，看门狗的检查锁的超时时间是30秒钟，也可以通过修改Config.lockWatchdogTimeout来另行指定<br>\n     *\n     * @param lockKey : key\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:06\n     **/\n    RLock getRLock(String lockKey);\n\n    /**\n     * [简要描述]:非公平可重入锁，并在指定单位时间内自动释放锁，无需手动释放<br/>\n     * [详细描述]:阻塞式，直到获取锁<br/>\n     *\n     * @param lockKey : key\n     * @param leaseTime : 存货时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:37\n     **/\n    RLock autoReleaseRLock(String lockKey, long leaseTime, TimeUnit unit);\n\n    /**\n     * [简要描述]:指定时间内尝试获取非公平可重入锁<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    RLock tryLock(String lockKey, long timeout);\n\n    /**\n     * [简要描述]:指定时间内尝试获取非公平可重入锁，获取成功并设置锁自动失效时间<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    RLock tryLockAutoRelease(String lockKey, long timeout, long leaseTime, TimeUnit unit);\n\n    /**\n     * [简要描述]:获取分布式可重入公平锁<br/>\n     * [详细描述]:阻塞式获取，直到获取锁<br/>\n     *\n     * @param lockKey : key\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 10:40\n     **/\n    RLock getFairRLock(String lockKey);\n\n    /**\n     * [简要描述]:获取可重入公平锁，并在指定单位时间内自动释放锁，无需手动释放<br/>\n     * [详细描述]:阻塞式，直到获取锁<br/>\n     *\n     * @param lockKey : key\n     * @param leaseTime : 存货时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:37\n     **/\n    RLock autoReleaseRFairLock(String lockKey, long leaseTime, TimeUnit unit);\n\n    /**\n     * [简要描述]:指定时间内尝试获取公平可重入锁<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    RLock tryFairLock(String lockKey, long timeout);\n\n    /**\n     * [简要描述]:指定时间内尝试获取公平可重入锁，获取成功并设置锁自动失效时间<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    RLock tryFairLockAutoRelease(String lockKey, long timeout, long leaseTime, TimeUnit unit);\n\n    /**\n     * [简要描述]:获取读写锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @return org.redisson.api.RReadWriteLock\n     * llxiao  2018/10/11 - 10:54\n     **/\n    RLock getReadWriteLock(String lockKey, boolean isWrite);\n\n    /**\n     * [简要描述]:获取读写锁，指定单位时间内自动过期<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param lease : 存活时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RReadWriteLock\n     * llxiao  2018/10/11 - 10:54\n     **/\n    RLock autoReleaseReadWriteLock(String lockKey, boolean isWrite, Long lease, TimeUnit unit);\n\n    /**\n     * [简要描述]:指定时间内尝试获取读写锁<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    RLock tryReadWriteLock(String lockKey, boolean isWrite, long timeout);\n\n    /**\n     * [简要描述]:指定时间内尝试获取读写锁，获取成功并设置锁自动失效时间<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    RLock tryReadWriteLockAutoRelease(String lockKey, boolean isWrite, long timeout, long leaseTime, TimeUnit unit);\n\n    /**\n     * [简要描述]:获取一点数量的分布式闭锁（CountDownLatch）<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param count : 数量\n     * @return org.redisson.api.RCountDownLatch\n     * llxiao  2018/10/11 - 11:49\n     **/\n    RCountDownLatch getRCountDownLatch(String key, int count);\n\n    /**\n     * [简要描述]:每次消耗一个分布式闭锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * llxiao  2018/10/11 - 11:53\n     **/\n    void countDown(String key);\n\n    /**\n     * [简要描述]:可重入锁解锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * llxiao  2018/10/11 - 9:42\n     **/\n    void unRLock(String lockKey);\n\n    /**\n     * [简要描述]:可重入锁解锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param rLock : RLock\n     * llxiao  2018/10/11 - 9:42\n     **/\n    void unRLock(RLock rLock);\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/service/impl/CacheServiceRedisImpl.java",
    "content": "package com.xiao.springcloud.demo.common.cache.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.xiao.springcloud.demo.common.cache.conf.RedissonConfig;\nimport com.xiao.springcloud.demo.common.cache.dto.EntryDto;\nimport com.xiao.springcloud.demo.common.cache.service.CacheService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.redisson.api.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]: 缓存服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/11 15:42\n * @since JDK 1.8\n */\n@Service\n//仅仅在当前上下文中存在某个对象时，才会实例化一个Bean\n@ConditionalOnBean(RedissonConfig.class)\n//如果存在它修饰的类的bean，则不需要再创建这个bean\n//@ConditionalOnMissingBean\npublic class CacheServiceRedisImpl implements CacheService\n{\n\n    @Autowired\n    private RedissonClient redissonClient;\n\n    /**\n     * [简要描述]:缓存中获取一个string<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @return java.lang.String\n     * llxiao  2018/10/11 - 16:02\n     **/\n    @Override\n    public String get(String key)\n    {\n        if (null != redissonClient && StringUtils.isNotBlank(key))\n        {\n            RBucket<String> bucket = redissonClient.getBucket(key);\n            return bucket.get();\n        }\n        return \"\";\n    }\n\n    /**\n     * [简要描述]:添加一个string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : V\n     * @return void\n     * llxiao  2018/10/11 - 16:02\n     **/\n    @Override\n    public void set(String key, String value)\n    {\n        if (redissonClient != null && StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value))\n        {\n            RBucket<String> bucket = redissonClient.getBucket(key);\n            bucket.set(value);\n        }\n    }\n\n    /**\n     * [简要描述]:批量设置string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param list : 批量string数据\n     * llxiao  2018/10/15 - 10:07\n     **/\n    @Override\n    public void batchSet(List<EntryDto<String>> list)\n    {\n        if (redissonClient != null && CollectionUtil.isNotEmpty(list))\n        {\n            RBatch batch = redissonClient.createBatch();\n            for (EntryDto<String> entry : list)\n            {\n                batch.getBucket(entry.getKey()).setAsync(entry.getValue());\n            }\n            batch.execute();\n        }\n    }\n\n    /**\n     * [简要描述]:添加一个string到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : V\n     * @param leaseTime : 存活时间，单位秒\n     * llxiao  2018/10/11 - 16:02\n     **/\n    @Override\n    public void set(String key, String value, long leaseTime)\n    {\n        RBucket<String> bucket = redissonClient.getBucket(key);\n        bucket.set(value, leaseTime, TimeUnit.SECONDS);\n    }\n\n    /**\n     * [简要描述]:获取一个缓存对象<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @return java.lang.Object\n     * llxiao  2018/10/11 - 15:41\n     **/\n    @Override\n    public <T> T getObject(String key)\n    {\n        RBucket<T> bucket = redissonClient.getBucket(key);\n        return null != bucket ? bucket.get() : null;\n    }\n\n    /**\n     * [简要描述]:添加一个对象到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param value : 值\n     * llxiao  2018/10/11 - 15:59\n     **/\n    @Override\n    public <T> void setObject(String key, T value)\n    {\n        RBucket<T> bucket = redissonClient.getBucket(key);\n        bucket.set(value);\n    }\n\n    /**\n     * [简要描述]:批量设置Object到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param objs : 数据集合\n     * llxiao  2018/10/15 - 10:08\n     **/\n    @Override\n    public <T> void batchSetObj(List<EntryDto<Object>> objs)\n    {\n        if (redissonClient != null && CollectionUtil.isNotEmpty(objs))\n        {\n            RBatch batch = redissonClient.createBatch();\n            for (EntryDto<Object> entry : objs)\n            {\n                batch.getBucket(entry.getKey()).setAsync(entry.getValue());\n            }\n            batch.execute();\n        }\n    }\n\n    /**\n     * [简要描述]:添加一个对象到缓存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param value : 值\n     * @param leaseTime : 存活时间，单位秒\n     * llxiao  2018/10/11 - 15:59\n     **/\n    @Override\n    public <T> void setObject(String key, T value, long leaseTime)\n    {\n        RBucket<T> bucket = redissonClient.getBucket(key);\n        bucket.set(value, leaseTime, TimeUnit.SECONDS);\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @param field :\n     * @return java.lang.Object\n     * llxiao  2018/10/11 - 16:23\n     **/\n    @Override\n    public <T> T hget(String key, String field)\n    {\n        RMap<String, T> map = redissonClient.getMap(key);\n        return map.get(field);\n    }\n\n    /**\n     * [简要描述]:设置一个值到map中<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param field : 属性名\n     * @param value : 属性值\n     * llxiao  2018/10/11 - 16:32\n     **/\n    @Override\n    public <T> void hset(String key, String field, T value)\n    {\n        RMap<String, T> map = redissonClient.getMap(key);\n        map.put(field, value);\n    }\n\n    /**\n     * [简要描述]:指定key的map<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @return Map\n     * llxiao  2018/10/11 - 19:45\n     **/\n    @Override\n    public <T> Map<String, T> hgetAll(String key)\n    {\n        return (Map) redissonClient.getMap(key).readAllMap();\n    }\n\n    /**\n     * [简要描述]:设置map集<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key ：key\n     * @param maps : 集合\n     * llxiao  2018/10/11 - 19:47\n     **/\n    @Override\n    public <T> void hsetAll(String key, Map<String, T> maps)\n    {\n        RMap<String, T> map = redissonClient.getMap(key);\n        map.putAll(maps);\n    }\n\n    /**\n     * [简要描述]:批量hset<br/>\n     * [详细描述]:<br/>\n     *\n     * @param maps :  KEY,MAP集合\n     * llxiao  2018/10/15 - 11:16\n     **/\n    @Override\n    public <T> void batchHset(List<EntryDto<Map<String, Object>>> maps)\n    {\n        if (null != redissonClient && CollectionUtil.isNotEmpty(maps))\n        {\n            RBatch batch = redissonClient.createBatch();\n            for (EntryDto<Map<String, Object>> entry : maps)\n            {\n                batch.getMap(entry.getKey()).putAllAsync(entry.getValue());\n            }\n            batch.execute();\n        }\n    }\n\n    /**\n     * [简要描述]:Set中添加一个元素<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : 值\n     * llxiao  2018/10/11 - 19:57\n     **/\n    @Override\n    public <T> void addSet(String key, T value)\n    {\n        RSet<T> set = redissonClient.getSet(key);\n        set.add(value);\n    }\n\n    /**\n     * [简要描述]:获取一个set集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : Key\n     * @return T\n     * llxiao  2018/10/11 - 19:59\n     **/\n    @Override\n    public <T> Set<T> getSet(String key)\n    {\n        return (Set) redissonClient.getSet(key).readAll();\n    }\n\n    /**\n     * [简要描述]:Set中移除一个元素<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : K\n     * @param value : 元素\n     **/\n    @Override\n    public <T> void removeSet(String key, T value)\n    {\n        redissonClient.getSet(key).remove(value);\n    }\n\n    /**\n     * [简要描述]:批量从缓存获取对象集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param keys : KEY\n     * @return java.util.List<T>\n     * llxiao  2018/10/15 - 10:00\n     **/\n    @Override\n    public <T> List<T> batchGet(List<String> keys)\n    {\n        RBatch batch = redissonClient.createBatch();\n        for (String key : keys)\n        {\n            batch.getBucket(key).getAsync();\n        }\n        BatchResult result = batch.execute();\n        return result.getResponses();\n    }\n\n    /**\n     * [简要描述]:批量从缓存获取MAP集合<br/>\n     * [详细描述]:<br/>\n     *\n     * @param keys : KEY\n     * @return java.util.List<java.util.Map>\n     * llxiao  2018/10/15 - 10:01\n     **/\n    @Override\n    public <T> List<Map<String, T>> batchGetMap(List<String> keys)\n    {\n        RBatch batch = redissonClient.createBatch();\n        for (String key : keys)\n        {\n            batch.getMap(key).readAllMapAsync();\n        }\n        BatchResult result = batch.execute();\n        return result.getResponses();\n    }\n\n    /**\n     * [简要描述]:删除一个对象<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * llxiao  2018/10/15 - 14:40\n     **/\n    @Override\n    public void delObject(String key)\n    {\n        RBucket bucket = redissonClient.getBucket(key);\n        bucket.deleteAsync();\n    }\n\n    /**\n     * [简要描述]:清空一个map<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : KEY\n     * llxiao  2018/10/15 - 14:41\n     **/\n    @Override\n    public void delMap(String key)\n    {\n        RMap map = redissonClient.getMap(key);\n        map.deleteAsync();\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/cache/service/impl/DistributedServiceRedissonImpl.java",
    "content": "package com.xiao.springcloud.demo.common.cache.service.impl;\n\nimport com.xiao.springcloud.demo.common.cache.conf.RedissonConfig;\nimport com.xiao.springcloud.demo.common.cache.service.DistributedService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.api.RCountDownLatch;\nimport org.redisson.api.RLock;\nimport org.redisson.api.RReadWriteLock;\nimport org.redisson.api.RedissonClient;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.stereotype.Service;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]: redisson分布式服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/11 09:19\n * @since JDK 1.8\n */\n@Service\n@Slf4j\n//仅仅在当前上下文中存在某个对象时，才会实例化一个Bean\n@ConditionalOnBean(RedissonConfig.class)\n//如果存在它修饰的类的bean，则不需要再创建这个bean\npublic class DistributedServiceRedissonImpl implements DistributedService\n{\n    @Autowired\n    private RedissonClient redissonClient;\n\n    /**\n     * [简要描述]:获取分布式非公平可重入锁(加锁)<br/>\n     * [详细描述]:阻塞式获取<br/>\n     * <p>\n     * Redisson内部提供了一个监控锁的看门狗，它的作用是在Redisson实例被关闭前，不断的延长锁的有效期。<br>\n     * 默认情况下，看门狗的检查锁的超时时间是30秒钟，也可以通过修改Config.lockWatchdogTimeout来另行指定<br>\n     *\n     * @param lockKey : key\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:06\n     **/\n    @Override\n    public RLock getRLock(String lockKey)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        lock.lock();\n        return lock;\n    }\n\n    /**\n     * [简要描述]:非公平可重入锁，并在指定单位时间内自动释放锁，无需手动释放<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param leaseTime : 存货时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:37\n     **/\n    @Override\n    public RLock autoReleaseRLock(String lockKey, long leaseTime, TimeUnit unit)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        lock.lock(leaseTime, unit);\n        return lock;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取非公平可重入锁(加锁)<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    @Override\n    public RLock tryLock(String lockKey, long timeout)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        boolean flag = false;\n        //锁可用立即返回 true,锁不可用立即返回false\n        //boolean flag = lock.tryLock();\n        try\n        {\n            // 获取不到锁等待一段时间，如果获取到返回true，获取不到返回false\n            flag = lock.tryLock(timeout, TimeUnit.SECONDS);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            lock.unlock();\n        }\n\n        return flag ? lock : null;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取非公平可重入锁，获取成功并设置锁自动失效时间(加锁)<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    @Override\n    public RLock tryLockAutoRelease(String lockKey, long timeout, long leaseTime, TimeUnit unit)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        boolean flag = false;\n        try\n        {\n            flag = lock.tryLock(timeout, leaseTime, unit);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            lock.unlock();\n        }\n        return flag ? lock : null;\n    }\n\n    /**\n     * [简要描述]:获取分布式可重入公平锁(加锁)<br/>\n     * [详细描述]:阻塞式获取，直到获取锁<br/>\n     *\n     * @param lockKey : key\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 10:40\n     **/\n    @Override\n    public RLock getFairRLock(String lockKey)\n    {\n        RLock fairLock = redissonClient.getFairLock(lockKey);\n        fairLock.lock();\n        return fairLock;\n    }\n\n    /**\n     * [简要描述]:获取可重入公平锁，并在指定单位时间内自动释放锁，无需手动释放<br/>\n     * [详细描述]:阻塞式，直到获取锁<br/>\n     *\n     * @param lockKey : key\n     * @param leaseTime : 存货时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:37\n     **/\n    @Override\n    public RLock autoReleaseRFairLock(String lockKey, long leaseTime, TimeUnit unit)\n    {\n        RLock fairLock = redissonClient.getFairLock(lockKey);\n        fairLock.lock(leaseTime, unit);\n        return fairLock;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取公平可重入锁<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    @Override\n    public RLock tryFairLock(String lockKey, long timeout)\n    {\n        RLock lock = redissonClient.getFairLock(lockKey);\n        boolean flag = false;\n        //锁可用立即返回 true,锁不可用立即返回false\n        //boolean flag = lock.tryLock();\n        try\n        {\n            // 获取不到锁等待一段时间，如果获取到返回true，获取不到返回false\n            flag = lock.tryLock(timeout, TimeUnit.SECONDS);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            lock.unlock();\n        }\n\n        return flag ? lock : null;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取公平可重入锁，获取成功并设置锁自动失效时间<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    @Override\n    public RLock tryFairLockAutoRelease(String lockKey, long timeout, long leaseTime, TimeUnit unit)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        boolean flag = false;\n        try\n        {\n            // 尝试加锁，最多等待timeout秒，上锁以后leaseTime(unit)自动解锁\n            flag = lock.tryLock(timeout, leaseTime, unit);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            lock.unlock();\n        }\n        return flag ? lock : null;\n    }\n\n    /**\n     * [简要描述]:获取读写锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @return org.redisson.api.RReadWriteLock\n     * llxiao  2018/10/11 - 10:54\n     **/\n    @Override\n    public RLock getReadWriteLock(String lockKey, boolean isWrite)\n    {\n        RReadWriteLock rwlock = redissonClient.getReadWriteLock(lockKey);\n        RLock rLock;\n        if (isWrite)\n        {\n            rLock = rwlock.writeLock();\n        }\n        else\n        {\n            rLock = rwlock.readLock();\n        }\n        rLock.lock();\n        return rLock;\n    }\n\n    /**\n     * [简要描述]:获取读写锁，指定单位时间内自动过期<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param lease : 存活时间\n     * @param unit : 时间单位\n     * @return org.redisson.api.RReadWriteLock\n     * llxiao  2018/10/11 - 10:54\n     **/\n    @Override\n    public RLock autoReleaseReadWriteLock(String lockKey, boolean isWrite, Long lease, TimeUnit unit)\n    {\n        RReadWriteLock rwlock = redissonClient.getReadWriteLock(lockKey);\n        RLock rLock;\n        if (isWrite)\n        {\n            rLock = rwlock.writeLock();\n        }\n        else\n        {\n            rLock = rwlock.readLock();\n        }\n        rLock.lock(lease, unit);\n        return rLock;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取读写锁<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param timeout : 超时时间，单位秒\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:51\n     **/\n    @Override\n    public RLock tryReadWriteLock(String lockKey, boolean isWrite, long timeout)\n    {\n        RReadWriteLock rwlock = redissonClient.getReadWriteLock(lockKey);\n        RLock rLock;\n        if (isWrite)\n        {\n            rLock = rwlock.writeLock();\n        }\n        else\n        {\n            rLock = rwlock.readLock();\n        }\n        try\n        {\n\n            rLock.tryLock(timeout, TimeUnit.SECONDS);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            rLock.unlock();\n        }\n        return rLock;\n    }\n\n    /**\n     * [简要描述]:指定时间内尝试获取读写锁，获取成功并设置锁自动失效时间<br/>\n     * [详细描述]:获取不到锁返回null<br/>\n     *\n     * @param lockKey : key\n     * @param isWrite : true写锁，false读锁\n     * @param timeout : 超时时间，单位秒\n     * @param leaseTime : 锁失效时间\n     * @param unit : 锁失效单位\n     * @return org.redisson.api.RLock\n     * llxiao  2018/10/11 - 9:52\n     **/\n    @Override\n    public RLock tryReadWriteLockAutoRelease(String lockKey, boolean isWrite, long timeout, long leaseTime,\n            TimeUnit unit)\n    {\n        RLock rLock = this.getReadWriteLock(lockKey, isWrite);\n        boolean flag = false;\n        try\n        {\n            // 尝试加锁，最多等待timeout秒，上锁以后leaseTime(unit)自动解锁\n            flag = rLock.tryLock(timeout, leaseTime, unit);\n        }\n        catch (InterruptedException e)\n        {\n            log.warn(\"尝试获取锁失败，线程中断!\", e);\n            rLock.unlock();\n        }\n        return flag ? rLock : null;\n    }\n\n    /**\n     * [简要描述]:闭锁（CountDownLatch）<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * @param count : 数量\n     * @return org.redisson.api.RCountDownLatch\n     * llxiao  2018/10/11 - 11:49\n     **/\n    @Override\n    public RCountDownLatch getRCountDownLatch(String key, int count)\n    {\n        RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch(key);\n        rCountDownLatch.trySetCount(count);\n        return rCountDownLatch;\n    }\n\n    /**\n     * [简要描述]:每次消耗一个分布式闭锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key : key\n     * llxiao  2018/10/11 - 11:53\n     **/\n    @Override\n    public void countDown(String key)\n    {\n        RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch(key);\n        rCountDownLatch.countDown();\n    }\n\n    /**\n     * [简要描述]:解锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param lockKey : key\n     * llxiao  2018/10/11 - 9:42\n     **/\n    @Override\n    public void unRLock(String lockKey)\n    {\n        RLock lock = redissonClient.getLock(lockKey);\n        lock.unlock();\n    }\n\n    /**\n     * [简要描述]:解锁<br/>\n     * [详细描述]:<br/>\n     *\n     * @param rLock : RLock\n     * llxiao  2018/10/11 - 9:42\n     **/\n    @Override\n    public void unRLock(RLock rLock)\n    {\n        if (null != rLock)\n        {\n            rLock.unlock();\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/conf/FeignConfiguration.java",
    "content": "package com.xiao.springcloud.demo.common.conf;\n\nimport feign.Feign;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.autoconfigure.web.WebMvcRegistrations;\nimport org.springframework.boot.autoconfigure.web.WebMvcRegistrationsAdapter;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.annotation.AnnotatedElementUtils;\nimport org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;\n\n/**\n * [简要描述]: 解决feginclient 调用时使用requestmapping注解被springmvc加载的问题,springcloud2.0的版本据说已经解决这个问题<br>\n * [详细描述]: 可能产生的问题：<br>\n * 1.由于服务消费者并不提供这些接口，对于开发者来说容易造成误解<br>\n * 2.由于加载了一些外部服务的接口定义，还存在与自身接口定义冲突的潜在风险<br>\n * @author llxiao\n * @version 1.0, 2018/9/30 09:58\n * @since JDK 1.8\n */\n@Configuration\n@ConditionalOnClass({ Feign.class })\npublic class FeignConfiguration\n{\n    @Bean\n    public WebMvcRegistrations feignWebRegistrations()\n    {\n        return new WebMvcRegistrationsAdapter()\n        {\n            @Override\n            public RequestMappingHandlerMapping getRequestMappingHandlerMapping()\n            {\n                return new FeignRequestMappingHandlerMapping();\n            }\n        };\n    }\n\n    private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping\n    {\n        @Override\n        protected boolean isHandler(Class<?> beanType)\n        {\n            // 不能被@FeignClient注解修饰的类才会进行解析加载\n            return super.isHandler(beanType) && !AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/DataEventFactory.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor;\n\nimport com.lmax.disruptor.EventFactory;\nimport com.xiao.springcloud.demo.common.disruptor.data.DataEvent;\n\n/**\n * [简要描述]: 定义事件工厂\n * [详细描述]: 定义了如何实例化定义的事件(Event)\n * Disruptor 通过 EventFactory 在 RingBuffer 中预创建 Event 的实例<p>\n * 一个 Event 实例实际上被用作一个“数据槽”，发布者发布前，先从 RingBuffer 获得一个 Event 的实例，然后往 Event 实例中填充数据，<br>\n * 之后再发布到 RingBuffer 中，之后由 Consumer 获得该 Event 实例并从中读取数据<br>\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:17\n * @since JDK 1.8\n */\npublic class DataEventFactory implements EventFactory<DataEvent>\n{\n    @Override\n    public DataEvent newInstance()\n    {\n        return new DataEvent();\n    }\n}\n\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/DisruptorConsumer.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor;\n\nimport com.lmax.disruptor.EventHandler;\nimport com.lmax.disruptor.WorkHandler;\nimport com.xiao.springcloud.demo.common.disruptor.data.DataEvent;\nimport com.xiao.springcloud.demo.common.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.concurrent.Executor;\n\n/**\n * [简要描述]: Disruptor消费者之Handler。\n * [详细描述]:\n * <br>\n * 单消费者：实现EventHandler接口(DataEvent dataEvent, long sequence, boolean endOfBatch)方法<br>\n * 多消费者：实现WorkHandler接口的onEvent(DataEvent dataEvent)方法<br>\n * --广播：对于多个消费者，每条信息会达到所有的消费者，被多次处理，一般每个消费者业务逻辑不通，用于同一个消息的不同业务逻辑处理<br>\n * --消费者之间无依赖关系 disruptor.handleEventsWith(handler1,handler2,handler3);<br>\n * --假设handler3必须在handler1，handler2处理完成后进行处理:disruptor.handleEventsWith(handler1,handler2).then(handler3);<br>\n * --分组：对于同一组内的多个消费者，每条信息只会被组内一个消费者处理，每个消费者业务逻辑一般相同，用于多消费者并发处理一组消息<br>\n * --假设handler1，handler2，handler3都实现了WorkHandler，则调用以下代码就可以实现分组：<br>\n * --disruptor.handleEventsWithWorkerPool(handler1, handler2, handler3);<br>\n * 广播和分组之间也是可以排列组合的<br>\n * link：http://www.importnew.com/27652.html\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:20\n * @since JDK 1.8\n */\n@Slf4j\npublic class DisruptorConsumer implements EventHandler<DataEvent>, WorkHandler<DataEvent>\n{\n    //具体的服务\n    private DisruptorService disruptorService;\n\n    /**\n     *\n     */\n    private final Executor executor;\n\n    public DisruptorConsumer(DisruptorService disruptorService, Executor executor)\n    {\n        this.disruptorService = disruptorService;\n        this.executor = executor;\n    }\n\n    @Override\n    public void onEvent(DataEvent dataEvent) throws Exception\n    {\n        if (log.isDebugEnabled())\n        {\n            log.info(\"接受到数据更新请求  >>>\" + dataEvent);\n        }\n        executor.execute(() ->\n        {\n            disruptorService.execute(dataEvent.getBasisData());\n        });\n\n    }\n\n    @Override\n    public void onEvent(DataEvent dataEvent, long sequence, boolean endOfBatch) throws Exception\n    {\n        if (log.isDebugEnabled())\n        {\n            log.info(\"接受到数据更新请求  >>>{}\", dataEvent);\n            log.info(\"Sequence:{}\", sequence);\n            log.info(\"End Of Batch：{}\", endOfBatch);\n        }\n        this.onEvent(dataEvent);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/DisruptorExceptionHandler.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor;\n\nimport com.lmax.disruptor.ExceptionHandler;\nimport com.xiao.springcloud.demo.common.disruptor.data.DataEvent;\nimport com.xiao.springcloud.demo.common.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * [简要描述]: Disruptor自定义异常处理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:42\n * @since JDK 1.8\n */\n@Slf4j\npublic class DisruptorExceptionHandler implements ExceptionHandler<DataEvent>\n{\n    private DisruptorService disruptorService;\n\n    public DisruptorExceptionHandler(DisruptorService disruptorService)\n    {\n        this.disruptorService = disruptorService;\n    }\n\n    /**\n     * 事件处理异常\n     */\n    @Override\n    public void handleEventException(Throwable throwable, long sequence, DataEvent dataEvent)\n    {\n        //事件处理异常里面进行补偿执行\n        disruptorService.execute(dataEvent.getBasisData());\n        log.error(\">>> Disruptor事件处理异常，进行立即执行补偿操作..........\");\n        log.error(\">>> 异常信息如下：\", throwable.getMessage());\n    }\n\n    /**\n     * 启动异常\n     *\n     * @param throwable\n     */\n    @Override\n    public void handleOnStartException(Throwable throwable)\n    {\n        log.error(\">>> Disruptor 启动异常：{}\", throwable.getMessage());\n    }\n\n    /**\n     * 关闭异常\n     *\n     * @param throwable\n     */\n    @Override\n    public void handleOnShutdownException(Throwable throwable)\n    {\n        log.error(\">>> Disruptro 关闭异常：{}\", throwable.getMessage());\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/DisruptorProducer.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor;\n\nimport com.lmax.disruptor.BlockingWaitStrategy;\nimport com.lmax.disruptor.EventTranslatorOneArg;\nimport com.lmax.disruptor.RingBuffer;\nimport com.lmax.disruptor.WaitStrategy;\nimport com.lmax.disruptor.dsl.Disruptor;\nimport com.lmax.disruptor.dsl.ProducerType;\nimport com.xiao.springcloud.demo.common.disruptor.data.BasisData;\nimport com.xiao.springcloud.demo.common.disruptor.data.DataEvent;\nimport com.xiao.springcloud.demo.common.disruptor.service.DisruptorService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.*;\n\n/**\n * [简要描述]: Disruptor生产者\n * [详细描述]:\n * 严重警告：ringBufferSize的值设定需要保持理性的数量，环形队列是等着被替换而不是被回收，设置太大会撑爆你设定的JVM内存，最终导致OLD占满，接下来就是无限循环的FGC\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:37\n * @since JDK 1.8\n */\n@Component\n@Slf4j\npublic class DisruptorProducer implements DisposableBean, ApplicationListener<ContextRefreshedEvent>\n{\n    /**\n     * RingBuffer 大小，必须是 2 的 N 次方；\n     */\n    private int ringBufferSize = 1024 * 1024;\n\n    private Disruptor<DataEvent> disruptor;\n\n    private boolean isMultiProducer;\n\n    /**\n     * 等待策略\n     * 例如，BlockingWaitStrategy、SleepingWaitStrategy、YieldingWaitStrategy 等，其中，\n     * BlockingWaitStrategy 是最低效的策略，但其对CPU的消耗最小并且在各种不同部署环境中能提供更加一致的性能表现；\n     * SleepingWaitStrategy 的性能表现跟 BlockingWaitStrategy 差不多，对 CPU 的消耗也类似，但其对生产者线程的影响最小，适合用于异步日志类似的场景；\n     * YieldingWaitStrategy 的性能是最好的，适合用于低延迟的系统。在要求极高性能且事件处理线数小于 CPU 逻辑核心数的场景中，推荐使用此策略；例如，CPU开启超线程的特性。\n     */\n    private WaitStrategy waitStrategy;\n\n    private RingBuffer<DataEvent> ringBuffer;\n\n    public volatile boolean isStart;\n\n    private DisruptorService disruptorService;\n\n    private ExecutorService executor;\n    private int threads;\n\n    @Autowired\n    public DisruptorProducer(DisruptorService disruptorService)\n    {\n\n        threads = Runtime.getRuntime().availableProcessors();\n        this.disruptorService = disruptorService;\n\n        //单生产者\n        isMultiProducer = true;\n        ProducerType producerType = ProducerType.SINGLE;\n        if (isMultiProducer)\n        {\n            //多生产者\n            producerType = ProducerType.MULTI;\n        }\n        // 等待策略\n        //        waitStrategy = new YieldingWaitStrategy();\n        waitStrategy = new BlockingWaitStrategy();\n        //初始化disruptor\n        disruptor = new Disruptor<>(new DataEventFactory(), ringBufferSize, DisruptorThreadFactory\n                .create(\"Disruptor Main-\", false), producerType, waitStrategy);\n\n        executor = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), DisruptorThreadFactory\n                .create(\"Disruptor Producer-\", false), new ThreadPoolExecutor.AbortPolicy());\n    }\n\n    /**\n     * [简要描述]:发送事件处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param basisData : 待处理的数据\n     * llxiao  2019/3/25 - 15:10\n     **/\n    public void send(BasisData basisData)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"发送数据给消费者\");\n        }\n        if (null != basisData)\n        {\n            executor.execute(() ->\n            {\n                translator(basisData);\n            });\n        }\n    }\n\n    private void translator(BasisData basisData)\n    {\n        EventTranslatorOneArg<DataEvent, BasisData> eventTranslatorOneArg = (event, sequence, message1) -> event\n                .setBasisData(basisData);\n        if (!this.isStart)\n        {\n            ringBuffer = disruptor.start();\n            this.isStart = true;\n        }\n        ringBuffer.publishEvent(eventTranslatorOneArg, basisData);\n    }\n\n    @Override\n    public void destroy() throws Exception\n    {\n        if (isStart)\n        {\n            //关闭 disruptor，方法会堵塞，直至所有的事件都得到处理；\n            disruptor.shutdown();\n        }\n        executor.shutdown();\n    }\n\n    public void doStart()\n    {\n        //CPU可使用数量\n        final Executor executor = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), DisruptorThreadFactory\n                .create(\"Disruptor consumer-\", false), new ThreadPoolExecutor.AbortPolicy());\n        DisruptorConsumer[] disruptorConsumers = new DisruptorConsumer[threads];\n        for (int i = 0; i < threads; i++)\n        {\n            disruptorConsumers[i] = new DisruptorConsumer(disruptorService, executor);\n        }\n        //设置消费者Handler\n        // 广播 消费者之间无依赖关系\n        //        disruptor.handleEventsWith(ArrayUtil.toArray(handlers, EventHandler.class));\n        // 关闭 消费间有依赖关系,假设：2号需要在0号和1号处理完才能进行\n        //        disruptor.handleEventsWith(handlers.get(0),handlers.get(1)).then(handlers.get(2));\n        // 分组  List<WorkHandler> workHandlers\n        disruptor.handleEventsWithWorkerPool(disruptorConsumers);\n\n        //设置异常处理\n        disruptor.setDefaultExceptionHandler(new DisruptorExceptionHandler(disruptorService));\n\n        ringBuffer = disruptor.start();\n        this.isStart = true;\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {\n        log.info(\"Start disruptor..........\");\n        doStart();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/DisruptorThreadFactory.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor;\n\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 14:49\n * @since JDK 1.8\n */\npublic class DisruptorThreadFactory implements ThreadFactory\n{\n    private static final AtomicLong THREAD_NUMBER = new AtomicLong(1);\n\n    private static final ThreadGroup THREAD_GROUP = new ThreadGroup(\"disruptor\");\n\n    private static volatile boolean daemon;\n\n    private final String namePrefix;\n\n    private DisruptorThreadFactory(final String namePrefix, final boolean daemon)\n    {\n        this.namePrefix = namePrefix;\n        DisruptorThreadFactory.daemon = daemon;\n    }\n\n    /**\n     * Constructs a new {@code Thread}.  Implementations may also initialize\n     * priority, name, daemon status, {@code ThreadGroup}, etc.\n     *\n     * @param r a runnable to be executed by new thread instance\n     * @return constructed thread, or {@code null} if the request to\n     * create a thread is rejected\n     */\n    @Override\n    public Thread newThread(Runnable r)\n    {\n        Thread thread = new Thread(THREAD_GROUP, r,\n                THREAD_GROUP.getName() + \"-\" + namePrefix + \"-\" + THREAD_NUMBER.getAndIncrement());\n        thread.setDaemon(daemon);\n        if (thread.getPriority() != Thread.NORM_PRIORITY)\n        {\n            thread.setPriority(Thread.NORM_PRIORITY);\n        }\n        return thread;\n    }\n\n    /**\n     * 自定义线程factory\n     *\n     * @param namePrefix\n     * @param daemon\n     * @return\n     */\n    public static ThreadFactory create(final String namePrefix, final boolean daemon)\n    {\n        return new DisruptorThreadFactory(namePrefix, daemon);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/data/BasisData.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.data;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n/**\n * [简要描述]: 数据基础类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/6/4 08:54\n * @since JDK 1.8\n */\n@Setter\n@Getter\npublic class BasisData\n{\n    /**\n     * 事件名称\n     */\n    protected String event;\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/data/DataEvent.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.data;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: 定义事件\n * [详细描述]:通过 Disruptor 进行交换的数据类型\n *\n * @author llxiao\n * @version 1.0, 2019/3/21 15:12\n * @since JDK 1.8\n */\n@Data\npublic class DataEvent\n{\n    /**\n     * 具体数据\n     */\n    private BasisData basisData;\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/data/EventEnum.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.data;\n\n/**\n * [简要描述]: 事件类型\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/6/4 08:43\n * @since JDK 1.8\n */\npublic enum EventEnum\n{\n    /**\n     * 日志事件\n     */\n    LOG_EVENT(\"log\");\n\n    private String event;\n\n    EventEnum(String event)\n    {\n        this.event = event;\n    }\n\n    public String getEvent()\n    {\n        return event;\n    }\n    }\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/event/ServiceEvent.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.event;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.springframework.context.ApplicationEvent;\n\n/**\n * [简要描述]: Springboot 的Event数据事件\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/6/4 08:39\n * @since JDK 1.8\n */\n@Setter\n@Getter\npublic class ServiceEvent extends ApplicationEvent\n{\n    /**\n     * 事件类型\n     */\n    private String event;\n\n    /**\n     * Create a new ApplicationEvent.\n     */\n    public ServiceEvent(Object source, String event)\n    {\n        super(source);\n        this.event = event;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/readme.md",
    "content": "1. Disruptor: 开源的并发框架,能够在无锁的情况下实现网络的Queue并发操作,其他更多[详情介绍](http://ifeve.com/disruptor/)\n2. 本common包封装的``Disruptor``与``Spring的Event``事件组合，实现业务在JVM内解耦。<br>\n3. 引入disruptor pom依赖:<br>\n    ```\n       <disruptor.version>3.4.2</disruptor.version>\n       <!-- disruptor -->\n        <dependency>\n            <groupId>com.lmax</groupId>\n            <artifactId>disruptor</artifactId>\n            <version>${disruptor.version}</version>\n        </dependency>\n    ```\n4. 启动disruptor:<br>\n    ```html\n    // spring容器初始化时，启动disruptor\n    @Component\n    public class ConfigInit implements InitializingBean\n    {\n        @Autowired\n        private DisruptorProducer disruptorProducer;\n    \n        @Override\n        public void afterPropertiesSet()\n        {\n            disruptorProducer.doStart();\n        }\n    }\n    ```\n5. 生产者调用:<br>\n    ``DisruptorProducer.send(BasisData data)``方法 <br>\n    ```html\n     // 数据数据定义\n     public ServiceData extends BasisData{\n        // field\n        // setter and getter\n     }\n     \n     // 注入DisruptorProducer\n     @Autowired\n     private DisruptorProducer disruptorProducer;\n     \n     @Test\n     public void testSend(){\n          ServiceData data = new ServiceData();\n          // 设置事件类型，可预定义在EventEnum枚举类中，一个String类型\n          data.setEvent(EventEnum.LOG_EVENT.getEvent());\n          // 发送数据\n          disruptorProducer.send(data);\n     }\n \n    ```\n6. 业务消费者：<br>\n    实现``org.springframework.context.ApplicationListener<ServiceEvent>``的``onApplicationEvent(ServiceEvent serviceEvent)``方法<br>\n    ```html\n     // event消费者实现\n     @Component\n     public class LogEventEvent implements ApplicationListener<ServiceEvent>{\n         \n         // 可以使用spring的异步实现@Async注解，需要配合启动类中添加 @EnableAsync注解 开启异步的支持\n         @Async\n         @Override\n         public void onApplicationEvent(ServiceEvent event)\n         {\n             // 这个event事件名称要跟发送的时候事件名称一样的\n             if (EventEnum.LOG_EVENT.getEvent().equals(event.getEvent()))\n             {\n                 ServiceData serviceData = (ServiceData) event.getSource();\n                 // 进一步业务逻辑处理 todo\n             }\n         }\n     }\n    ```\n``严重警告：ringBufferSize的值设定需要保持理性的数量，环形队列是等着被替换而不是被回收，设置太大会撑爆你设定的JVM内存，最终导致OLD占满，接下来就是无限循环的FGC``\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/service/DisruptorService.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.service;\n\nimport com.xiao.springcloud.demo.common.disruptor.data.BasisData;\n\n/**\n * [简要描述]: 异步队列服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/25 09:50\n * @since JDK 1.8\n */\npublic interface DisruptorService\n{\n    /**\n     * [简要描述]:异步处理服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param data : 数据处理\n     * llxiao  2019/3/25 - 9:51\n     **/\n    void execute(BasisData data);\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/disruptor/service/impl/DisruptorServiceImpl.java",
    "content": "package com.xiao.springcloud.demo.common.disruptor.service.impl;\n\nimport com.xiao.springcloud.demo.common.disruptor.data.BasisData;\nimport com.xiao.springcloud.demo.common.disruptor.event.ServiceEvent;\nimport com.xiao.springcloud.demo.common.disruptor.service.DisruptorService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: 异步处理日志\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-04-24 15:31\n * @since JDK 1.8\n */\n@Service\npublic class DisruptorServiceImpl implements DisruptorService\n{\n    @Autowired\n    ApplicationContext applicationContext;\n\n    /**\n     * [简要描述]: 具体业务处理\n     * [详细描述]:<br/>\n     *\n     * @param basisData : 待处理数据\n     * mjye  2019-04-24 - 15:32\n     **/\n    @Override\n    public void execute(BasisData basisData)\n    {\n        ServiceEvent event = new ServiceEvent(basisData, basisData.getEvent());\n        applicationContext.publishEvent(event);\n    }\n\n}"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/eureka/LoadBalancerAspect.java",
    "content": "package com.xiao.springcloud.demo.common.eureka;\n\nimport com.netflix.loadbalancer.Server;\nimport com.netflix.loadbalancer.ServerStats;\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.client.ServiceInstance;\nimport org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerContext;\nimport org.springframework.cloud.netflix.ribbon.SpringClientFactory;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: 快速标记服务down\n * [详细描述]:\n * Eureka注册中心的设计思想基于满足CAP分布式理论中的AP，某一个service宕机，Eureka server有自我保护机制，不会实时踢掉service，<br>\n * 默认会等到3个心跳周期也就是90秒，注册中心才会标记该service下线，所以该service的调用方才能被感知到。<br>\n * 以下方式可以解决客户端在调用某个服务的provider时实时踢掉该服务，并通知Eureka Server，<br>\n * 避免LB机制在Hystirx断路器起作用前尽量避免调用已经宕机的服务提供方<br>\n * [参考](https://www.jianshu.com/p/f75d66f6d2cc)<br>\n *\n * @author llxiao\n * @version 1.0, 2018/12/10 15:48\n * @since JDK 1.8\n */\n@Slf4j\n@Aspect\n@Component\npublic class LoadBalancerAspect\n{\n    @Autowired\n    private SpringClientFactory springClientFactory;\n\n    @Around(value = \"execution (* org.springframework.cloud.client.loadbalancer.LoadBalancerClient.reconstructURI(..)))\")\n    public Object reconstructURIAround(final ProceedingJoinPoint joinPoint) throws Throwable\n    {\n\n        Object[] objects = joinPoint.getArgs();\n        ServiceInstance instance = (ServiceInstance) objects[0];\n        Server server = new Server(instance.getHost(), instance.getPort());\n\n        RibbonLoadBalancerContext context = springClientFactory.getLoadBalancerContext(instance.getServiceId());\n        ServerStats serverStats = context.getServerStats(server);\n\n        Object obj = joinPoint.proceed();\n\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"=======================================================================\");\n            log.debug(serverStats.toString());\n            log.debug(\"=======================================================================\");\n        }\n\n        /**\n         * 连续网络链接失败2次以上，迅速标记该provider下线\n         */\n        int n = serverStats.getSuccessiveConnectionFailureCount();\n        if (n > 1)\n        {\n            if (log.isDebugEnabled())\n            {\n                log.debug(\"===================================================================\");\n                log.debug(\"Mark server:{}-{} to down!!!\", server.getHost(), server.getPort());\n                log.debug(\"===================================================================\");\n            }\n            context.getLoadBalancer().markServerDown(server);\n        }\n        return obj;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/exception/AbstractServiceException.java",
    "content": "package com.xiao.springcloud.demo.common.exception;\n\n/**\n * 异常规范接口\n * @author zhdong\n *\n */\npublic interface AbstractServiceException {\n\n\t/**\n     * 获取异常的状态码\n     */\n\tInteger getCode();\n\n    /**\n     * 获取异常的提示信息\n     */\n\tString getMessage();\n    \n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/exception/CommonException.java",
    "content": "package com.xiao.springcloud.demo.common.exception;\n\n\n/**\n * 异常公共类\n *\n * @author zhdong\n * @date 2018/8/1\n */\npublic class CommonException extends RuntimeException {\n\n    /**\n\t * \n\t */\n\tprivate static final long serialVersionUID = 1L;\n\n    /**\n     * 缺少必填参数，三位错误码后缀，需要结合前缀的业务编码组装成完整的错误码信息\n     */\n\tpublic static final String REQUIRED_PARAM_SUFFIX = \"000\";\n\n    /**\n     * 参数非法，三位错误码后缀，需要结合前缀的业务编码组装成完整的错误码信息\n     */\n\tpublic static final String ILLEGAL_PARAM_SUFFIX = \"001\";\n\n\tprivate Integer code;\n\n    private String errorMessage;\n\n    public CommonException(Integer code, String errorMessage) {\n        super(errorMessage);\n        this.code = code;\n        this.errorMessage = errorMessage;\n    }\n\n    public CommonException(AbstractServiceException exception) {\n        super(exception.getMessage());\n        this.code = exception.getCode();\n        this.errorMessage = exception.getMessage();\n    }\n\n    public Integer getCode() {\n        return code;\n    }\n\n    public void setCode(Integer code) {\n        this.code = code;\n    }\n\n    public String getErrorMessage() {\n        return errorMessage;\n    }\n\n    public void setErrorMessage(String errorMessage) {\n        this.errorMessage = errorMessage;\n    }\n    \n    public static CommonException throwEx(AbstractServiceException e) {\n    \tthrow new CommonException(e);\n    }\n    \n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/exception/CommonExceptionEnum.java",
    "content": "package com.xiao.springcloud.demo.common.exception;\n\n/**\n * 异常公共类\n *\n * @author zhdong\n */\npublic enum CommonExceptionEnum implements AbstractServiceException\n{\n\n    SYSTEM_ERROR(10000, \"系统错误，请联系管理员\"),\n    TOKEN_HAS_EXPIRED(10010, \"token已过期\"),\n    REMOTE_SERVICE_NULL(10020, \"远程调用错误\"),\n    REMOTE_SERVICE_TIMEOUT(10021, \"请求超时\"),\n    SERVICE_ERROR(10030, \"服务内部错误\"),\n    IO_ERROR(10050, \"读取IO异常\"),\n    NO_FOUNT(10031, \"访问路径不存在\"),\n    NO_LOGIN(10060, \"没有登录或者登录超时\");\n\n    CommonExceptionEnum(Integer code, String message)\n    {\n        this.code = code;\n        this.message = message;\n    }\n\n    private Integer code;\n\n    private String message;\n\n    @Override\n    public Integer getCode()\n    {\n        return code;\n    }\n\n    @Override\n    public String getMessage()\n    {\n        return message;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/forkjoin/ForkjoinConfiguration.java",
    "content": "package com.xiao.springcloud.demo.common.forkjoin;\n\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.concurrent.ForkJoinPool;\n\n/**\n * [简要描述]: fork join 配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/14 16:14\n * @since JDK 1.8\n */\n@Configuration\npublic class ForkjoinConfiguration implements DisposableBean\n{\n    private ForkJoinPool forkJoinPool;\n\n    @Bean\n    public ForkJoinPool forkJoinPool()\n    {\n        ForkJoinPool forkJoinPool = new ForkJoinPool();\n        this.forkJoinPool = forkJoinPool;\n        return forkJoinPool;\n    }\n\n    /**\n     * Invoked by a BeanFactory on destruction of a singleton.\n     *\n     * @exception Exception in case of shutdown errors.\n     * Exceptions will get logged but not rethrown to allow\n     * other beans to release their resources too.\n     */\n    @Override\n    public void destroy() throws Exception\n    {\n        if (null != forkJoinPool)\n        {\n            forkJoinPool.shutdown();\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/forkjoin/ForkjoinService.java",
    "content": "package com.xiao.springcloud.demo.common.forkjoin;\n\nimport com.xiao.springcloud.demo.common.forkjoin.task.ForkjoinTask;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.concurrent.ForkJoinPool;\n\n/**\n * [简要描述]: fork join执行数组加操作 demo\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/6/11 20:02\n * @since JDK 1.8\n */\n@Service\npublic class ForkjoinService\n{\n    @Autowired\n    private ForkJoinPool forkJoinPool;\n\n    public Integer addNumbers(List<Integer> numbers)\n    {\n        ForkjoinTask forkjoinTask = new ForkjoinTask(numbers, 0, numbers.size());\n        Integer count = forkJoinPool.invoke(forkjoinTask);\n        return count;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/forkjoin/task/ForkjoinTask.java",
    "content": "package com.xiao.springcloud.demo.common.forkjoin.task;\n\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport java.util.concurrent.RecursiveTask;\n\n/**\n * [简要描述]: fork join demo操作\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/6/11 19:55\n * @since JDK 1.8\n */\npublic class ForkjoinTask extends RecursiveTask<Integer>\n{\n    /**\n     * 待处理的平台商品数据\n     */\n    private CopyOnWriteArrayList<Integer> arrayList;\n\n    /**\n     * 拆分条件\n     */\n    private static int THRESHOLD = 500;\n\n    private int start;\n    private int end;\n\n    public ForkjoinTask(List<Integer> arrayList, int start, int end)\n    {\n        this.arrayList = new CopyOnWriteArrayList<>(arrayList);\n        this.start = start;\n        this.end = end;\n    }\n\n    /**\n     * The main computation performed by this task.\n     *\n     * @return the result of the computation\n     */\n    @Override\n    protected Integer compute()\n    {\n        if (end - start <= THRESHOLD)\n        {\n            return add(arrayList);\n        }\n        else\n        {\n            int middle = (end + start) / 2;\n            List<Integer> arrayList1 = arrayList.subList(start, middle);\n            List<Integer> arrayList2 = arrayList.subList(middle, end);\n            ForkjoinTask forkjoinTask1 = new ForkjoinTask(arrayList1, 0, arrayList1.size());\n            ForkjoinTask forkjoinTask2 = new ForkjoinTask(arrayList2, 0, arrayList2.size());\n            invokeAll(forkjoinTask1, forkjoinTask2);\n            return forkjoinTask1.join() + forkjoinTask2.join();\n        }\n    }\n\n    private Integer add(CopyOnWriteArrayList<Integer> arrayList)\n    {\n        int status = 0;\n        for (Integer integer : arrayList)\n        {\n            status += integer;\n        }\n        return status;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/README.md",
    "content": "springcloud fegin内部交互异常统一处理\n\n原理：\n1. 服务端抛出统一异常，由DefaultControllerAdvice方法捕捉封装，期需要将http response的响应头设置为500\n2. 客户端自定义解码器，对异常进行解码，由CommonFeignErrorDecoder进行对异常处理\n\n\n服务端客户端交互部分对象传输为空：\n  自定义httpmessageconvert，由FastjsonConfig类处理，添加fastjson转换"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/advice/DefaultControllerAdvice.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.advice;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.netflix.hystrix.exception.HystrixRuntimeException;\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.springcloud.demo.common.exception.CommonExceptionEnum;\nimport com.xiao.springcloud.demo.common.gloab.response.ErrorResponseData;\nimport com.xiao.springcloud.demo.common.gloab.response.ResponseData;\nimport feign.RetryableException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\n\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 全局的的异常拦截器（拦截所有的控制器）\n * （带有@RequestMapping注解的方法上都会拦截）\n *\n * @author zhdong\n */\n@Slf4j\n@ControllerAdvice\npublic class DefaultControllerAdvice\n{\n\n    @Autowired\n    private ObjectMapper objectMapper;\n\n    /**\n     * 拦截common异常\n     */\n    @ExceptionHandler(CommonException.class)\n    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n    @ResponseBody\n    public ResponseData serviceException(CommonException e)\n    {\n        log.error(\"系统异常:\", e);\n        return new ErrorResponseData(e.getCode(), e.getErrorMessage());\n    }\n\n    /**\n     * 拦截common异常\n     */\n    @ExceptionHandler(HystrixRuntimeException.class)\n    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n    @ResponseBody\n    public ResponseData hystrixRuntimeException(HystrixRuntimeException e)\n    {\n        log.error(\"系统异常:\", e);\n        Throwable cause = e.getCause();\n        //return new ErrorResponseData(e.getCode(), e.getErrorMessage());\n        if (cause instanceof CommonException)\n        {\n            return serviceException((CommonException) cause);\n        }\n        cause = e.getFallbackException();\n        if (null != cause)\n        {\n            log.error(\"服务调用熔断异常：\", cause);\n            // 解决服务之间调用，自定义熔断内抛出的异常处理\n            if (null != cause.getCause())\n            {\n                Throwable e1 = cause.getCause().getCause();\n                if (null != e1 && e1 instanceof CommonException)\n                {\n                    return serviceException((CommonException) e1);\n                }\n            }\n        }\n        return new ErrorResponseData(CommonExceptionEnum.REMOTE_SERVICE_NULL\n                .getCode(), CommonExceptionEnum.REMOTE_SERVICE_NULL.getMessage());\n    }\n\n    /**\n     * 拦截RetryableException异常\n     */\n    @ExceptionHandler(RetryableException.class)\n    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n    @ResponseBody\n    public ResponseData retryableException(RetryableException e)\n    {\n        log.error(\"系统异常:\", e);\n        return new ErrorResponseData(CommonExceptionEnum.REMOTE_SERVICE_TIMEOUT\n                .getCode(), CommonExceptionEnum.REMOTE_SERVICE_TIMEOUT.getMessage());\n    }\n\n    /**\n     * 拦截未知的运行时异常\n     */\n    @ExceptionHandler(Exception.class)\n    @ResponseBody\n    public ResponseData notFount(Exception e, HttpServletResponse reponse)\n    {\n        if (HttpStatus.NOT_FOUND.value() == reponse.getStatus())\n        {\n            log.error(CommonExceptionEnum.NO_FOUNT.getMessage(), e);\n            return new ErrorResponseData(CommonExceptionEnum.NO_FOUNT.getCode(), CommonExceptionEnum.NO_FOUNT\n                    .getMessage());\n        }\n        log.error(CommonExceptionEnum.SYSTEM_ERROR.getMessage(), e);\n        // 设置httpresponse头为500信息\n        reponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());\n        return new ErrorResponseData(CommonExceptionEnum.SYSTEM_ERROR.getCode(), CommonExceptionEnum.SYSTEM_ERROR\n                .getMessage());\n    }\n\n    //\t@Override\n    //\tpublic boolean supports(MethodParameter methodParameter, Class aClass) {\n    //\t\treturn true;\n    //\t}\n    //\n    //\t/**\n    //\t * 封装返回结果\n    //\t * @param returnValue\n    //\t * @param methodParameter\n    //\t * @param mediaType\n    //\t * @param aClass\n    //\t * @param serverHttpRequest\n    //\t * @param serverHttpResponse\n    //\t * @return\n    //\t */\n    //\t@Override\n    //\tpublic Object beforeBodyWrite(Object returnValue, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {\n    //\n    //\t\t//如果已经是ResponseData，直接返回\n    //\t\tif ( returnValue instanceof ResponseData) {\n    //\t\t\treturn returnValue;\n    //\t\t}\n    //\t\telse if ( returnValue instanceof  String ){\n    //\t\t\ttry {\n    //\t\t\t\treturn objectMapper.writeValueAsString(SuccessResponseData.success(returnValue));\n    //\t\t\t}catch (Exception e){\n    //\t\t\t\tlog.error(\"返回结果转换json异常\",e);\n    //\t\t\t\treturn ErrorResponseData.error(\"返回结果转换json异常\");\n    //\t\t\t}\n    //\t\t}\n    //\n    //\t\treturn SuccessResponseData.success(returnValue);\n    //\t}\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/config/FastjsonConfig.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.config;\n\nimport com.alibaba.fastjson.parser.ParserConfig;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\nimport com.alibaba.fastjson.support.config.FastJsonConfig;\nimport com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.MediaType;\n\nimport java.nio.charset.Charset;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * fastjson配置类\n *\n * @author zhdong\n */\n@Configuration(\"defaultFastjsonConfig\")\n@ConditionalOnClass(com.alibaba.fastjson.JSON.class)\n@ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)\n@ConditionalOnWebApplication\npublic class FastjsonConfig\n{\n\n    @Bean\n    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter()\n    {\n        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();\n        converter.setFastJsonConfig(fastjsonConfig());\n        converter.setSupportedMediaTypes(getSupportedMediaType());\n        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);\n        return converter;\n    }\n\n    /**\n     * fastjson的配置\n     */\n    public FastJsonConfig fastjsonConfig()\n    {\n        FastJsonConfig fastJsonConfig = new FastJsonConfig();\n        fastJsonConfig.setSerializerFeatures(\n                //SerializerFeature.PrettyFormat,  //格式化输出 ，仅限调试使用\n                SerializerFeature.WriteMapNullValue,  //是否输出值为null的字段,默认为false\n                SerializerFeature.DisableCircularReferenceDetect, //消除循环引用\n                SerializerFeature.WriteNullListAsEmpty //List字段如果为null,输出为[],而非null\n        );\n        fastJsonConfig.setDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        fastJsonConfig.setCharset(Charset.forName(\"utf-8\"));\n        //不需要将null转换为空字符\n//        ValueFilter valueFilter = (object, name, value) -> {\n//            return null == value ? \"\" : value;\n//        };\n//        fastJsonConfig.setSerializeFilters(valueFilter);\n        return fastJsonConfig;\n    }\n\n    /**\n     * 支持的mediaType类型\n     */\n    public List<MediaType> getSupportedMediaType()\n    {\n        ArrayList<MediaType> mediaTypes = new ArrayList<>();\n\n        mediaTypes.add(MediaType.APPLICATION_JSON);\n        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);\n        mediaTypes.add(MediaType.APPLICATION_ATOM_XML);\n        mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);\n        mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);\n        mediaTypes.add(MediaType.APPLICATION_PDF);\n        mediaTypes.add(MediaType.APPLICATION_RSS_XML);\n        mediaTypes.add(MediaType.APPLICATION_XHTML_XML);\n        mediaTypes.add(MediaType.APPLICATION_XML);\n        mediaTypes.add(MediaType.IMAGE_GIF);\n        mediaTypes.add(MediaType.IMAGE_JPEG);\n        mediaTypes.add(MediaType.IMAGE_PNG);\n        mediaTypes.add(MediaType.TEXT_EVENT_STREAM);\n        mediaTypes.add(MediaType.TEXT_HTML);\n        mediaTypes.add(MediaType.TEXT_MARKDOWN);\n        mediaTypes.add(MediaType.TEXT_PLAIN);\n        mediaTypes.add(MediaType.TEXT_XML);\n\n        //增加解析spring boot actuator结果的解析\n        mediaTypes.add(MediaType.valueOf(\"application/vnd.spring-boot.actuator.v2+json\"));\n\n        return mediaTypes;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/config/FeignConfig.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.config;\n\nimport com.xiao.springcloud.demo.common.gloab.interceptor.fegin.CommonFeignErrorDecoder;\nimport com.xiao.springcloud.demo.common.gloab.interceptor.fegin.CommonFeignHeaderProcessInterceptor;\nimport com.xiao.springcloud.demo.common.gloab.interceptor.fegin.DefaultCommonErrorAttributes;\nimport feign.RequestInterceptor;\nimport feign.codec.ErrorDecoder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * feign的错误编码配置（为了feign接收到错误的返回，转化成roses可识别的ServiceException）\n *\n * @author zhdong\n * @Date 2018/8/30 11:11\n */\n@Configuration\npublic class FeignConfig {\n\n    /**\n     * roses自定义错误解码器\n     */\n    //    @Bean\n    //    @Scope(\"prototype\")\n    //    public Feign.Builder feignHystrixBuilder() {\n    //        return HystrixFeign.builder().errorDecoder(new CommonFeignErrorDecoder());\n    //    }\n    @Bean\n    public ErrorDecoder errorDecoder(){\n        return new CommonFeignErrorDecoder();\n    }\n\n    /**\n     * feign请求加上当前请求接口的headers\n     */\n    @Bean\n    public RequestInterceptor requestInterceptor() {\n        return new CommonFeignHeaderProcessInterceptor();\n    }\n\n    /**\n     * 覆盖spring默认的响应消息格式\n     */\n    @Bean\n    public DefaultCommonErrorAttributes defaultRosesErrorAttributes() {\n        return new DefaultCommonErrorAttributes();\n    }\n\n}"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/fegin/CommonFeignErrorDecoder.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.fegin;\n\nimport cn.hutool.core.io.IoUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.springcloud.demo.common.exception.CommonExceptionEnum;\nimport feign.Response;\nimport feign.codec.ErrorDecoder;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.io.IOException;\n\n/**\n * 错误解码器\n *\n * @author zhdong\n */\n@Slf4j\npublic class CommonFeignErrorDecoder implements ErrorDecoder\n{\n\n    @Override\n    public Exception decode(String methodKey, Response response)\n    {\n        log.error(\"调用服务返回Response:\" + response);\n        String responseBody;\n        try\n        {\n            if (response == null || response.body() == null)\n            {\n                log.error(\"未得到服务端的响应结果...\");\n                if (response != null && response.status() == 404)\n                {\n                    return new CommonException(CommonExceptionEnum.REMOTE_SERVICE_NULL);\n                }\n                else\n                {\n                    return new CommonException(CommonExceptionEnum.SERVICE_ERROR);\n                }\n            }\n            responseBody = IoUtil.read(response.body().asInputStream(), \"UTF-8\");\n        }\n        catch (IOException e)\n        {\n            log.error(\"读取Response响应io错误\", e);\n            return new CommonException(CommonExceptionEnum.IO_ERROR);\n        }\n\n        log.error(\"服务提供方返回异常结果为：\" + responseBody);\n        JSONObject parse = JSON.parseObject(responseBody);\n        Integer code = parse.getInteger(\"code\");\n        String message = parse.getString(\"message\");\n        if (message == null)\n        {\n            message = CommonExceptionEnum.SERVICE_ERROR.getMessage();\n        }\n        if (code == null)\n        {\n            //status为spring默认返回的数据\n            Integer status = parse.getInteger(\"status\");\n\n            if (status == null)\n            {\n                return new CommonException(CommonExceptionEnum.SERVICE_ERROR.getCode(), message);\n            }\n            else\n            {\n                return new CommonException(status, message);\n            }\n        }\n        else\n        {\n            return new CommonException(code, message);\n        }\n    }\n}"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/fegin/CommonFeignHeaderProcessInterceptor.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.fegin;\n\nimport feign.RequestInterceptor;\nimport feign.RequestTemplate;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Enumeration;\n\n/**\n * feign远程调用添加header的过滤器\n *\n * @author zhdong\n */\npublic class CommonFeignHeaderProcessInterceptor implements RequestInterceptor\n{\n\n    @Override\n    public void apply(RequestTemplate requestTemplate)\n    {\n\n        //当前feign远程调用环境不是由http接口发起，例如test单元测试中的feign调用或者项目启动后的feign调用\n        HttpServletRequest request = null;\n\n        try\n        {\n            request = HttpContext.getRequest();\n        }\n        catch (NullPointerException e)\n        {\n\n            //被调环境中不存在request对象，则不往header里添加当前请求环境的header\n            return;\n        }\n        if (request != null)\n        {\n            Enumeration<String> headerNames = request.getHeaderNames();\n            if (headerNames != null)\n            {\n                while (headerNames.hasMoreElements())\n                {\n                    String name = headerNames.nextElement();\n                    String values = request.getHeader(name);\n                    requestTemplate.header(name, values);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/fegin/DefaultCommonErrorAttributes.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.fegin;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.xiao.springcloud.demo.common.exception.CommonExceptionEnum;\nimport com.xiao.springcloud.demo.common.gloab.response.ResponseData;\nimport org.springframework.boot.autoconfigure.web.DefaultErrorAttributes;\nimport org.springframework.web.context.request.RequestAttributes;\n\nimport java.util.Map;\n\n/**\n * 重写spring得默认响应提示信息\n *\n * @author zhdong\n * @Date 2018/8/30 23:14\n */\npublic class DefaultCommonErrorAttributes extends DefaultErrorAttributes\n{\n\n    @Override\n    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {\n        return BeanUtil.beanToMap(ResponseData.error(CommonExceptionEnum.SERVICE_ERROR.getMessage()));\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/fegin/FeignBeanFactoryPostProcessor.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.fegin;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.config.BeanDefinition;\nimport org.springframework.beans.factory.config.BeanFactoryPostProcessor;\nimport org.springframework.beans.factory.config.ConfigurableListableBeanFactory;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Arrays;\n\n/**\n * [简要描述]: 解决junit测试完毕销毁FeignContext 异常问题\n * [详细描述]: 异常信息：BeanCreationNotAllowedException: Error creating bean with name 'eurekaAutoServic'....\n * git 参考地址：https://github.com/spring-cloud/spring-cloud-netflix/issues/1952\n *\n * @author llxiao\n * @version 1.0, 2018/9/11 15:19\n * @since JDK 1.8\n */\n@Component\npublic class FeignBeanFactoryPostProcessor implements BeanFactoryPostProcessor\n{\n    @Override\n    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException\n    {\n        if (containsBeanDefinition(beanFactory, \"feignContext\", \"eurekaAutoServiceRegistration\"))\n        {\n            BeanDefinition bd = beanFactory.getBeanDefinition(\"feignContext\");\n            bd.setDependsOn(\"eurekaAutoServiceRegistration\");\n        }\n    }\n\n    private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans)\n    {\n        return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/interceptor/fegin/HttpContext.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.interceptor.fegin;\n\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 快捷获取HttpServletRequest,HttpServletResponse\n *\n * @author zhdong\n */\npublic class HttpContext\n{\n\n    public static String getIp()\n    {\n        return HttpContext.getRequest().getRemoteHost();\n    }\n\n    public static HttpServletResponse getResponse() throws NullPointerException\n    {\n        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();\n    }\n\n    public static HttpServletRequest getRequest() throws NullPointerException\n    {\n        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())\n                .getRequest();\n        return request;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/response/ErrorResponseData.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.response;\n\n\n/**\n * 请求失败的返回\n *\n * @author zhdong\n * @Date 2018/8/1\n */\npublic class ErrorResponseData extends ResponseData {\n\n    public ErrorResponseData() {\n    }\n\n    public ErrorResponseData(String message) {\n        super(false, DEFAULT_ERROR_CODE, message, null);\n    }\n\n    public ErrorResponseData(Integer code, String message) {\n        super(false, code, message, null);\n    }\n\n    public ErrorResponseData(Integer code, String message, Object object) {\n        super(false, code, message, object);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/response/ResponseData.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.response;\n\n\nimport java.io.Serializable;\n\n/**\n * 返回给前台的通用包装\n *\n * @author zhdong\n * @Date 2018/8/1\n */\npublic class ResponseData implements Serializable {\n\n    public static final String DEFAULT_SUCCESS_MESSAGE = \"请求成功\";\n\n    public static final String DEFAULT_ERROR_MESSAGE = \"网络异常\";\n\n    public static final Integer DEFAULT_SUCCESS_CODE = 200;\n\n    public static final Integer DEFAULT_ERROR_CODE = 500;\n\n    /**\n     * 请求是否成功\n     */\n    private Boolean success;\n\n    /**\n     * 响应状态码\n     */\n    private Integer code;\n\n    /**\n     * 响应信息\n     */\n    private String message;\n\n    /**\n     * 响应对象\n     */\n    private Object data;\n\n    public ResponseData() {\n    }\n\n    public ResponseData(Boolean success, Integer code, String message, Object data) {\n        this.success = success;\n        this.code = code;\n        this.message = message;\n        this.data = data;\n    }\n\n    public Boolean getSuccess() {\n        return success;\n    }\n\n    public void setSuccess(Boolean success) {\n        this.success = success;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n\n    public Integer getCode() {\n        return code;\n    }\n\n    public void setCode(Integer code) {\n        this.code = code;\n    }\n\n    public static SuccessResponseData success() {\n        return new SuccessResponseData(null);\n    }\n\n    public static SuccessResponseData success(Object data) {\n        return new SuccessResponseData(data);\n    }\n\n    public static SuccessResponseData success(Integer code, String message, Object data) {\n        return new SuccessResponseData(code, message, data);\n    }\n\n    public static ErrorResponseData error(String message) {\n        return new ErrorResponseData(message);\n    }\n\n    public static ErrorResponseData error(Integer code, String message) {\n        return new ErrorResponseData(code, message);\n    }\n\n    public static ErrorResponseData error(Integer code, String message, Object object) {\n        return new ErrorResponseData(code, message, object);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/gloab/response/SuccessResponseData.java",
    "content": "package com.xiao.springcloud.demo.common.gloab.response;\n\n/**\n * 请求成功的返回\n *\n * @author zhdong\n * @Date 2018/8/1\n */\npublic class SuccessResponseData extends ResponseData {\n\n    public SuccessResponseData() {\n    }\n\n    public SuccessResponseData(Object object) {\n        super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object);\n    }\n\n    public SuccessResponseData(Integer code, String message, Object object) {\n        super(true, code, message, object);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/LogAnnotation.java",
    "content": "package com.xiao.springcloud.demo.common.logaspect;\n\nimport java.lang.annotation.*;\n\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]: 自定义日志注解<br/>\n * [详细描述]: 既可以在方法上注解，也可以在类上进行注解<br/>\n *\n * @author llxiao\n * @version 1.0, 2018/9/2 16:46\n * @since JDK 1.8\n */\n@Retention(RUNTIME)// 注解会在class字节码文件中存在，在运行时可以通过反射获取到\n@Inherited//说明子类可以继承父类中的该注解\n@Target(ElementType.METHOD)//既可以在方法上，也可以在类上\n@Documented//说明该注解将被包含在javadoc中\npublic @interface LogAnnotation\n{\n    String value() default \"\";\n\n    /**\n     * [简要描述]:自定义注解，需要添加一些额外的日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.lang.String\n     * llxiao  2018/9/2 - 16:50\n     **/\n    String customer() default \"\";\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/LogAspect.java",
    "content": "package com.xiao.springcloud.demo.common.logaspect;\n\nimport com.alibaba.fastjson.JSON;\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.commons.lang3.time.StopWatch;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.Signature;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 切面日志处理类<br/>\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/2 16:52\n * @since JDK 1.8\n */\n@Aspect\n@Component\npublic class LogAspect\n{\n    /**\n     * 日志服务\n     */\n    @Autowired\n    private LogService logService;\n\n    /**\n     * [简要描述]:定义一个annotation切入点<br/>\n     * [详细描述]:切入点<br/>\n     * llxiao  2018/9/2 - 17:02\n     **/\n    @Pointcut(\"@annotation(com.xiao.springcloud.demo.common.logaspect.LogAnnotation)\")\n    public void logAnnotatison()\n    {\n\n    }\n\n    // around 切面强化\n    @Around(\"logAnnotatison()\")\n    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable\n    {\n\n        LogInfo logInfo = new LogInfo();\n        logInfo.setRequestTime(new Timestamp(System.currentTimeMillis()));\n        //通知签名\n        Signature signature = joinPoint.getSignature();\n        //代理的是哪一个方法\n        String methodName = signature.getName();\n        //AOP代理类的名字\n        String className = joinPoint.getTarget().getClass().getName();\n        logInfo.setClsName(className);\n        logInfo.setMethodName(methodName);\n        //获取方法参数\n        Object[] args = joinPoint.getArgs();\n        logInfo.setParams(JSON.toJSONString(args));\n        Object retrunobj = null;\n        //计时工具\n        StopWatch clock = new StopWatch();\n        Throwable tempE = null;\n        clock.start();\n        try\n        {\n            // 注意和finally中的执行顺序 finally是在return中的计算结束返回前执行\n            retrunobj = joinPoint.proceed(args);\n        }\n        catch (Throwable e)\n        {\n            tempE = e;\n            throw e;\n        }\n        finally\n        {\n            boolean isError = setResultAndError(joinPoint, logInfo, retrunobj, clock, tempE);\n            logInfo.setResponseTime(new Timestamp(System.currentTimeMillis()));\n            setHostInfo(logInfo);\n            if (isError)\n            {\n                //记录日志\n                logService.error(JSON.toJSONString(logInfo), tempE);\n            }\n            else\n            {\n                logService.info(JSON.toJSONString(logInfo));\n            }\n        }\n        return retrunobj;\n    }\n\n    /**\n     * [简要描述]:设置一些网络参数设置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param logInfo :\n     * @return void\n     * llxiao  2018/9/20 - 9:30\n     **/\n    private void setHostInfo(LogInfo logInfo)\n    {\n        // 本机IP信息\n        try\n        {\n            InetAddress local = InetAddress.getLocalHost();\n            if (null != local)\n            {\n                logInfo.setServerHost(local.getHostName());\n                logInfo.setServerIp(local.getHostAddress());\n            }\n        }\n        catch (UnknownHostException e)\n        {\n            logService.warn(\"UnknownHostException\");\n        }\n\n        // 请求IP信息\n        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();\n        HttpServletRequest request = attributes.getRequest();\n        if (null != request)\n        {\n            logInfo.setClientIp(request.getRemoteAddr());\n            logInfo.setClientHost(request.getRemoteHost());\n            logInfo.setRequestUri(request.getRequestURI());\n            logInfo.setClientPort(request.getRemotePort());\n            logInfo.setServerPort(request.getLocalPort());\n        }\n    }\n\n    /**\n     * [简要描述]:记录日志<br/>\n     * [详细描述]:<br/>\n     *\n     * @param joinPoint :\n     * @param logInfo :\n     * @param retrunobj :\n     * @param clock :\n     * @param tempE :\n     * @return true 未知异常\n     * llxiao  2018/9/8 - 9:53\n     **/\n    private boolean setResultAndError(ProceedingJoinPoint joinPoint, LogInfo logInfo, Object retrunobj, StopWatch clock,\n            Throwable tempE)\n    {\n        clock.stop();\n        logInfo.setResult(JSON.toJSONString(retrunobj));\n        logInfo.setCostTime(clock.getTime());\n        MethodSignature ms = (MethodSignature) joinPoint.getSignature();\n        //从切面中获取当前方法\n        Method method = ms.getMethod();\n        //得到了方,提取出他的注解\n        LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);\n        String customerInfo = logAnnotation.customer();\n        //自定义的一些消息\n        if (StringUtils.isNotBlank(customerInfo))\n        {\n            logInfo.setRemark(customerInfo);\n        }\n        if (null != tempE)\n        {\n            logInfo.setStatus(LogInfo.FAILED);\n            // 业务异常处理不需要打印堆栈信息\n            if (tempE instanceof CommonException)\n            {\n                CommonException ce = (CommonException) tempE;\n                logInfo.setErrorCode(ce.getCode());\n                logInfo.setErrorMsg(ce.getErrorMessage());\n            }\n            else\n            {\n                // 未知异常打印堆栈信息\n                logInfo.setErrorMsg(tempE.getMessage());\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/LogInfo.java",
    "content": "package com.xiao.springcloud.demo.common.logaspect;\n\nimport com.alibaba.fastjson.annotation.JSONField;\nimport lombok.Data;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]:\n * [详细描述]: fast.JSON.tostring时timestamp会转成long类型的，需要指定JSONField格式\n *\n * @author llxiao\n * @version 1.0, 2018/9/20 09:53\n * @since JDK 1.8\n */\n@Data\npublic class LogInfo\n{\n    //失败\n    public static final int FAILED = 1;\n\n    //类名\n    private String clsName;\n    //方法名\n    private String methodName;\n    //请求参数\n    private String params;\n    //返回值\n    private String result;\n    //调用花费时间 ms\n    private Long costTime;\n    //其他信息\n    private String remark;\n\n    //请求时间\n    @JSONField(format = \"yyyy-MM-dd HH:mm:ss\")\n    private Timestamp requestTime;\n    //响应时间\n    @JSONField(format = \"yyyy-MM-dd HH:mm:ss\")\n    private Timestamp responseTime;\n\n    //成功状态。0成功，1失败\n    private int status;\n\n    //错误码\n    private int errorCode;\n    //错误消息\n    private String errorMsg;\n\n    //网络请求信息\n    private String serverIp;\n    private String serverHost;\n    private int serverPort;\n\n    private String clientIp;\n    private String clientHost;\n    private int clientPort;\n    private String requestUri;\n\n    @Override\n    public String toString()\n    {\n        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/LogService.java",
    "content": "package com.xiao.springcloud.demo.common.logaspect;\n\n/**\n * [简要描述]: 日志服务 <br/>\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/2 16:53\n * @since JDK 1.8\n */\npublic interface LogService\n{\n    /**\n     * [简要描述]:debug日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param debugMsg : debug日志\n     * @return void\n     * llxiao  2018/9/2 - 16:57\n     **/\n    void debug(String debugMsg);\n\n    /**\n     * [简要描述]:info 日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param message : 日志信息\n     * @return void\n     * llxiao  2018/9/2 - 16:55\n     **/\n    void info(String message);\n\n    /**\n     * [简要描述]:error 日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param errorMsg : 错误消息\n     * @param e : 异常\n     * @return void\n     * llxiao  2018/9/2 - 16:55\n     **/\n    void error(String errorMsg, Throwable e);\n\n    /**\n     * 警告日志\n     *\n     * @param message\n     */\n    void warn(String message);\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/README.md",
    "content": "1. 在需要记录日志的方法上添加 ``@LogAnnotation`` 注解即可\n2. 实现原理：<br>\n   > 主要利用annotation注解+aop方式 <br>\n   > 具体实现见：``LogAspect``类 <br>\n3. 日志记录采用``LogService`` 接口，当前底层实现为slf4j，可自定义扩展\n4. 结合ekl+kafka案例,[参考](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Kafka-Elk)"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/logaspect/Slf4jLogService.java",
    "content": "package com.xiao.springcloud.demo.common.logaspect;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: slf4j日志记录\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/2 16:58\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class Slf4jLogService implements LogService\n{\n    /**\n     * [简要描述]:debug日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param debugMsg : debug日志\n     * llxiao  2018/9/2 - 16:57\n     **/\n    @Override\n    public void debug(String debugMsg)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(debugMsg);\n        }\n    }\n\n    /**\n     * [简要描述]:info 日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param message : 日志信息\n     * llxiao  2018/9/2 - 16:55\n     **/\n    @Override\n    public void info(String message)\n    {\n        if (log.isInfoEnabled())\n        {\n            log.info(message);\n        }\n    }\n\n    /**\n     * 警告日志\n     *\n     * @param message\n     */\n    @Override\n    public void warn(String message)\n    {\n        log.warn(message);\n    }\n\n    /**\n     * [简要描述]:error 日志记录<br/>\n     * [详细描述]:<br/>\n     *\n     * @param errorMsg : 错误消息\n     * @param e : 异常\n     * llxiao  2018/9/2 - 16:55\n     **/\n    @Override\n    public void error(String errorMsg, Throwable e)\n    {\n        log.error(errorMsg, e);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/SignConstants.java",
    "content": "package com.xiao.springcloud.demo.common.sign;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 18:22\n * @since JDK 1.8\n */\npublic interface SignConstants\n{\n    String GET_METHOD = \"GET\";\n    String POST_METHOD = \"POST\";\n\n    String ISO_8859_1 = \"ISO-8859-1\";\n    String UTF_8 = \"UTF-8\";\n\n    String JSON_TYPE = \"application/json\";\n\n    /*******header params********/\n\n    String SIGN_NAME = \"sign\";\n    String APP_ID = \"appid\";\n\n    /**\n     * 服务端计算出来的签名参数\n     */\n    String SEVER_SIGN = \"serverSign\";\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/annotation/DisposeSign.java",
    "content": "package com.xiao.springcloud.demo.common.sign.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2020/2/17 23:35\n * @since JDK 1.8\n */\n@Target({ ElementType.METHOD })\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DisposeSign\n{\n    /**\n     * 是否验签\n     *\n     * @return 默认验签\n     */\n    boolean isVerifySign() default true;\n}"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/annotation/DisposeSignService.java",
    "content": "package com.xiao.springcloud.demo.common.sign.annotation;\n\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.springcloud.demo.common.sign.SignConstants;\nimport com.xiao.springcloud.demo.common.sign.service.AppManagerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\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;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2020/2/17 23:39\n * @since JDK 1.8\n */\n@Slf4j\n@Aspect\n@Component\npublic class DisposeSignService\n{\n\n    @Autowired\n    private AppManagerService appManagerService;\n\n    @Pointcut(\"@annotation(omni.purcotton.omni.inface.center.common.sign.annotation.DisposeSign)\")\n    public void requestAnnotation()\n    {\n    }\n\n    @Around(\"requestAnnotation() && @annotation(disposeSign)\")\n    public Object execute(ProceedingJoinPoint joinPoint, DisposeSign disposeSign) throws Throwable\n    {\n        Object[] args = joinPoint.getArgs();\n        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();\n        final HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();\n        if (null == request)\n        {\n            // 无reqeust直接放行\n            return joinPoint.proceed(args);\n        }\n\n        // 签名校验\n        if (disposeSign.isVerifySign())\n        {\n            String uri = request.getRequestURI();\n            // 获取当前的请求头中的签名\n            Map<String, String> header = this.assembleHeader(request);\n            String clientSign = String.valueOf(header.get(SignConstants.SIGN_NAME));\n            if (StringUtils.isBlank(clientSign))\n            {\n                log.error(\"请求服务器URL:{}缺少签名参数!\", uri);\n                throw new CommonException(1002, \"缺少签名参数\");\n            }\n            String appId = String.valueOf(header.get(SignConstants.APP_ID));\n\n            if (StringUtils.isBlank(appId))\n            {\n                log.error(\"请求服务器URL:{}缺少AppId参数!\", uri);\n                throw new CommonException(1002, \"缺少appid参数!\");\n            }\n\n            // 暂时保留\n            ///Long timestamp = (Long) header.get(TIMESTAMP);\n\n            if (appManagerService.exist(appId))\n            {\n                String serverSign = (String) request.getAttribute(SignConstants.SEVER_SIGN);\n                if (!clientSign.equals(serverSign))\n                {\n                    log.error(\"Appid:{} 请求服务器URL: {}，请求签名错误!\", appId, uri);\n                    log.error(\"客户端签名：{}，服务端签名：{}\", clientSign, serverSign);\n                    throw new CommonException(1000, \"签名错误!\");\n                }\n            }\n            else\n            {\n                log.error(\"请求服务器URL:{},App ID: {}非法请求\", uri, appId);\n                throw new CommonException(1001, \"请求非法，无appid\");\n            }\n            return joinPoint.proceed(args);\n        }\n        else\n        {\n            // 不需要签名校验，放行\n            return joinPoint.proceed(args);\n        }\n\n    }\n\n    private Map<String, String> assembleHeader(HttpServletRequest request)\n    {\n        Map<String, String> header = new HashMap<>(16);\n        Enumeration<String> enumeration = request.getHeaderNames();\n        while (enumeration.hasMoreElements())\n        {\n            String name = enumeration.nextElement();\n            String value = request.getHeader(name);\n            header.put(name, value);\n        }\n        return header;\n    }\n}"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/filter/WrapperRequestFilter.java",
    "content": "package com.xiao.springcloud.demo.common.sign.filter;\n\nimport com.xiao.springcloud.demo.common.sign.SignConstants;\nimport com.xiao.springcloud.demo.common.sign.request.BodyReaderHttpServletRequestWrapper;\nimport com.xiao.springcloud.demo.common.sign.service.AppManagerService;\nimport com.xiao.springcloud.demo.common.sign.util.HttpRequestUtils;\nimport com.xiao.springcloud.demo.common.sign.util.SignUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.*;\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.IOException;\n\n/**\n * [简要描述]: 包装reqeust使用\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 16:49\n * @since JDK 1.8\n */\n@Component\n@Slf4j\n@Order(1)\npublic class WrapperRequestFilter implements Filter\n{\n    @Autowired\n    private AppManagerService appManagerService;\n\n    /**\n     * Called by the web container to indicate to a filter that it is being\n     * placed into service. The servlet container calls the init method exactly\n     * once after instantiating the filter. The init method must complete\n     * successfully before the filter is asked to do any filtering work.\n     * <p>\n     * The web container cannot place the filter into service if the init method\n     * either:\n     * <ul>\n     * <li>Throws a ServletException</li>\n     * <li>Does not return within a time period defined by the web\n     *     container</li>\n     * </ul>\n     *\n     * @param filterConfig The configuration information associated with the\n     * filter instance being initialised\n     * @exception ServletException if the initialisation fails\n     */\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException\n    {\n\n    }\n\n    /**\n     * The <code>doFilter</code> method of the Filter is called by the container\n     * each time a request/response pair is passed through the chain due to a\n     * client request for a resource at the end of the chain. The FilterChain\n     * passed in to this method allows the Filter to pass on the request and\n     * response to the next entity in the chain.\n     * <p>\n     * A typical implementation of this method would follow the following\n     * pattern:- <br>\n     * 1. Examine the request<br>\n     * 2. Optionally wrap the request object with a custom implementation to\n     * filter content or headers for input filtering <br>\n     * 3. Optionally wrap the response object with a custom implementation to\n     * filter content or headers for output filtering <br>\n     * 4. a) <strong>Either</strong> invoke the next entity in the chain using\n     * the FilterChain object (<code>chain.doFilter()</code>), <br>\n     * 4. b) <strong>or</strong> not pass on the request/response pair to the\n     * next entity in the filter chain to block the request processing<br>\n     * 5. Directly set headers on the response after invocation of the next\n     * entity in the filter chain.\n     *\n     * @param request The request to process\n     * @param response The response associated with the request\n     * @param chain Provides access to the next filter in the chain for this\n     * filter to pass the request and response to for further\n     * processing\n     * @exception IOException if an I/O error occurs during this filter's\n     * processing of the request\n     * @exception ServletException if the processing fails for any other reason\n     */\n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException\n    {\n        // 防止流读取一次后就没有了, 所以需要将流继续写出去\n        HttpServletRequest req = (HttpServletRequest) request;\n        String appid = req.getHeader(SignConstants.APP_ID);\n        String sign = req.getHeader(SignConstants.SIGN_NAME);\n        if (StringUtils.isNotBlank(appid) && StringUtils.isNotBlank(sign))\n        {\n            String appKey = appManagerService.getAppKey(appid);\n            if (StringUtils.isNotEmpty(appKey))\n            {\n                // 计算服务端的签名\n                HttpServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(req);\n                String params = HttpRequestUtils.getAllParams(requestWrapper);\n\n                log.info(\"获取到的参数是===> 【{}】\", params);\n                log.info(\"获取到的KEY ====> 【{}】\", appKey);\n                if (StringUtils.isNotBlank(params))\n                {\n                    String serverSign = SignUtil.generateSign(params, appKey);\n                    requestWrapper.setAttribute(SignConstants.SEVER_SIGN, serverSign);\n                    chain.doFilter(requestWrapper, response);\n                    return;\n                }\n            }\n        }\n        chain.doFilter(request, response);\n\n    }\n\n    /**\n     * Called by the web container to indicate to a filter that it is being\n     * taken out of service. This method is only called once all threads within\n     * the filter's doFilter method have exited or after a timeout period has\n     * passed. After the web container calls this method, it will not call the\n     * doFilter method again on this instance of the filter. <br>\n     * <br>\n     * <p>\n     * This method gives the filter an opportunity to clean up any resources\n     * that are being held (for example, memory, file handles, threads) and make\n     * sure that any persistent state is synchronized with the filter's current\n     * state in memory.\n     */\n    @Override\n    public void destroy()\n    {\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/readme.md",
    "content": "提供生成签名串工具类<br>\n依赖包：\n```html\ncommons-lang3\ncommons-collections\ncommons-codec\nslf4j-api\nfastjson\n```\n使用方法方法：<br>\n```html\nSignUtil.generateSign(Map<String, String> kvParams, String key)\nSignUtil.generateSign(Map<String, String> kvParams, String jsonParams, String key)\nSignUtil.generateSignByJson(String jsonParams,String key)\nSignUtil.generateSign(String content,String key)\n```\n签名说明:\n1. KV参数拼接\n2. JSON请求参数，内部会做JSONObject转换，转成json字符串\n3. 将kv参数和json参数拼在一起，按ascii排序规则进行排序\n4. 对排序后的字符串做HmacSHA1加密\n\nSpringboot web应用签名：<br>\n1. 包装一个request读取request流数据费\n2. 自定义一个filter，处理request中header的sign和appid以及请求参数，通过appid找到对应的appkey通过签名工具生成服务端签名，放到reqeust周往下传\n3. 自定义一个注解@DisposeSign，需要签名的接口加上该注解即可\n4. AppManagerService管理appid和appKey对应的关系"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/request/BodyReaderHttpServletRequestWrapper.java",
    "content": "package com.xiao.springcloud.demo.common.sign.request;\n\nimport com.xiao.springcloud.demo.common.sign.SignConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport javax.servlet.ReadListener;\nimport javax.servlet.ServletInputStream;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletRequestWrapper;\nimport java.io.*;\nimport java.nio.charset.Charset;\n\n/**\n * [简要描述]: 包装reqeust 复制下request流，防止在controller层获取不到reqeust body情况\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 16:38\n * @since JDK 1.8\n */\n@Slf4j\npublic class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper\n{\n    private final byte[] body;\n\n    /**\n     * Constructs a request object wrapping the given request.\n     *\n     * @param request The request to wrap\n     * @exception IllegalArgumentException if the request is null\n     */\n    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)\n    {\n        super(request);\n        String sessionStream = getBodyString(request);\n        // 使用utf-8编码格式\n        body = sessionStream.getBytes(Charset.forName(SignConstants.UTF_8));\n    }\n\n    /**\n     * 获取请求Body\n     *\n     * @param request\n     * @return\n     */\n    public String getBodyString(final ServletRequest request)\n    {\n        String encode = request.getCharacterEncoding();\n        if (StringUtils.isBlank(encode))\n        {\n            encode = SignConstants.UTF_8;\n        }\n        StringBuilder sb = new StringBuilder();\n        try (InputStream inputStream = cloneInputStream(request.getInputStream());\n                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName(encode))))\n        {\n            String line;\n            while ((line = reader.readLine()) != null)\n            {\n                sb.append(line);\n            }\n        }\n        catch (IOException e)\n        {\n            log.error(\"Request流包装发生错误，\", e);\n        }\n        return sb.toString();\n    }\n\n    /**\n     * Description: 复制输入流</br>\n     *\n     * @param inputStream\n     */\n    public InputStream cloneInputStream(ServletInputStream inputStream)\n    {\n        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n        byte[] buffer = new byte[1024];\n        int len;\n        try\n        {\n            while ((len = inputStream.read(buffer)) > -1)\n            {\n                byteArrayOutputStream.write(buffer, 0, len);\n            }\n            byteArrayOutputStream.flush();\n        }\n        catch (IOException e)\n        {\n            log.error(\"Request流复制发生错误，\", e);\n        }\n        return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());\n    }\n\n    @Override\n    public BufferedReader getReader()\n    {\n        return new BufferedReader(new InputStreamReader(getInputStream()));\n    }\n\n    @Override\n    public ServletInputStream getInputStream()\n    {\n        final ByteArrayInputStream bais = new ByteArrayInputStream(body);\n        return new ServletInputStream()\n        {\n\n            @Override\n            public int read()\n            {\n\n                return bais.read();\n            }\n\n            @Override\n            public boolean isFinished()\n            {\n                return false;\n            }\n\n            @Override\n            public boolean isReady()\n            {\n                return false;\n            }\n\n            @Override\n            public void setReadListener(ReadListener readListener)\n            {\n\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/service/AppManagerService.java",
    "content": "package com.xiao.springcloud.demo.common.sign.service;\n\n/**\n * [简要描述]: 第三方App权限管理\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 09:23\n * @since JDK 1.8\n */\npublic interface AppManagerService\n{\n    /**\n     * [简要描述]:appId是否存在<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @return boolean\n     * xiaolinlin  2020/2/21 - 9:24\n     **/\n    boolean exist(String appId);\n\n    /**\n     * [简要描述]:appId获取对应的appKey<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 9:24\n     **/\n    String getAppKey(String appId);\n\n    /**\n     * [简要描述]:添加一个app应用信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @param appKey :\n     * @return boolean\n     * xiaolinlin  2020/2/21 - 9:25\n     **/\n    boolean addApp(String appId, String appKey);\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/service/impl/AppManagerServiceConfigImpl.java",
    "content": "package com.xiao.springcloud.demo.common.sign.service.impl;\n\nimport com.xiao.springcloud.demo.common.sign.service.AppManagerService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 09:27\n * @since JDK 1.8\n */\n@Service\npublic class AppManagerServiceConfigImpl implements AppManagerService, InitializingBean\n{\n    /**\n     * 本地内存APP info实现\n     */\n    private ConcurrentHashMap<String, String> appInfoMap = new ConcurrentHashMap<>();\n\n    /**\n     * appInfo配置实现<br>\n     * 格式：appId:appKey,appId2:appKey2\n     */\n    @Value(\"${interface.auth.app.info:1001:abcdefg111}\")\n    private String appInfo;\n\n    /**\n     * [简要描述]:appId是否存在<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @return boolean\n     * xiaolinlin  2020/2/21 - 9:24\n     **/\n    @Override\n    public boolean exist(String appId)\n    {\n        return appInfoMap.containsKey(appId);\n    }\n\n    /**\n     * [简要描述]:appId获取对应的appKey<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 9:24\n     **/\n    @Override\n    public String getAppKey(String appId)\n    {\n        return appInfoMap.get(appId);\n    }\n\n    /**\n     * [简要描述]:添加一个app应用信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId :\n     * @param appKey :\n     * @return boolean\n     * xiaolinlin  2020/2/21 - 9:25\n     **/\n    @Override\n    public boolean addApp(String appId, String appKey)\n    {\n        appInfoMap.put(appKey, appKey);\n        return true;\n    }\n\n    /**\n     * Invoked by a BeanFactory after it has set all bean properties supplied\n     * (and satisfied BeanFactoryAware and ApplicationContextAware).\n     * <p>This method allows the bean instance to perform initialization only\n     * possible when all bean properties have been set and to throw an\n     * exception in the event of misconfiguration.\n     *\n     * @exception Exception in the event of misconfiguration (such\n     * as failure to set an essential property) or if initialization fails.\n     */\n    @Override\n    public void afterPropertiesSet() throws Exception\n    {\n        if (StringUtils.isNotBlank(appInfo))\n        {\n            // 初始化appiId KV配置\n            String[] appInfos = appInfo.split(\",\");\n            for (String app : appInfos)\n            {\n                String[] appKv = app.split(\":\");\n                if (appKv.length == 2)\n                {\n                    appInfoMap.put(appKv[0], appKv[1]);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/util/AsciiSortUtil.java",
    "content": "package com.xiao.springcloud.demo.common.sign.util;\n\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * [简要描述]: ascii码排序工具\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 10:56\n * @since JDK 1.8\n */\npublic class AsciiSortUtil\n{\n    /**\n     * [简要描述]:对String进行ASCII码排序<br/>\n     * [详细描述]:<br/>\n     *\n     * @param str :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 11:00\n     **/\n    public static String sort(String str)\n    {\n        if (StringUtils.isNotBlank(str))\n        {\n            return new String(sort(str.toCharArray()));\n        }\n        return \"\";\n    }\n\n    /**\n     * [简要描述]:对char[] 进行ascii码排序<br/>\n     * [详细描述]:<br/>\n     *\n     * @param arr :\n     * @return char[]\n     * xiaolinlin  2020/2/21 - 11:01\n     **/\n    public static char[] sort(char[] arr)\n    {\n        //在排序前，先建好一个长度等于原数组长度的临时数组，避免递归中频繁开辟空间\n        char[] temp = new char[arr.length];\n        sort(arr, 0, arr.length - 1, temp);\n        return temp;\n    }\n\n    private static void sort(char[] arr, int left, int right, char[] temp)\n    {\n        if (left < right)\n        {\n            int mid = (left + right) / 2;\n            //递归的方法\n            //左边归并排序，使得左子序列有序\n            sort(arr, left, mid, temp);\n            //右边归并排序，使得右子序列有序\n            sort(arr, mid + 1, right, temp);\n            //将两个有序子数组合并操作\n            merge(arr, left, mid, right, temp);\n        }\n    }\n\n    private static void merge(char[] arr, int left, int mid, int right, char[] temp)\n    {\n        //左序列指针\n        int i = left;\n        //右序列指针\n        int j = mid + 1;\n        //临时数组指针\n        int t = 0;\n        while (i <= mid && j <= right)\n        {\n            if (arr[i] <= arr[j])\n            {\n                temp[t++] = arr[i++];\n            }\n            else\n            {\n                temp[t++] = arr[j++];\n            }\n        }\n        while (i <= mid)\n        {               //将左边剩余元素填充进temp中\n            temp[t++] = arr[i++];\n        }\n        while (j <= right)\n        {            //将右序列剩余元素填充进temp中\n            temp[t++] = arr[j++];\n        }\n        t = 0;\n        //将temp中的元素全部拷贝到原数组中\n        while (left <= right)\n        {\n            arr[left++] = temp[t++];\n        }\n    }\n\n    public static void main(String[] args)\n    {\n        String str = \"98uihsadfend.;lpsdf[{};sk]['\";\n        System.out.println(sort(str));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/util/HttpRequestUtils.java",
    "content": "package com.xiao.springcloud.demo.common.sign.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.demo.common.sign.SignConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.HttpMethod;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.Enumeration;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 18:35\n * @since JDK 1.8\n */\n@Slf4j\npublic class HttpRequestUtils\n{\n    /**\n     * [简要描述]:获取request中所有参数，get,post,json,form<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 18:59\n     **/\n    public static String getAllParams(HttpServletRequest request) throws IOException\n    {\n        //获取URL上的参数\n        String urlParams = \"\";\n        // get请求不需要拿body参数\n        if (!HttpMethod.GET.name().equals(request.getMethod()))\n        {\n            String contentType = request.getContentType();\n            if (SignConstants.JSON_TYPE.equals(contentType))\n            {\n                urlParams += getJsonParams(request);\n            }\n            String formParams = getFormParams(request);\n            if (StringUtils.isNotBlank(formParams))\n            {\n                urlParams += getFormParams(request);\n            }\n        }\n        else\n        {\n            urlParams = getUrlParams(request);\n        }\n        return urlParams;\n    }\n\n    /**\n     * [简要描述]:获取表单参数<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 18:59\n     **/\n    private static String getFormParams(HttpServletRequest request)\n    {\n        StringBuilder sb = new StringBuilder();\n        Enumeration<String> parameterNames = request.getParameterNames();\n        while (parameterNames.hasMoreElements())\n        {\n            String pName = parameterNames.nextElement();\n            String pValue = request.getParameter(pName);\n            sb.append(pName);\n            sb.append(pValue);\n        }\n        return sb.toString();\n    }\n\n    /**\n     * [简要描述]:获取JSON消息体参数<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 19:00\n     **/\n    public static String getJsonParams(final HttpServletRequest request) throws IOException\n    {\n        BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));\n        String str = \"\";\n        StringBuilder jsonSb = new StringBuilder();\n        //一行一行的读取body体里面的内容；\n        while ((str = reader.readLine()) != null)\n        {\n            jsonSb.append(str);\n        }\n        return JSONObject.parseObject(jsonSb.toString()).toJSONString();\n    }\n\n    /**\n     * [简要描述]:获取url参数<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 19:00\n     **/\n    public static String getUrlParams(HttpServletRequest request)\n    {\n        String characterEncoding = request.getCharacterEncoding();\n        if (StringUtils.isBlank(characterEncoding))\n        {\n            characterEncoding = SignConstants.UTF_8;\n        }\n        String param = \"\";\n        try\n        {\n            param = URLDecoder.decode(request.getQueryString(), characterEncoding);\n        }\n        catch (UnsupportedEncodingException e)\n        {\n            log.error(\"不支持的编码格式!\");\n        }\n        StringBuilder urlParams = new StringBuilder();\n        String[] params = param.split(\"&\");\n        for (String s : params)\n        {\n            int index = s.indexOf(\"=\");\n            urlParams.append(s.substring(0, index));\n            urlParams.append(s.substring(index + 1));\n        }\n        return urlParams.toString();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/sign/util/SignUtil.java",
    "content": "package com.xiao.springcloud.demo.common.sign.util;\n\nimport com.alibaba.fastjson.JSONException;\nimport com.alibaba.fastjson.JSONObject;\nimport org.apache.commons.codec.binary.Base64;\nimport org.apache.commons.collections.MapUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.security.InvalidKeyException;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]: 签名工具\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/2/21 11:04\n * @since JDK 1.8\n */\npublic class SignUtil\n{\n    private static final Logger logger = LoggerFactory.getLogger(SignUtil.class);\n\n    /**\n     * HmacSHA1\n     */\n    private static final String HMAC_SHA1 = \"HmacSHA1\";\n\n    /**\n     * [简要描述]:键值对参数生产签名串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param kvParams : 兼职对参数\n     * @param key :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/24 - 18:48\n     **/\n    public static String generateSign(Map<String, String> kvParams, String key)\n    {\n        if (MapUtils.isNotEmpty(kvParams) && StringUtils.isNotBlank(key))\n        {\n            StringBuilder paramSb = new StringBuilder();\n            kvParams.forEach((k, v) -> paramSb.append(k + v));\n            return generateSign(paramSb.toString(), key);\n        }\n        return \"\";\n    }\n\n    /**\n     * [简要描述]:JSON和键值对参数合并<br/>\n     * [详细描述]:<br/>\n     *\n     * @param kvParams :\n     * @param jsonParams :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/24 - 18:50\n     **/\n    public static String generateSign(Map<String, String> kvParams, String jsonParams, String key)\n    {\n        if (StringUtils.isNotBlank(key))\n        {\n            StringBuilder paramSb = new StringBuilder();\n            if (MapUtils.isNotEmpty(kvParams))\n            {\n                kvParams.forEach((k, v) -> paramSb.append(k + v));\n            }\n            if (StringUtils.isNotBlank(jsonParams))\n            {\n                try\n                {\n                    final JSONObject jsonObject = JSONObject.parseObject(jsonParams);\n                    paramSb.append(jsonObject.toJSONString());\n                }\n                catch (JSONException e)\n                {\n                    logger.error(\"生成签名串的JSON请求参数错误，不能转成JSON格式!\", e);\n                }\n            }\n            return generateSign(paramSb.toString(), key);\n        }\n\n        return \"\";\n    }\n\n    /**\n     * [简要描述]:json参数处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param jsonParams :\n     * @param key :\n     * @return java.lang.String\n     * xiaolinlin  2020/2/24 - 18:50\n     **/\n    public static String generateSignByJson(String jsonParams, String key)\n    {\n        if (StringUtils.isNotBlank(jsonParams))\n        {\n\n            try\n            {\n                final JSONObject jsonObject = JSONObject.parseObject(jsonParams);\n                return generateSign(jsonObject.toJSONString(), key);\n            }\n            catch (JSONException e)\n            {\n                logger.error(\"生成签名串的JSON请求参数错误，不能转成JSON格式!\", e);\n            }\n        }\n        return \"\";\n    }\n\n    /**\n     * [简要描述]:生成签名串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param content : 原始内容\n     * @param key : 签名key\n     * @return java.lang.String\n     * xiaolinlin  2020/2/21 - 11:05\n     **/\n    public static String generateSign(String content, String key)\n    {\n        if (StringUtils.isBlank(content) || StringUtils.isBlank(key))\n        {\n            return \"\";\n        }\n        final String sort = AsciiSortUtil.sort(content);\n        return hmacEncode(sort, key);\n    }\n\n    /**\n     * [简要描述]:hmac加密算法<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plainText 明文\n     * @param key 密钥\n     * @return 加密后的密文为 apache base64字符串\n     */\n    private static String hmacEncode(String plainText, String key)\n    {\n        Charset charset = StandardCharsets.UTF_8;\n        Mac mac;\n        String sign = \"\";\n        try\n        {\n            mac = Mac.getInstance(HMAC_SHA1);\n            mac.init(new SecretKeySpec(key.getBytes(charset), HMAC_SHA1));\n            byte[] bytes = mac.doFinal(plainText.getBytes(charset));\n            sign = new String(Base64.encodeBase64(bytes), charset);\n        }\n        catch (NoSuchAlgorithmException | InvalidKeyException e)\n        {\n            logger.error(\"macSignature error\");\n        }\n\n        return sign;\n    }\n\n    public static void main(String[] args)\n    {\n        String json = \"{\\t\\\"storeNo\\\":\\\"1001\\\",\\t\\\"productDtoList\\\":[\\t{\\t\\\"id\\\":\\\"12\\\",\\t\\\"stock\\\":12,\\t\\\"shopCode\\\":\\\"J001\\\",\\t\\\"productCode\\\":\\\"\\\"\\t},\\t{\\t\\\"id\\\":\\\"12\\\",\\t\\\"shopCode\\\":\\\"J001\\\",\\t\\\"productCode\\\":\\\"\\\"\\t}\\t]}\";\n        Map<String, String> kvParmas = new HashMap<>();\n        kvParmas.put(\"productName\", \"test11111\");\n        String key = \"abcdefg111\";\n        System.out.println(generateSign(kvParmas, key));\n        System.out.println(generateSign(kvParmas, json, key));\n        System.out.println(generateSignByJson(json, key));\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/CodeFormatConstants.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :CodeForamtConstants.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年2月21日\n */\n\npackage com.xiao.springcloud.demo.common.util;\n\n/**\n * [简要描述]:常用编码格式常量池<br/>\n * [详细描述]:常用编码格式常量池<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年2月21日\n * @since smile V100R001C00\n */\npublic interface CodeFormatConstants\n{\n    /**\n     * GBK编码方式\n     */\n    String CODE_FORMAT_GBK = \"GBK\";\n\n    /**\n     * UTF_8编码方式\n     */\n    String CODE_FORMAT_UTF_8 = \"UTF-8\";\n\n    /**\n     * ISO8859-1编码方式\n     */\n    String CODE_FORMAT_ISO = \"ISO8859-1\";\n\n    /**\n     * GBK2312编码方式\n     */\n    String CODE_FORMAT_GBK2312 = \"GBK2312\";\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/DateUtils.java",
    "content": "package com.xiao.springcloud.demo.common.util;\n\nimport java.util.Calendar;\nimport java.util.Date;\n\n/**\n * [简要描述]: 日期工具类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/6 16:52\n * @since JDK 1.8\n */\npublic class DateUtils\n{\n    /**\n     * [简要描述]:获取下一天的0点时间·<br/>\n     * [详细描述]:<br/>\n     *\n     * @return long\n     * llxiao  2019/11/5 - 23:46\n     **/\n    public static Date getNextDay()\n    {\n        Calendar calendar = Calendar.getInstance();\n        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar\n                .get(Calendar.DAY_OF_MONTH), 0, 0, 0);\n        calendar.add(Calendar.DAY_OF_MONTH, 1);\n        return calendar.getTime();\n    }\n\n    /**\n     * [简要描述]:获取当天最后的时间：23:59:59<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.util.Date\n     * llxiao  2019/11/7 - 19:49\n     **/\n    public static Date getDayEnd()\n    {\n        Calendar calendar = Calendar.getInstance();\n        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar\n                .get(Calendar.DAY_OF_MONTH), 23, 59, 59);\n        return calendar.getTime();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/ListPageUtil.java",
    "content": "package com.xiao.springcloud.demo.common.util;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.CopyOnWriteArrayList;\n\n/**\n * [简要描述]: List 分页工具\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/1/15 09:38\n * @since JDK 1.8\n */\npublic final class ListPageUtil<T>\n{\n    private CopyOnWriteArrayList<T> list;\n    private int pageSize = 0;\n    private int pageCount = 0;\n    private int listSize = 0;\n    private int index = 0;\n\n    /**\n     * [简要描述]:List分页工具初始化<br/>\n     * [详细描述]:<br/>\n     *\n     * @param list : 待分页的数据集\n     * @param pageSize : 每页数\n     * @return xiaolinlin  2020/1/15 - 10:02\n     **/\n    public ListPageUtil(List<T> list, int pageSize)\n    {\n        if (null == list || 0 == list.size())\n        {\n            throw new UnsupportedOperationException(\"List can not null!\");\n        }\n\n        if (0 == pageSize)\n        {\n            throw new UnsupportedOperationException(\"Page size can not 0\");\n        }\n\n        this.list = new CopyOnWriteArrayList<>(list);\n        this.listSize = list.size();\n\n        if (pageSize > listSize)\n        {\n            this.pageSize = listSize;\n        }\n        else\n        {\n            this.pageSize = pageSize;\n        }\n\n        this.pageCount = listSize / pageSize;\n        this.pageCount = listSize % pageSize == 0 ? pageCount : pageCount + 1;\n        this.index = 0;\n    }\n\n    /**\n     * [简要描述]:获取首页<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<T>\n     * xiaolinlin  2020/1/15 - 10:02\n     **/\n    public List<T> getFistPage()\n    {\n        return list.subList(0, pageSize);\n    }\n\n    /**\n     * [简要描述]:获取最后一页<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<T>\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public List<T> getLastPage()\n    {\n        return list.subList((pageCount - 1) * pageSize, listSize);\n    }\n\n    /**\n     * [简要描述]:获取下一页<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<T>\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public List<T> nextPage()\n    {\n        List<T> subList = null;\n        if (index == pageCount - 1)\n        {\n            subList = list.subList(index * pageSize, listSize);\n        }\n        else\n        {\n            subList = list.subList(index * pageSize, (index + 1) * pageSize);\n        }\n        index++;\n        return subList;\n    }\n\n    /**\n     * [简要描述]:是否有下一页<br/>\n     * [详细描述]:<br/>\n     *\n     * @return boolean\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public boolean hasNext()\n    {\n        return index < pageCount;\n    }\n\n    /**\n     * [简要描述]:获取总页数<br/>\n     * [详细描述]:<br/>\n     *\n     * @return int\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public int getPageCount()\n    {\n        return pageCount;\n    }\n\n    /**\n     * [简要描述]:获取每页数<br/>\n     * [详细描述]:<br/>\n     *\n     * @return int\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public int getPageSize()\n    {\n        return pageSize;\n    }\n\n    /**\n     * [简要描述]:获取当前页数<br/>\n     * [详细描述]:<br/>\n     *\n     * @return int\n     * xiaolinlin  2020/1/15 - 10:03\n     **/\n    public int getIndex()\n    {\n        return index + 1;\n    }\n\n    /**\n     * [简要描述]:获取带分页的数据总数<br/>\n     * [详细描述]:<br/>\n     *\n     * @return int\n     * xiaolinlin  2020/1/15 - 10:04\n     **/\n    public int getListSize()\n    {\n        return listSize;\n    }\n\n    public static void main(String[] args)\n    {\n        List<Integer> list = new ArrayList<>();\n        int length = 23;\n        for (int i = 0; i < length; i++)\n        {\n            list.add(i);\n        }\n        int pageSize = 30;\n        System.out.println(list);\n\n        ListPageUtil<Integer> listPageUtil = new ListPageUtil<>(list, pageSize);\n        System.out.println(\"List size: \" + listPageUtil.getListSize());\n        System.out.println(\"Page count: \" + listPageUtil.getPageCount());\n        System.out.println(\"Page size: \" + listPageUtil.getPageSize());\n        System.out.println(\"First page: \" + listPageUtil.getFistPage());\n        System.out.println(\"Last page: \" + listPageUtil.getLastPage());\n        while (listPageUtil.hasNext())\n        {\n            System.out.println(\"Page index: \" + listPageUtil.getIndex());\n            System.out.println(\"Next page: \" + listPageUtil.nextPage());\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/StringLengthUtils.java",
    "content": "package com.xiao.springcloud.demo.common.util;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * [简要描述]: 字符串长度计算\n * [详细描述]:\n *\n * @author xiaolinlin\n * @version 1.0, 2020/1/14 15:50\n * @since JDK 1.8\n */\n@Slf4j\npublic class StringLengthUtils\n{\n    private static final int UNICODE_LENGTH = 3;\n\n    private static final int GBK_LENGTH = 2;\n\n    private static final String GBK = \"GBK\";\n\n    private static final String UTF_8 = \"UTF-8\";\n\n    /**\n     * [简要描述]:获取字符长度<br/>\n     * [详细描述]:<br/>\n     * 1.如果字符串为空null或\"\"返回0<br/>\n     * 2.如果code为空，返回string.length<br/>\n     * 3.如果code编码格式不对，返回string.length<br/>\n     * 4.否则返回 string.getbyte(code).length<br/>\n     *\n     * @param st : 字符串\n     * @param code : 编码格式\n     * @return int\n     * xiaolinlin  2020/1/14 - 15:54\n     **/\n    public static int getLength(String st, String code)\n    {\n        int length = 0;\n        if (StringUtils.isNotBlank(st))\n        {\n            if (StringUtils.isNotBlank(code))\n            {\n                try\n                {\n                    length = st.getBytes(code).length;\n                }\n                catch (UnsupportedEncodingException e)\n                {\n                    log.error(\"编码格式不对：\", e);\n                }\n            }\n\n            if (0 == length)\n            {\n                length = st.length();\n            }\n        }\n        return length;\n    }\n\n    /**\n     * [简要描述]:获取utf-8格式下的长度<br/>\n     * [详细描述]:<br/>\n     *\n     * @param st :\n     * @return int\n     * xiaolinlin  2020/1/14 - 15:59\n     **/\n    public static int getLengthByUtf(String st)\n    {\n        return getLength(st, UTF_8);\n    }\n\n    /**\n     * [简要描述]:获取gbk编码格式下的长度<br/>\n     * [详细描述]:<br/>\n     *\n     * @param str :\n     * @return int\n     * xiaolinlin  2020/1/14 - 15:59\n     **/\n    public static int getLengthByGbk(String str)\n    {\n        return getLength(str, GBK);\n    }\n\n    /**\n     * [简要描述]:utf8截取指定长度字符串<br/>\n     * [详细描述]:<br/>\n     * 1. str为null或\"\",返回\"\" <br/>\n     * 2. length==0,返回str <br/>\n     * 3. length > str.getBytes(UTF-8).length,返回str <br/>\n     * 4. 正常截取 <br/>\n     *\n     * @param str : 带截取的字符串\n     * @param length : 截取长度\n     * @return java.lang.String\n     * xiaolinlin  2020/1/14 - 16:38\n     **/\n    public static String subByUtf8(String str, int length)\n    {\n        if (StringUtils.isBlank(str))\n        {\n            return \"\";\n        }\n\n        if (0 == length)\n        {\n            return str;\n        }\n\n        String subStr = \"\";\n        try\n        {\n            byte[] buf = str.getBytes(UTF_8);\n            if (length > buf.length)\n            {\n                return str;\n            }\n\n            int count = 0;\n            int i = 0;\n            for (i = length - 1; i >= 0; i--)\n            {\n                if (buf[i] < 0)\n                {\n                    count++;\n                }\n\n            }\n            //因為UTF-8三個字節表示一個漢字\n            if (count % UNICODE_LENGTH == 0)\n            {\n                subStr = new String(buf, 0, length, UTF_8);\n            }\n            else if (count % UNICODE_LENGTH == 1)\n            {\n                subStr = new String(buf, 0, length - 1, UTF_8);\n            }\n            else if (count % UNICODE_LENGTH == GBK_LENGTH)\n            {\n                subStr = new String(buf, 0, length - 2, UTF_8);\n            }\n        }\n        catch (UnsupportedEncodingException e)\n        {\n            log.error(\"UTF-8截取字符串长度失败，不支持的编码格式!\");\n        }\n        return subStr;\n    }\n\n    /**\n     * [简要描述]:utf8截取指定长度字符串<br/>\n     * [详细描述]:<br/>\n     * 1. str为null或\"\",返回\"\" <br/>\n     * 2. length==0,返回str <br/>\n     * 3. length > str.getBytes(GBK).length,返回str <br/>\n     * 4. 正常截取 <br/>\n     *\n     * @param str : 带截取的字符串\n     * @param length : 截取长度\n     * @return java.lang.String\n     * xiaolinlin  2020/1/14 - 16:38\n     **/\n    public static String subByGbk(String str, int length)\n    {\n        if (StringUtils.isBlank(str))\n        {\n            return \"\";\n        }\n\n        if (0 == length)\n        {\n            return str;\n        }\n\n        String subStr = \"\";\n        try\n        {\n            byte[] buf = str.getBytes(GBK);\n\n            if (length > buf.length)\n            {\n                return str;\n            }\n\n            int count = 0;\n            int i = 0;\n            for (i = length - 1; i >= 0; i--)\n            {\n                if (buf[i] < 0)\n                {\n                    count++;\n                }\n                else\n                {\n                    break;\n                }\n            }\n            //因為GBK用兩個字節表示一個漢字\n            if (count % GBK_LENGTH == 0)\n            {\n                subStr = new String(buf, 0, length, GBK);\n            }\n            else\n            {\n                subStr = new String(buf, 0, length - 1, GBK);\n            }\n        }\n        catch (UnsupportedEncodingException e)\n        {\n            log.error(\"不支持的编码格式!\");\n        }\n        return subStr;\n    }\n\n    public static void main(String[] args) throws Exception\n    {\n        String str = \"新春礼盒（新生礼盒）2 459x394x60mm 组合套装\";\n\n        String gbkStr = subByGbk(str, 40);\n        System.out.println(gbkStr);\n\n        String utfStr = subByUtf8(str, 40);\n        System.out.println(utfStr);\n\n        System.out.println(StringLengthUtils.getLengthByGbk(gbkStr));\n        System.out.println(StringLengthUtils.getLengthByUtf(utfStr));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/AESEncryption.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :AESEncryption.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年3月13日\n */\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.codec.DecoderException;\nimport org.apache.commons.codec.binary.Hex;\n\nimport javax.crypto.Cipher;\nimport javax.crypto.KeyGenerator;\nimport javax.crypto.NoSuchPaddingException;\nimport javax.crypto.SecretKey;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.security.NoSuchAlgorithmException;\n\n/**\n * [简要描述]:AES加解密类<br/>\n * [详细描述]:美国软件出口限制，JDK默认使用的AES算法最高只能支持128位。如需要更高的支持需要从oracle官网下载更换JAVA_HOME/jre/lib/\n * security目录下的： local_policy.jar和US_export_policy.jar。<br/>\n * 采用补码方式以及base64双重加密，依赖commons-codec-1.x.jar包中的base64加密<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年3月13日\n * @since smile V100R001C00\n */\n@Slf4j\npublic class AESEncryption\n{\n\n    /**\n     * 加密器\n     */\n    private static Cipher cipher;\n\n    /**\n     * 初始化向量\n     */\n    private static IvParameterSpec iv;\n\n    static\n    {\n        try\n        {\n            byte[] vi = Hex.decodeHex(\"12345678123456781234567812345678\".toCharArray());\n            iv = new IvParameterSpec(vi);\n            // \"算法/模式/补码方式\"\n            cipher = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            log.error(\"NoSuchAlgorithmException\");\n        }\n        catch (NoSuchPaddingException e)\n        {\n            log.error(\"NoSuchPaddingException\");\n        }\n        catch (DecoderException e)\n        {\n            log.error(\"DecoderException\");\n        }\n    }\n\n    /**\n     * 生成密钥\n     *\n     * @param type AES长度\n     * @return 密钥\n     */\n    public static String createAESKey(AESType type)\n    {\n        try\n        {\n            KeyGenerator key = KeyGenerator.getInstance(\"AES\");\n            key.init(type.value);\n            SecretKey ckey = key.generateKey();\n            byte[] keyByte = ckey.getEncoded();\n            return ByteUtils.parseByte2HexStr(keyByte);\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            log.error(\"Create aes Key error!\");\n        }\n        return \"\";\n    }\n\n    /**\n     * AES加密\n     *\n     * @param key 密钥\n     * @param plaintext 明文\n     * @return 秘文\n     */\n    public static String encryptAES(String key, String plaintext)\n    {\n        String ciphertext = \"\";\n        try\n        {\n            byte[] keyByte = ByteUtils.parseHexStr2Byte(key);\n            SecretKeySpec skeySpec = new SecretKeySpec(keyByte, \"AES\");\n            // 使用CBC模式，需要一个向量iv，可增加加密算法的强度\n            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);\n            byte[] pbyte = plaintext.getBytes(\"utf-8\");\n            byte[] result = cipher.doFinal(pbyte);\n            ciphertext = ByteUtils.parseByte2HexStr(result);\n        }\n        catch (Exception e)\n        {\n            log.error(\"Aes encrypt error\", e);\n        }\n        return ciphertext;\n    }\n\n    /**\n     * AES解密\n     *\n     * @param key 密钥\n     * @param ciphertext 秘文\n     * @return 明文\n     */\n    public static String decryptAES(String key, String ciphertext)\n    {\n        String plaintext = \"\";\n        try\n        {\n            byte[] keyByte = ByteUtils.parseHexStr2Byte(key);\n            byte[] cbyte = ByteUtils.parseHexStr2Byte(ciphertext);\n            SecretKeySpec skeySpec = new SecretKeySpec(keyByte, \"AES\");\n            // 使用CBC模式，需要一个向量iv，可增加加密算法的强度\n            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);\n            byte[] pbyte = cipher.doFinal(cbyte);\n            plaintext = new String(pbyte, \"utf-8\");\n        }\n        catch (Exception e)\n        {\n            log.error(\"AES decrypt error!\", e);\n        }\n        return plaintext;\n    }\n\n    public static void main(String[] args)\n    {\n        String key = AESEncryption.createAESKey(AESType.AES_128);\n        System.out.println(key);\n        String ciphertext = AESEncryption.encryptAES(key, \"Basisuser123\");\n        System.out.println(ciphertext);\n        System.out.println(AESEncryption.decryptAES(key, ciphertext));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/AESType.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :AESType.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年3月13日\n */\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\n/**\n * [简要描述]:AES加密类型枚举<br/>\n * [详细描述]:<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年3月13日\n * @since smile V100R001C00\n */\npublic enum AESType\n{\n    AES_128(128),\n    AES_192(192),\n    AES_256(256);\n\n    /**\n     * 初始化值\n     */\n    public int value;\n\n    AESType(int value)\n    {\n        this.value = value;\n    }\n\n    public int getValue()\n    {\n        return value;\n    }\n\n    public void setValue(int value)\n    {\n        this.value = value;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/BinaryHelper.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :BinaryHelper.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年2月20日\n*/\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\nimport org.apache.commons.codec.binary.Base64;\n\n/**\n * [简要描述]:二进制转换工具类<br/>\n * [详细描述]:二进制转16进制字符串、二进制转apache的base64字符串，字符串转二进制<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年2月20日\n * @since smile V100R001C00\n */\npublic class BinaryHelper\n{\n    /**\n     * [简要描述]:二进制转字符串<br/>\n     * [详细描述]:二进制转字符串<br/>\n     * \n     * @author xiaolinlin\n     * @param array 二进制数组\n     * @return 字符串\n     */\n    public static String array2Str(byte[] array)\n    {\n        if (null == array)\n        {\n            return \"\";\n        }\n        StringBuffer sb = new StringBuffer(32);\n        for (int i = 0; i < array.length; i++)\n        {\n            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1, 3));\n        }\n        return sb.toString();\n    }\n\n    /**\n     * [简要描述]:二进制转base64字符串<br/>\n     * [详细描述]:二进制转base64字符串<br/>\n     * \n     * @author xiaolinlin\n     * @param array 二进制数组\n     * @return base64字符串\n     */\n    public static String array2Base64Str(byte[] array)\n    {\n        return Base64.encodeBase64String(array);\n    }\n\n    /**\n     * [简要描述]:符合apache commons 格式的base64字符串转数组<br/>\n     * [详细描述]:<br/>\n     * \n     * @author xiaolinlin\n     * @param base64Str 符合apache commons 格式的base64字符串\n     * @return 二进制数组\n     */\n    public static byte[] base642Array(String base64Str)\n    {\n        return Base64.decodeBase64(base64Str);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/ByteUtils.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :ByteUtils.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年6月9日\n */\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\n/**\n * [简要描述]:<br/>\n * [详细描述]:<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年6月9日\n * @since smile V100R001C00\n */\npublic class ByteUtils\n{\n    /**\n     * 将16进制转换为二进制\n     *\n     * @param hexStr\n     * @return\n     */\n    public static byte[] parseHexStr2Byte(String hexStr)\n    {\n        if (hexStr.length() < 1)\n        {\n            return null;\n        }\n        byte[] result = new byte[hexStr.length() / 2];\n        for (int i = 0; i < hexStr.length() / 2; i++)\n        {\n            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);\n            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);\n            result[i] = (byte) (high * 16 + low);\n        }\n        return result;\n    }\n\n    /**\n     * 将二进制转换成16进制\n     *\n     * @param buf\n     * @return\n     */\n    public static String parseByte2HexStr(byte buf[])\n    {\n        StringBuffer sb = new StringBuffer();\n        for (int i = 0; i < buf.length; i++)\n        {\n            String hex = Integer.toHexString(buf[i] & 0xFF);\n            if (hex.length() == 1)\n            {\n                hex = '0' + hex;\n            }\n            sb.append(hex.toUpperCase());\n        }\n        return sb.toString();\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/HMACUtil.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :HMACUtil.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年4月20日\n */\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\nimport com.xiao.springcloud.demo.common.util.CodeFormatConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.codec.binary.Base64;\n\nimport javax.crypto.Mac;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.io.UnsupportedEncodingException;\nimport java.security.InvalidKeyException;\nimport java.security.NoSuchAlgorithmException;\n\n/**\n * [简要描述]:hamc加密算法<br/>\n * [详细描述]:<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年4月20日\n * @since smile V100R001C00\n */\n@Slf4j\npublic class HMACUtil\n{\n\n    /**\n     * HmacSHA1\n     */\n    private static final String HMAC_SHA1 = \"HmacSHA1\";\n\n    /**\n     * HmacSHA256\n     */\n    private static final String HMAC_SHA256 = \"HmacSHA256\";\n\n    /**\n     * [简要描述]:hmacSHA1加密算法，加密后的密文为 apache base64字符串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plainText 明文\n     * @param key 密钥\n     * @return 密文\n     */\n    public static String hmacSHA1Encode(String plainText, String key)\n    {\n        return hmacEncode(plainText, key, HMAC_SHA1);\n    }\n\n    /**\n     * [简要描述]:hmacSHA1加密算法，加密后的密文为 apache base64字符串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plainText 明文\n     * @param key 密钥\n     * @return 密文\n     */\n    public static String hmacSHA256Encode(String plainText, String key)\n    {\n        return hmacEncode(plainText, key, HMAC_SHA256);\n    }\n\n    /**\n     * [简要描述]:hmac加密算法<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plainText 明文\n     * @param key 密钥\n     * @param shaByte 加密算法，如HmacSHA1、HmacSHA256\n     * @return 加密后的密文为 apache base64字符串\n     */\n    private static String hmacEncode(String plainText, String key, String shaByte)\n    {\n        String ciphertext = \"\";\n        try\n        {\n            SecretKeySpec signingKey = new SecretKeySpec(key\n                    .getBytes(CodeFormatConstants.CODE_FORMAT_UTF_8), HMAC_SHA1);\n            Mac mac = Mac.getInstance(shaByte);\n            mac.init(signingKey);\n            byte[] rawHmac = mac.doFinal(plainText.getBytes(CodeFormatConstants.CODE_FORMAT_UTF_8));\n            ciphertext = Base64.encodeBase64String(rawHmac);\n        }\n        catch (UnsupportedEncodingException e)\n        {\n            log.error(\"UnsupportedEncodingException\");\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            log.error(\"NoSuchAlgorithmException\");\n        }\n        catch (InvalidKeyException e)\n        {\n            log.error(\"InvalidKeyException\", e);\n        }\n        return ciphertext;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/encode/Md5DigestUtil.java",
    "content": "/*\n * Smile Software Technologies Co., Ltd. Copyright 2015-2017, All rights reserved.\n * 文件名  :Md5DigestUtil.java\n * 创建人  :xiaolinlin\n * 创建时间:2017年2月20日\n */\n\npackage com.xiao.springcloud.demo.common.util.encode;\n\nimport com.xiao.springcloud.demo.common.util.CodeFormatConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.io.UnsupportedEncodingException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n\n/**\n * [简要描述]:md5工具类<br/>\n * [详细描述]:<br/>\n *\n * @author xiaolinlin\n * @version 1.0, 2017年2月20日\n * @since smile V100R001C00\n */\n@Slf4j\npublic class Md5DigestUtil\n{\n\n    /**\n     * MD5摘要算法\n     */\n    private static final String MD5 = \"MD5\";\n\n    /**\n     * [简要描述]:md5加密算法，生成base64字符串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plaintext 明文\n     * @return md5密文\n     */\n    public static String md5Encoding2Base64(String plaintext)\n    {\n        return md5Encoding(plaintext, true);\n    }\n\n    /**\n     * [简要描述]:md5加密算法，生成普通字符串<br/>\n     * [详细描述]:<br/>\n     *\n     * @param plaintext 明文\n     * @return md5密文\n     */\n    public static String md5Encoding(String plaintext)\n    {\n        return md5Encoding(plaintext, false);\n    }\n\n    /**\n     * [简要描述]:MD5摘要生成工具<br/>\n     * [详细描述]:MD5摘要生成工具<br/>\n     *\n     * @param plaintext 明文\n     * @param isBase64 是否生成base64字符串\n     * @return md5密文\n     */\n    public static String md5Encoding(String plaintext, boolean isBase64)\n    {\n        if (StringUtils.isBlank(plaintext))\n        {\n            return \"\";\n        }\n        String ciphertext = \"\";\n        MessageDigest md;\n        try\n        {\n            md = MessageDigest.getInstance(MD5);\n            byte[] array = md.digest(plaintext.getBytes(CodeFormatConstants.CODE_FORMAT_UTF_8));\n            if (isBase64)\n            {\n                ciphertext = BinaryHelper.array2Base64Str(array);\n            }\n            else\n            {\n                ciphertext = BinaryHelper.array2Str(array);\n            }\n        }\n        catch (NoSuchAlgorithmException e)\n        {\n            log.error(\"MD5 encoding error and error msg :NoSuchAlgorithmException!\");\n        }\n        catch (UnsupportedEncodingException e)\n        {\n            log.error(\"MD5 encoding error and error msg :UnsupportedEncodingException!\");\n        }\n        return ciphertext;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/image/ImageDHashUtil.java",
    "content": "package com.xiao.springcloud.demo.common.util.image;\n\nimport javax.imageio.ImageIO;\nimport java.awt.*;\nimport java.awt.image.BufferedImage;\nimport java.io.File;\nimport java.io.IOException;\n\n/**\n * [简要描述]:  差异值哈希算法\n * [详细描述]:\n * 1.图片缩放为9*8大小\n * 2.将图片灰度化\n * 3.差异值计算（每行相邻像素的差值，这样会生成8*8的差值，前一个像素大于后一个像素则为1，否则为0）\n * 4.生成哈希值\n * 5.计算海明距离，越小越相似\n * https://blog.csdn.net/lx83350475/article/details/84189848\n *\n * @author llxiao\n * @version 1.0, 2019/9/29 10:55\n * @since JDK 1.8\n */\npublic class ImageDHashUtil\n{\n    /**\n     * 计算dHash方法\n     *\n     * @param file 文件\n     * @return hash\n     */\n    private static String getDHash(File file)\n    {\n        //读取文件\n        BufferedImage srcImage;\n        try\n        {\n            srcImage = ImageIO.read(file);\n        }\n        catch (IOException e)\n        {\n            e.printStackTrace();\n            return null;\n        }\n\n        //文件转成9*8像素，为算法比较通用的长宽\n        BufferedImage buffImg = new BufferedImage(9, 8, BufferedImage.TYPE_INT_RGB);\n        buffImg.getGraphics().drawImage(srcImage.getScaledInstance(9, 8, Image.SCALE_SMOOTH), 0, 0, null);\n\n        int width = buffImg.getWidth();\n        int height = buffImg.getHeight();\n        int[][] grayPix = new int[width][height];\n        StringBuffer figure = new StringBuffer();\n\n        for (int y = 0; y < height; y++)\n        {\n            for (int x = 0; x < width; x++)\n            {\n                //图片灰度化\n                int rgb = buffImg.getRGB(x, y);\n                int r = rgb >> 16 & 0xff;\n                int g = rgb >> 8 & 0xff;\n                int b = rgb & 0xff;\n                int gray = (r * 30 + g * 59 + b * 11) / 100;\n                grayPix[x][y] = gray;\n\n                //开始计算dHash 总共有9*8像素 每行相对有8个差异值 总共有 8*8=64 个\n                if (x != 0)\n                {\n                    long bit = grayPix[x - 1][y] > grayPix[x][y] ? 1 : 0;\n                    figure.append(bit);\n                }\n            }\n        }\n\n        return figure.toString();\n    }\n\n    /**\n     * 计算海明距离\n     * <p>\n     * 原本用于编码的检错和纠错的一个算法\n     * 现在拿来计算相似度，如果差异值小于一定阈值则相似，一般经验值小于5为同一张图片\n     *\n     * @param str1\n     * @param str2\n     * @return 距离\n     */\n    private static long getHammingDistance(String str1, String str2)\n    {\n        int distance;\n        if (str1 == null || str2 == null || str1.length() != str2.length())\n        {\n            distance = -1;\n        }\n        else\n        {\n            distance = 0;\n            for (int i = 0; i < str1.length(); i++)\n            {\n                if (str1.charAt(i) != str2.charAt(i))\n                {\n                    distance++;\n                }\n            }\n        }\n        return distance;\n    }\n\n    //DHashUtil 参数值为待处理文件夹\n    public static void main(String[] args)\n    {\n        File image0 = new File(\"D:/image/4200014361-000/_m_01.jpg\");\n        File image1 = new File(\"D:/image/4200014361-000/_m_01-1.jpg\");\n        File image2 = new File(\"D:/image/4200014361-000/_m_02.jpg\");\n\n        System.out.println(\"图片1hash值：\" + getDHash(image0));\n        System.out.println(\"图片2hash值：\" + getDHash(image1));\n        System.out.println(\"图片3hash值：\" + getDHash(image2));\n        System.out.println(\"图1-2海明距离为：\" + getHammingDistance(getDHash(image0), getDHash(image1)));\n        System.out.println(\"图2-3海明距离为：\" + getHammingDistance(getDHash(image1), getDHash(image2)));\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/util/image/ImagePHashUtil.java",
    "content": "package com.xiao.springcloud.demo.common.util.image;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport javax.imageio.ImageIO;\nimport java.awt.*;\nimport java.awt.color.ColorSpace;\nimport java.awt.image.BufferedImage;\nimport java.awt.image.ColorConvertOp;\nimport java.io.FileInputStream;\nimport java.io.InputStream;\nimport java.net.URL;\n\n/**\n * [简要描述]: 基于感知哈希算法的pHash图像配准算法\n * [详细描述]:\n * pHash的工作过程如下\n * （1）缩小尺寸：pHash以小图片开始，但图片大于8*8，32*32是最好的。这样做的目的是简化了DCT的计算，而不是减小频率。\n * （2）简化色彩：将图片转化成灰度图像，进一步简化计算量。\n * （3）计算DCT：计算图片的DCT变换，得到32*32的DCT系数矩阵。\n * （4）缩小DCT：虽然DCT的结果是32*32大小的矩阵，但我们只要保留左上角的8*8的矩阵，这部分呈现了图片中的最低频率。\n * （5）计算平均值：如同均值哈希一样，计算DCT的均值。\n * （6）计算hash值：这是最主要的一步，根据8*8的DCT矩阵，设置0或1的64位的hash值，大于等于DCT均值的设为”1”，小于DCT均值的设为“0”。组合在一起，就构成了一个64位的整数，这就是这张图片的指纹。\n * ————————————————\n * 版权声明：本文为CSDN博主「No Silver Bullet」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。\n * 原文链接：https://blog.csdn.net/sunhuaqiang1/article/details/70232679\n *\n * @author llxiao\n * @version 1.0, 2019/9/29 10:58\n * @since JDK 1.8\n */\n@Slf4j\npublic class ImagePHashUtil\n{\n    private int size = 32;\n    private int smallerSize = 8;\n\n    /**\n     * 匹配度阀值，两者图片的海明值低于指定值则说明为同一张图片\n     */\n\n    private int matchThreshold = 5;\n    /**\n     * 是否需要校验图片，默认需要校验\n     */\n    private boolean check = true;\n\n    private ColorConvertOp colorConvert = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);\n\n    public ImagePHashUtil()\n    {\n        initCoefficients();\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param matchThreshold :  匹配度阀值，两者图片的海明值低于指定值则说明为同一张图片\n     * @param check : 是否需要校验图片\n     * @return llxiao  2019/9/29 - 15:18\n     **/\n    public ImagePHashUtil(int matchThreshold, boolean check)\n    {\n        this.matchThreshold = matchThreshold;\n        this.check = check;\n        this.initCoefficients();\n    }\n\n    public static void main(String[] args)\n    {\n        ImagePHashUtil p = new ImagePHashUtil(10, false);\n        String basicPath = \"D:/image/4200014361-000/\";\n        String imagePath1 = basicPath + \"_m_01.jpg\";\n        String imagePath2 = basicPath + \"_m_01-1.jpg\";\n        String imagePath3 = basicPath + \"_m_02.jpg\";\n        System.out.println(\"本地文件对比1：\" + p.matchImage4Path(imagePath1, imagePath2));\n        System.out.println(\"本地文件对比2：\" + p.matchImage4Path(imagePath2, imagePath3));\n\n        String imageUrl1 = \"\";\n        String imageUrl2 = \"\";\n        String imageUrl3 = \"\";\n        System.out.println(\"=====URL图片对比1：\" + p.matchImage4Url(imageUrl1, imageUrl2));\n        System.out.println(\"=====URL图片对比2：\" + p.matchImage4Url(imageUrl3, imageUrl2));\n    }\n\n    /**\n     * 判断网络的两张图片相似度比较\n     *\n     * @param img1Url: 图片1下载地址\n     * @param img2Url：图片2下载地址\n     * @return boolean\n     */\n    public boolean matchImage4Url(String img1Url, String img2Url)\n    {\n        if (StringUtils.isBlank(img1Url) || StringUtils.isBlank(img2Url))\n        {\n            log.error(\"对比的图片路径不能为空!\");\n            return false;\n        }\n        try\n        {\n            return this.matchImage4Stream(new URL(img1Url).openConnection().getInputStream(), new URL(img2Url)\n                    .openConnection().getInputStream());\n        }\n        catch (Exception e)\n        {\n            log.error(\"图片对比出现异常，\", e);\n        }\n        return false;\n    }\n\n    /**\n     * 两张图片相似度比较\n     *\n     * @param img1Path: 图片1地址\n     * @param img2Path：图片2地址\n     * @return boolean\n     */\n    public boolean matchImage4Path(String img1Path, String img2Path)\n    {\n        if (StringUtils.isBlank(img1Path) || StringUtils.isBlank(img2Path))\n        {\n            log.error(\"对比的图片路径不能为空!\");\n            return false;\n        }\n        try\n        {\n            return this.matchImage4Stream(new FileInputStream(img1Path), new FileInputStream(img2Path));\n        }\n        catch (Exception e)\n        {\n            log.error(\"图片对比出现异常，\", e);\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:比较两个图片文件流是否一样<br/>\n     * [详细描述]:<br/>\n     *\n     * @param image1 : 图片1\n     * @param image2 : 图片2\n     * @return boolean\n     * llxiao  2019/9/29 - 14:09\n     **/\n    public boolean matchImage4Stream(InputStream image1, InputStream image2)\n    {\n        if (null == image1 || null == image2)\n        {\n            log.error(\"图片参数不能为空！\");\n            return false;\n        }\n\n        try\n        {\n            if (check)\n            {\n                // 校验图片\n                if (isImage(image1) && isImage(image2))\n                {\n                    return this.distance(this.getHash(image1), this.getHash(image2)) >= matchThreshold;\n                }\n                else\n                {\n                    log.error(\"文件流不是图片类型\");\n                }\n            }\n            else\n            {\n                return this.distance(this.getHash(image1), this.getHash(image2)) >= matchThreshold;\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"图片对比出现位置异常，\", e);\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:判断是否图片<br/>\n     * [详细描述]:<br/>\n     *\n     * @param inputStream :\n     * @return boolean\n     * llxiao  2019/9/29 - 14:19\n     **/\n    private static boolean isImage(InputStream inputStream)\n    {\n        if (inputStream == null)\n        {\n            return false;\n        }\n        Image img;\n        try\n        {\n            img = ImageIO.read(inputStream);\n            return !(img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0);\n        }\n        catch (Exception e)\n        {\n            log.error(\"判断是否图片异常，\", e);\n            return false;\n        }\n    }\n\n    private int distance(String s1, String s2)\n    {\n        int counter = 0;\n        for (int k = 0; k < s1.length(); k++)\n        {\n            if (s1.charAt(k) != s2.charAt(k))\n            {\n                counter++;\n            }\n        }\n        return counter;\n    }\n\n    /**\n     * 计算hash值\n     *\n     * @param is\n     * @return\n     * @exception Exception\n     */\n    private String getHash(InputStream is) throws Exception\n    {\n        BufferedImage img = ImageIO.read(is);\n\n        //1. 缩小尺寸.\n        img = resize(img, size, size);\n\n        //2. 简化色彩\n        img = grayscale(img);\n\n        double[][] vals = new double[size][size];\n\n        for (int x = 0; x < img.getWidth(); x++)\n        {\n            for (int y = 0; y < img.getHeight(); y++)\n            {\n                vals[x][y] = getBlue(img, x, y);\n            }\n        }\n\n        //3. 计算DCT(离散余弦变换)\n        double[][] dctVals = applyDCT(vals);\n\n        //4. 缩小DCT\n\n        // 5. 计算平均值\n\n        double total = 0;\n        for (int x = 0; x < smallerSize; x++)\n        {\n            for (int y = 0; y < smallerSize; y++)\n            {\n                total += dctVals[x][y];\n            }\n        }\n        total -= dctVals[0][0];\n        double avg = total / (double) ((smallerSize * smallerSize) - 1);\n\n        //6. 计算hash值.\n        /*\n        根据8*8的DCT矩阵，设置0或1的64位的hash值，大于等于DCT均值的设为”1”，小于DCT均值的设为“0”。组合在一起，\n        就构成了一个64位的整数，这就是这张图片的指纹\n         */\n        String hash = \"\";\n        for (int x = 0; x < smallerSize; x++)\n        {\n            for (int y = 0; y < smallerSize; y++)\n            {\n                if (x != 0 && y != 0)\n                {\n                    hash += (dctVals[x][y] > avg ? \"1\" : \"0\");\n                }\n            }\n        }\n        return hash;\n    }\n\n    private BufferedImage resize(BufferedImage image, int width, int height)\n    {\n        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);\n        Graphics2D g = resizedImage.createGraphics();\n        g.drawImage(image, 0, 0, width, height, null);\n        g.dispose();\n        return resizedImage;\n    }\n\n    private BufferedImage grayscale(BufferedImage img)\n    {\n        colorConvert.filter(img, img);\n        return img;\n    }\n\n    private static int getBlue(BufferedImage img, int x, int y)\n    {\n        return (img.getRGB(x, y)) & 0xff;\n    }\n\n    // DCT function stolen from http://stackoverflow.com/questions/4240490/problems-with-dct-and-idct-algorithm-in-java\n    private double[] c;\n\n    private void initCoefficients()\n    {\n        c = new double[size];\n        for (int i = 1; i < size; i++)\n        {\n            c[i] = 1;\n        }\n        c[0] = 1 / Math.sqrt(2.0);\n    }\n\n    private double[][] applyDCT(double[][] f)\n    {\n        int N = size;\n        double[][] F = new double[N][N];\n        for (int u = 0; u < N; u++)\n        {\n            for (int v = 0; v < N; v++)\n            {\n                double sum = 0.0;\n                for (int i = 0; i < N; i++)\n                {\n                    for (int j = 0; j < N; j++)\n                    {\n                        sum += Math.cos(((2 * i + 1) / (2.0 * N)) * u * Math.PI) * Math\n                                .cos(((2 * j + 1) / (2.0 * N)) * v * Math.PI) * (f[i][j]);\n                    }\n                }\n                sum *= ((c[u] * c[v]) / 4.0);\n                F[u][v] = sum;\n            }\n        }\n        return F;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/CodePrefix.java",
    "content": "package com.xiao.springcloud.demo.common.validator;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\nimport static java.lang.annotation.ElementType.TYPE;\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]: 从类注解中获取业务编码的开头信息\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/8/31 10:54\n * @since JDK 1.8\n */\n@Retention(RUNTIME)\n@Target(TYPE)\npublic @interface CodePrefix\n{\n    /**\n     * 业务开头编码\n     */\n    int moduleCode() default 0;\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/ParamAspect.java",
    "content": "package com.xiao.springcloud.demo.common.validator;\n\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: 查询校验切面\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/6 15:19\n * @since JDK 1.8\n */\n@Aspect\n@Component\npublic class ParamAspect\n{\n    /**\n     * [简要描述]:定义一个annotation切入点<br/>\n     * [详细描述]:切入点<br/>\n     * llxiao  2018/9/2 - 17:02\n     **/\n    @Pointcut(\"@annotation(com.purcotton.omni.common.annotation.param.aop.Validator)\")\n    public void paramValidator()\n    {\n\n    }\n\n    // around 切面强化\n    @Around(\"paramValidator()\")\n    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable\n    {\n        //获取方法参数\n        Object[] args = joinPoint.getArgs();\n        for (Object arg : args)\n        {\n            ParamValidator.validator(arg);\n        }\n        return joinPoint.proceed(args);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/ParamValidator.java",
    "content": "/*\n * Winner\n * 文件名  :Validator.java\n * 创建人  :llxiao\n * 创建时间:2017年12月27日\n */\n\npackage com.xiao.springcloud.demo.common.validator;\n\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.springcloud.demo.common.exception.CommonExceptionEnum;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.lang.reflect.Field;\n\n/**\n * [简要描述]:参数校验器<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2017年12月27日\n * @since JDK1.8\n */\n@Slf4j\npublic class ParamValidator\n{\n    /**\n     * [简要描述]:校验对象属性<br/>\n     * [详细描述]:对象的属性用ParamVerify注解校验<br/>\n     *\n     * @param object 校验对象\n     */\n    public static void validator(Object object)\n    {\n        if (null == object)\n        {\n            return;\n        }\n\n        final Class<?> objClass = object.getClass();\n        //获取业务编码前缀\n        CodePrefix codePrefix = objClass.getAnnotation(CodePrefix.class);\n        int moduleCode = 0;\n        if (null != codePrefix)\n        {\n            moduleCode = codePrefix.moduleCode();\n        }\n        try\n        {\n            // 获取所有字段 包括private 不包括父类字段\n            Field[] farray = objClass.getDeclaredFields();\n            // 初始化校验注解\n            Class<ParamVerify> verify = ParamVerify.class;\n            String fieldName;\n            ParamVerify paramVerify;\n            String reg;\n            String fValue;\n            for (Field field : farray)\n            {\n                // 获取其中字段\n                fieldName = field.getName();\n                // 判断是否被chkstring注解所标识\n                if (field.isAnnotationPresent(verify))\n                {\n                    // 返回这个类所标识的注解对象\n                    paramVerify = field.getAnnotation(verify);\n\n                    // 可以为空\n                    boolean canBlank = paramVerify.canBlank();\n                    // 设置权限\n                    field.setAccessible(true);\n\n                    // 获取属性值\n                    fValue = String.valueOf(field.get(object));\n                    if (!canBlank)\n                    {\n                        // 必填校验\n                        if (StringUtils.isBlank(fValue))\n                        {\n                            log.info(\"缺少:{}必填参数\", fieldName);\n                            // 如果字段是为空\n                            throw new CommonException(generateCode(moduleCode, CommonException.REQUIRED_PARAM_SUFFIX), String\n                                    .format(\"缺少:%s必填参数\", fieldName));\n                        }\n\n                        int maxLeng = paramVerify.maxLeng();\n                        // 参数最大长度校验\n                        if (0 != maxLeng && fValue.length() > maxLeng)\n                        {\n                            log.info(\"求参数:{}过长\", fieldName);\n                            throw new CommonException(generateCode(moduleCode, CommonException.ILLEGAL_PARAM_SUFFIX), String\n                                    .format(\"参数:%s非法\", fieldName));\n                        }\n\n                        // 正则校验\n                        reg = paramVerify.regex();\n                        if (StringUtils.isNotBlank(reg) && !fValue.matches(reg))\n                        {\n                            log.info(\"请求参数:{}非法\", fieldName);\n                            throw new CommonException(generateCode(moduleCode, CommonException.ILLEGAL_PARAM_SUFFIX), String\n                                    .format(\"参数:%s非法\", fieldName));\n                        }\n                    }\n                }\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"系统内部错误\", e);\n            throw new CommonException(CommonExceptionEnum.SYSTEM_ERROR);\n        }\n    }\n\n    private static int generateCode(int moduleCode, String serviceCode)\n    {\n        String errorCode = moduleCode + serviceCode;\n        return Integer.parseInt(errorCode);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/ParamVerify.java",
    "content": "/*\n * Winner \n * 文件名  :ParamVerify.java\n * 创建人  :llxiao\n * 创建时间:2017年12月27日\n*/\n\npackage com.xiao.springcloud.demo.common.validator;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\nimport static java.lang.annotation.ElementType.FIELD;\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]:参数校验注解<br/>\n * [详细描述]:需要结合@CodePrefix注解来获取业务错误码的开头信息<br/>\n *\n * @author llxiao\n * @version 1.0, 2017年12月27日\n * @since JDK1.8\n */\n@Retention(RUNTIME)\n@Target(FIELD)\npublic @interface ParamVerify\n{\n    /**\n     * 检验的正则表达式\n     */\n    String regex() default \"\";\n\n    /**\n     * 可以为空\n     */\n    boolean canBlank() default true;\n\n    /**\n     * 最大长度校验\n     */\n    int maxLeng() default 0;\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/Validator.java",
    "content": "package com.xiao.springcloud.demo.common.validator;\n\nimport java.lang.annotation.*;\n\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]: 参数校验器注解\n * [详细描述]: 结合ParamValidator注解配合使用，ParamValidator定义到DTO数据的属性中\n *\n * @author llxiao\n * @version 1.0, 2018/9/6 15:12\n * @since JDK 1.8\n */\n@Retention(RUNTIME)// 注解会在class字节码文件中存在，在运行时可以通过反射获取到\n@Inherited//说明子类可以继承父类中的该注解\n@Target(ElementType.METHOD)//方法注解\n@Documented//说明该注解将被包含在javadoc中\npublic @interface Validator\n{\n    String value() default \"\";\n}\n"
  },
  {
    "path": "SpringCloud-Common/src/main/java/com/xiao/springcloud/demo/common/validator/VerifyConstants.java",
    "content": "/*\n * Winner\n * 文件名  :VerifyConstants.java\n * 创建人  :llxiao\n * 创建时间:2017年12月27日\n */\n\npackage com.xiao.springcloud.demo.common.validator;\n\n/**\n * [简要描述]:验证正则表达式<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2017年12月27日\n * @since JDK1.8\n */\npublic interface VerifyConstants\n{\n\n    /**\n     * 电话校验\n     */\n    String TELL_REG = \"^((0|\\\\+)?\\\\d{2})?1[356789]\\\\d{9}|([0\\\\+]\\\\d{2,3}-)?(0\\\\d{2,3}-)(\\\\d{7,8})(-(\\\\d{3,}))?$\";\n\n    /**\n     * 营业时间校验\n     */\n    String BUSINESS_HOURS = \"^((20|21|22|23|[0-1]*\\\\d)\\\\:[0-5][0-9])$\";\n\n    /**\n     * ID校验\n     */\n    String ID_REG = \"^[0-9]*$\";\n\n    /**\n     * 纬度校验<br>\n     * <br>\n     */\n    String LAT_REG = \"^-?((0|[1-8]?[0-9]?)(([.][0-9]{1,8})?)|90(([.][0]{1,8})?))$\";\n\n    /**\n     * 经度校验<br>\n     * <br>\n     */\n    String LON_REG = \"^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,8})?)|180(([.][0]{1,8})?))$\";\n\n    /**\n     * 1位数字\n     */\n    String ONE_NUMBER_REG = \"^\\\\d{1}$\";\n\n    /**\n     * 数字校验\n     */\n    String NUMBER_REG = \"^\\\\d{1,2}$\";\n\n    /**\n     * 中文、英文、数字但不包括下划线等特殊符号。2-64位长度\n     */\n    String NAME_REG = \"^[\\\\u4E00-\\\\u9FA5A-Za-z0-9]{2,64}$\";\n\n    /**\n     * 中文、英文、数字但不包括下划线等特殊符号。2-128位长度\n     */\n    String NAME_REG_128 = \"^[\\\\u4E00-\\\\u9FA5A-Za-z0-9]{2,128}$\";\n}\n"
  },
  {
    "path": "SpringCloud-ConfigCenter/Readme.txt",
    "content": "配置中心\r\n\r\n\r\n仓库中的配置文件会被转换成web接口，访问可以参照以下的规则：\r\n\r\n/{application}/{profile}[/{label}]\r\n/{application}-{profile}.yml\r\n/{label}/{application}-{profile}.yml\r\n/{application}-{profile}.properties\r\n/{label}/{application}-{profile}.properties\r\n\r\n\r\n启动后访问：\r\nhttp://localhost:1110/springcloud/dev\r\n\r\n返回结果：\r\n{\"name\":\"springcloud\",\r\n\"profiles\":[\"dev\"],\r\n\"label\":null,\r\n\"version\":\"8b9b92ac572f1ae18d8fa52b5c7d1dc489b6cb18\",\r\n\"state\":null,\r\n\"propertySources\":[\r\n{\"name\":\"https://github.com/Xlinlin/spring-cloud-demo.git/SpringCloud-Configure/consumer/springcloud-dev.properties\",\r\n\"source\":{\"springcloud.configure.test\":\"hello-dev\"}}\r\n]}"
  },
  {
    "path": "SpringCloud-ConfigCenter/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<parent>\r\n\t\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t\t<version>0.0.1-SNAPSHOT</version>\r\n\t</parent>\r\n\t<artifactId>SpringCloud-ConfigCenter</artifactId>\r\n\t<description>配置中心</description>\r\n\r\n\t<dependencies>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\r\n\t\t\t<scope>test</scope>\r\n\t\t</dependency>\r\n\r\n\t\t<!-- spring cloud config -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-config-server</artifactId>\r\n\t\t</dependency>\r\n\t\t<!-- 配置使用JDBC做资源库时加载 -->\r\n\t\t<!-- <dependency> -->\r\n\t\t<!-- <groupId>mysql</groupId> -->\r\n\t\t<!-- <artifactId>mysql-connector-java</artifactId> -->\r\n\t\t<!-- </dependency> -->\r\n\t\t<!-- <dependency> -->\r\n\t\t<!-- <groupId>org.springframework.boot</groupId> -->\r\n\t\t<!-- <artifactId>spring-boot-starter-data-jpa</artifactId> -->\r\n\t\t<!-- </dependency> -->\r\n\t\t<!-- <dependency> -->\r\n\t\t<!-- <groupId>org.springframework.boot</groupId> -->\r\n\t\t<!-- <artifactId>spring-boot-starter-jdbc</artifactId> -->\r\n\t\t<!-- </dependency> -->\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<finalName>${artifactId}</finalName>\r\n\t\t<resources>\r\n\t\t\t<resource>\r\n\t\t\t\t<targetPath>${project.build.directory}/classes</targetPath>\r\n\t\t\t\t<directory>src/main/resources</directory>\r\n\t\t\t\t<filtering>true</filtering>\r\n\t\t\t\t<includes>\r\n\t\t\t\t\t<include>**/*.xml</include>\r\n\t\t\t\t\t<include>**/*.yml</include>\r\n\t\t\t\t\t<include>**/*.properties</include>\r\n\t\t\t\t\t<include>META-INF/**</include>\r\n\t\t\t\t</includes>\r\n\t\t\t</resource>\r\n\t\t</resources>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n</project>"
  },
  {
    "path": "SpringCloud-ConfigCenter/src/main/java/com/xiao/springcloud/configure/ConfigureApplication.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :ConfigureApplication.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年8月9日\r\n*/\r\n\r\npackage com.xiao.springcloud.configure;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.config.server.EnableConfigServer;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年8月9日\r\n * @since JDK 1.8\r\n */\r\n@SpringBootApplication\r\n// 配置中心\r\n@EnableConfigServer\r\npublic class ConfigureApplication\r\n{\r\n\r\n    /**\r\n     * [简要描述]:<br/>\r\n     * [详细描述]:<br/>\r\n     * \r\n     * @author llxiao\r\n     * @param args\r\n     */\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(ConfigureApplication.class, args);\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpringCloud-ConfigCenter/src/main/resources/application.yml",
    "content": "server:\r\n  port: 1110\r\nspring: \r\n    application:\r\n        name: config-server\r\n    #数据库配置\r\n    #datasource: \r\n        #username: root\r\n        #password: admin123\r\n        #url: jdbc:mysql://127.0.0.1:3306/config?useUnicode=true&characterEncoding=UTF-8\r\n        #driver-class-name: com.mysql.jdbc.Driver\r\n    #profiles: \r\n        #配置中心激活从数据库中读取\r\n        #active: jdbc\r\n        #激活本地配置\r\n        #active: native\r\n    #spring cloud config\r\n    cloud: \r\n        config:\r\n            label: master\r\n            server:\r\n                # jdbc mysql实现 \r\n                #jdbc: \r\n                    #sql: SELECT `KEY`, `VALUE` from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?\r\n                #本地文件配置\r\n                #native: \r\n                    #searchLocations: file://d:/config-repo   \r\n                #git 配置\r\n                git:\r\n                    uri: https://github.com/Xlinlin/spring-cloud-demo.git\r\n                    # git仓库地址下的相对地址，可以配置多个，用,分割\r\n                    search-paths: SpringCloud-Configure/consumer,SpringCloud-Configure/euraka-server,SpringCloud-Configure/redisson\r\n                    # 公开的项目可以不需要账号密码\r\n                    #username: uname\r\n                    #password: passwd"
  },
  {
    "path": "SpringCloud-Configure/README.txt",
    "content": "配置中心配置文件放置\r\n可按模块建文件夹放置\r\ndemo中放了consumer的配置和eureka的配置"
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-dev.properties",
    "content": "springcloud.configure.test=hello-dev"
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-dev.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-prod.properties",
    "content": "springcloud.configure.test=hello-prod"
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-prod.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-test.properties",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/consumer/springcloud-test.yml",
    "content": "springcloud.configure.test=hello-test"
  },
  {
    "path": "SpringCloud-Configure/eureka-server/eureka-server-dev.properties",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/eureka-server/eureka-server-dev.yml",
    "content": "eureka:\n    #集群配置\n    #cluster:\n       #node1: localhost:1110\n       #node2: localhost:1109\n       #node3: localhost:1108\n    #单机配置\n    instance:\n        # eureka实例的主机名\n        hostname: center\n        #prefer-ip-address: true\n        #instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    client:\n        #由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己\n        register-with-eureka: false\n        #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false\n        fetch-registry: false\n        serviceUrl:\n            #集群配置 \n            #defaultZone: http://${eureka.cluster.node1}/eureka/,http://${eureka.cluster.node2}/eureka/,http://${eureka.cluster.node3}/eureka/\n            defaultZone: http://localhost:1111/eureka/"
  },
  {
    "path": "SpringCloud-Configure/eureka-server/eureka-server-test.properties",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/eureka-server/eureka-server-test.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Configure/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n  <modelVersion>4.0.0</modelVersion>\r\n  <parent>\r\n    <groupId>com.xiao.skywalking.demo</groupId>\r\n    <artifactId>SpringCloud-Demo</artifactId>\r\n    <version>0.0.1-SNAPSHOT</version>\r\n  </parent>\r\n  <artifactId>SpringCloud-Configure</artifactId>\r\n  <packaging>pom</packaging>\r\n</project>"
  },
  {
    "path": "SpringCloud-Configure/redisson/redission-dev.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n#  传输模式 默认NIO\n# 可选参数：\n# TransportMode.NIO,\n# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# 单节点模式\nsingleServerConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  reconnectionTimeout: 3000\n  failedAttempts: 3\n  subscriptionsPerConnection: 5\n  subscriptionConnectionMinimumIdleSize: 1\n  subscriptionConnectionPoolSize: 50\n  connectionMinimumIdleSize: 32\n  connectionPoolSize: 64\n  database: 0\n  address: redis://localhost:6379\n  dnsMonitoringInterval: 5000"
  },
  {
    "path": "SpringCloud-Configure/redisson/redission-sentinel-dev.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n# 传输模式 默认NIO\n# 可选参数：\n# TransportMode.NIO,\n# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# sentinel模式\nsentinelServersConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  subscriptionsPerConnection: 5\n  clientName: null\n  subscriptionConnectionMinimumIdleSize: 1\n  subscriptionConnectionPoolSize: 50\n  slaveConnectionMinimumIdleSize: 32\n  slaveConnectionPoolSize: 64\n  masterConnectionMinimumIdleSize: 32\n  masterConnectionPoolSize: 64\n  readMode: \"SLAVE\"\n  subscriptionMode: \"SLAVE\"\n  sentinelAddresses:\n  - \"redis://localhost:26379\"\n  masterName: \"mymaster\"\n  database: 0"
  },
  {
    "path": "SpringCloud-Configure/redisson/redisson-cloud.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n# 传输模式 默认NIO\n# 可选参数：\n#TransportMode.NIO,\n#TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n#TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# 云托管模式-支持：Azure Redis、Alibaba Reidis、AWS Redis\nreplicatedServersConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  reconnectionTimeout: 3000\n  failedAttempts: 3\n  password: null\n  subscriptionsPerConnection: 5\n  clientName: null\n  #loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}\n  slaveSubscriptionConnectionMinimumIdleSize: 1\n  slaveSubscriptionConnectionPoolSize: 50\n  slaveConnectionMinimumIdleSize: 32\n  slaveConnectionPoolSize: 64\n  masterConnectionMinimumIdleSize: 32\n  masterConnectionPoolSize: 64\n  readMode: \"SLAVE\"\n  nodeAddresses:\n  - \"redis://127.0.0.1:2812\"\n  - \"redis://127.0.0.1:2815\"\n  - \"redis://127.0.0.1:2813\"\n  scanInterval: 1000"
  },
  {
    "path": "SpringCloud-Configure/redisson/redisson-cluster-dev.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n# 传输模式 默认NIO\n# 可选参数：\n# TransportMode.NIO,\n# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# 集群模式\nclusterServersConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  reconnectionTimeout: 3000\n  #执行失败最大次数。默认值：3\n  failedAttempts: 3\n  # 单个连接最大订阅数量，默认值5\n  subscriptionsPerConnection: 5\n  clientName: null\n  #负载均衡算法类的选择  3.5.7不支持\n  #默认值： org.redisson.connection.balancer.RoundRobinLoadBalancer\n  #在多Redis服务节点的环境里，可以选用以下几种负载均衡方式选择一个节点：\n  #org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法\n  #org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法\n  #org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法\n  #loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}\n  slaveSubscriptionConnectionMinimumIdleSize: 1\n  slaveSubscriptionConnectionPoolSize: 50\n  slaveConnectionMinimumIdleSize: 32\n  slaveConnectionPoolSize: 64\n  masterConnectionMinimumIdleSize: 32\n  masterConnectionPoolSize: 64\n  #读取操作的负载均衡模式，默认值： SLAVE（只在从服务节点里读取）\n  #可用值为： SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。\n  readMode: \"SLAVE\"\n  #订阅操作的负载均衡模式,默认值：SLAVE（只在从服务节点里订阅）\n  #可用值为： SLAVE - 只在从服务节点里订阅。 MASTER - 只在主服务节点里订阅\n  subscriptionMode: \"SLAVE\"\n  #启用SSL终端识别 默认值：true\n  #sslEnableEndpointIdentification: false\n  nodeAddresses:\n  - \"redis://localhost:7379\"\n  - \"redis://localhost:7380\"\n  - \"redis://localhost:7381\"\n  - \"redis://localhost1:7379\"\n  - \"redis://localhost1:7380\"\n  - \"redis://localhost1:7381\"\n  #集群扫描间隔时间，默认1000ms\n  scanInterval: 1000"
  },
  {
    "path": "SpringCloud-Configure/redisson/redisson-cluster-test.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n# 传输模式 默认NIO\n# 可选参数：\n# TransportMode.NIO,\n# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# 集群模式\nclusterServersConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  reconnectionTimeout: 3000\n  #执行失败最大次数。默认值：3\n  failedAttempts: 3\n  # 单个连接最大订阅数量，默认值5\n  subscriptionsPerConnection: 5\n  clientName: null\n  #负载均衡算法类的选择 3.5.7不支持\n  #默认值： org.redisson.connection.balancer.RoundRobinLoadBalancer\n  #在多Redis服务节点的环境里，可以选用以下几种负载均衡方式选择一个节点：\n  #org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法\n  #org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法\n  #org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法\n  #loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}\n  slaveSubscriptionConnectionMinimumIdleSize: 1\n  slaveSubscriptionConnectionPoolSize: 50\n  slaveConnectionMinimumIdleSize: 32\n  slaveConnectionPoolSize: 64\n  masterConnectionMinimumIdleSize: 32\n  masterConnectionPoolSize: 64\n  #读取操作的负载均衡模式，默认值： SLAVE（只在从服务节点里读取）\n  #可用值为： SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。\n  readMode: \"SLAVE\"\n  #订阅操作的负载均衡模式,默认值：SLAVE（只在从服务节点里订阅）\n  #可用值为： SLAVE - 只在从服务节点里订阅。 MASTER - 只在主服务节点里订阅\n  subscriptionMode: \"SLAVE\"\n  #启用SSL终端识别 默认值：true\n  #sslEnableEndpointIdentification: false\n  nodeAddresses:\n  - \"redis://localhost:7379\"\n  - \"redis://localhost:7380\"\n  - \"redis://localhost:7381\"\n  - \"redis://localhost1:7379\"\n  - \"redis://localhost1:7380\"\n  - \"redis://localhost1:7381\"\n  #集群扫描间隔时间，默认1000ms\n  scanInterval: 1000"
  },
  {
    "path": "SpringCloud-Consumer/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<parent>\r\n\t\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t\t<version>0.0.1-SNAPSHOT</version>\r\n\t</parent>\r\n\t<artifactId>SpringCloud-Consumer</artifactId>\r\n\r\n\t<dependencies>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-eureka</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-feign</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-ribbon</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\r\n\t\t</dependency>\r\n\r\n\t\t<!-- 熔断器hystrix -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-hystrix</artifactId>\r\n\t\t</dependency>\r\n\r\n\t\t<!-- spring 配置中心 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\r\n\t\t</dependency>\r\n\t\t<!-- 可帮助你在应用程序生产环境时监视和管理应用程序 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\r\n\t\t</dependency>\r\n\t\t<!-- 使用Spring Cloud Bus自动刷新 配合rabbitmq使用 -->\r\n\t\t<!-- <dependency> -->\r\n\t\t<!-- <groupId>org.springframework.cloud</groupId> -->\r\n\t\t<!-- <artifactId>spring-cloud-starter-bus-amqp</artifactId> -->\r\n\t\t<!-- </dependency> -->\r\n\r\n\t\t<!-- zipkin服务跟踪 -->\r\n\t\t<!--<dependency>-->\r\n\t\t\t<!--<groupId>org.springframework.cloud</groupId>-->\r\n\t\t\t<!--<artifactId>spring-cloud-starter-zipkin</artifactId>-->\r\n\t\t<!--</dependency>-->\r\n\t\t<!-- zipkin服务 改造 sleuth stream + zipkin  + es + kafka -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-sleuth</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-stream-binder-kafka</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-sleuth-stream</artifactId>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\r\n\t\t\t<scope>test</scope>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.projectlombok</groupId>\r\n\t\t\t<artifactId>lombok</artifactId>\r\n\t\t\t<version>1.16.18</version>\r\n\t\t\t<optional>true</optional>\r\n\t\t</dependency>\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<resources>\r\n\t\t\t<resource>\r\n\t\t\t\t<targetPath>${project.build.directory}/classes</targetPath>\r\n\t\t\t\t<directory>src/main/resources</directory>\r\n\t\t\t\t<filtering>true</filtering>\r\n\t\t\t\t<includes>\r\n\t\t\t\t\t<include>**/*.xml</include>\r\n\t\t\t\t\t<include>**/*.yml</include>\r\n\t\t\t\t\t<include>**/*.properties</include>\r\n\t\t\t\t\t<include>META-INF/**</include>\r\n\t\t\t\t</includes>\r\n\t\t\t</resource>\r\n\t\t</resources>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n\r\n</project>"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/ConsumerApp.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :ConsumerApp.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.consumer;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;\r\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\r\nimport org.springframework.cloud.client.loadbalancer.LoadBalanced;\r\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.web.client.RestTemplate;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@SpringBootApplication\r\n// 自动注册发现\r\n@EnableDiscoveryClient\r\n// fegin客户端\r\n@EnableFeignClients\r\n// 开启熔断功能\r\n@EnableCircuitBreaker\r\npublic class ConsumerApp\r\n{\r\n    /**\r\n     * 实例化RestTemplate使用@LoadBalanced开启负载均衡\r\n     * [简要描述]:<br/>\r\n     * [详细描述]:<br/>\r\n     * \r\n     * @author llxiao\r\n     * @return\r\n     */\r\n    @Bean\r\n    @LoadBalanced\r\n    public RestTemplate resTemplate()\r\n    {\r\n        return new RestTemplate();\r\n    }\r\n\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(ConsumerApp.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/CommonConstants.java",
    "content": "package com.xiao.skywalking.consumer.common;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/1 11:16\n * @since JDK 1.8\n */\npublic interface CommonConstants\n{\n    /**\n     * yyyy-MM-dd\n     */\n    String YYYYMMDD_DATE_FORMAT = \"yyyy-MM-dd\";\n\n    /**\n     * 投放使用\n     */\n    int ACTIVITY_USED = 1;\n    /**\n     * 投放使用\n     */\n    int ACTIVITY_UN_USED = 0;\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/CommonException.java",
    "content": "package com.xiao.skywalking.consumer.common;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/1 11:08\n * @since JDK 1.8\n */\npublic class CommonException extends RuntimeException\n{\n    private Integer code;\n\n    private String errorMessage;\n\n    public CommonException(Integer code, String errorMessage)\n    {\n        super(errorMessage);\n        this.code = code;\n        this.errorMessage = errorMessage;\n    }\n\n    public CommonException(ExceptionEnum exceptionEnum)\n    {\n        super(exceptionEnum.getErrorMsg());\n        this.code = exceptionEnum.getErrorCode();\n        this.errorMessage = exceptionEnum.getErrorMsg();\n    }\n\n    public Integer getCode()\n    {\n        return code;\n    }\n\n    public void setCode(Integer code)\n    {\n        this.code = code;\n    }\n\n    public String getErrorMessage()\n    {\n        return errorMessage;\n    }\n\n    public void setErrorMessage(String errorMessage)\n    {\n        this.errorMessage = errorMessage;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/ExceptionEnum.java",
    "content": "package com.xiao.skywalking.consumer.common;/**\n * [简要描述]:\n * [详细描述]:\n *\n * @since JDK 1.8\n */\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/1 11:10\n * @since JDK 1.8\n */\npublic enum ExceptionEnum\n{\n    /**\n     * 非法参数\n     */\n    INVALID_PARAMETER(6000, \"非法参数\"),\n\n    /**\n     * 当天当前活动用户已经中奖\n     */\n    USER_PRIZE_EXIST(6001, \"当天当前活动用户已经中奖\"),\n\n    /**\n     * 系统未知异常\n     */\n    SYSTEM_ERROR(9999, \"系统异常\");\n    /**\n     * 错误状态码\n     */\n    private int errorCode;\n    /**\n     * 错误消息\n     */\n    private String errorMsg;\n\n    ExceptionEnum(int errorCode, String errorMsg)\n    {\n        this.errorCode = errorCode;\n        this.errorMsg = errorMsg;\n    }\n\n    public int getErrorCode()\n    {\n        return errorCode;\n    }\n\n    public String getErrorMsg()\n    {\n        return errorMsg;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/advice/GlobalExceptionAdvice.java",
    "content": "package com.xiao.skywalking.consumer.common.advice;\n\nimport com.xiao.skywalking.consumer.common.CommonException;\nimport com.xiao.skywalking.consumer.common.ExceptionEnum;\nimport com.xiao.skywalking.consumer.common.response.ErrorResponseData;\nimport com.xiao.skywalking.consumer.common.response.ResponseData;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/2 09:54\n * @since JDK 1.8\n */\n@ControllerAdvice\n@Slf4j\npublic class GlobalExceptionAdvice\n{\n    /**\n     * 拦截未知的运行时异常\n     */\n    @ExceptionHandler(CommonException.class)\n    @ResponseBody\n    public ResponseData serviceException(CommonException e)\n    {\n        log.error(\"服务端业务异常:\", e.getErrorMessage());\n        return new ErrorResponseData(e.getCode(), e.getErrorMessage());\n    }\n\n    /**\n     * 拦截未知的运行时异常\n     */\n    @ExceptionHandler(Exception.class)\n    @ResponseBody\n    public ResponseData notFount(Exception e)\n    {\n        printRequestUrl();\n        log.error(\"请求出现系统异常，异常信息：\", e);\n        return new ErrorResponseData(ExceptionEnum.SYSTEM_ERROR.getErrorCode(), ExceptionEnum.SYSTEM_ERROR\n                .getErrorMsg());\n    }\n\n    /**\n     * 打印请求异常\n     */\n    private void printRequestUrl()\n    {\n        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder\n                .getRequestAttributes();\n        if (null != requestAttributes)\n        {\n            HttpServletRequest request = requestAttributes.getRequest();\n            if (null != request)\n            {\n                log.error(\"客户端IP：{}发起请求URL:{}出现未知异常\", request.getRemoteAddr(), request.getRequestURL());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/advice/UnifiedReturnAdvice.java",
    "content": "package com.xiao.skywalking.consumer.common.advice;\n\nimport com.xiao.skywalking.consumer.common.response.ResponseData;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.MethodParameter;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.server.ServerHttpRequest;\nimport org.springframework.http.server.ServerHttpResponse;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;\n\n/**\n * [简要描述]: 统一结果返回处理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/1 23:40\n * @since JDK 1.8\n */\n@Configuration\n@EnableWebMvc\npublic class UnifiedReturnAdvice\n{\n    @RestControllerAdvice\n    static class CommonResultAdvice implements ResponseBodyAdvice<Object>\n    {\n\n        /**\n         * Whether this component supports the given controller method return type\n         * and the selected {@code HttpMessageConverter} type.\n         *\n         * @param returnType the return type\n         * @param converterType the selected converter type\n         * @return {@code true} if {@link #beforeBodyWrite} should be invoked;\n         * {@code false} otherwise\n         */\n        @Override\n        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType)\n        {\n            return true;\n        }\n\n        /**\n         * Invoked after an {@code HttpMessageConverter} is selected and just before\n         * its write method is invoked.\n         *\n         * @param body the body to be written\n         * @param returnType the return type of the controller method\n         * @param selectedContentType the content type selected through content negotiation\n         * @param selectedConverterType the converter type selected to write to the response\n         * @param request the current request\n         * @param response the current response\n         * @return the body that was passed in or a modified (possibly new) instance\n         */\n        @Override\n        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,\n                Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,\n                ServerHttpResponse response)\n        {\n            if (body instanceof ResponseData)\n            {\n                return body;\n            }\n            // 针对特殊DTO 不处理，比如mybatis的分页类\n            //            if (body instanceof PageInfo)\n            //            {\n            //                return body;\n            //            }\n            return new ResponseData<>(body);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/response/ErrorResponseData.java",
    "content": "package com.xiao.skywalking.consumer.common.response;\n\nimport lombok.NoArgsConstructor;\n\n/**\n * 请求失败的返回\n */\n@NoArgsConstructor\npublic class ErrorResponseData<T> extends ResponseData<T> {\n\n    public ErrorResponseData(String message) {\n        super(false, DEFAULT_ERROR_CODE, message, null);\n    }\n\n    public ErrorResponseData(Integer code, String message) {\n        super(false, code, message, null);\n    }\n\n    public ErrorResponseData(Integer code, String message, T data) {\n        super(false, code, message, data);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/response/ResponseData.java",
    "content": "package com.xiao.skywalking.consumer.common.response;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com.xiao.skywalking.consumer.common.ExceptionEnum;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\n\n/**\n * 返回给前台的通用包装。\n */\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\n@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\npublic class ResponseData<T> implements Serializable\n{\n\n    public static final String DEFAULT_SUCCESS_MESSAGE = \"请求成功\";\n\n    public static final String DEFAULT_ERROR_MESSAGE = \"网络异常\";\n\n    public static final Integer DEFAULT_SUCCESS_CODE = 200;\n\n    public static final Integer DEFAULT_ERROR_CODE = 500;\n\n    private static final long serialVersionUID = 276410732109056930L;\n\n    /**\n     * 请求是否成功\n     */\n    private Boolean success;\n\n    /**\n     * 响应状态码\n     */\n    private Integer code;\n\n    /**\n     * 响应信息\n     */\n    private String message;\n\n    /**\n     * 响应对象\n     */\n    private T data;\n\n    public ResponseData(T data)\n    {\n        this.success = true;\n        this.code = 0;\n        this.data = data;\n    }\n\n    public ResponseData(int code, String message)\n    {\n        this.success = false;\n        this.code = code;\n        this.message = message;\n    }\n\n    public static SuccessResponseData success()\n    {\n        return new SuccessResponseData<>(null);\n    }\n\n    public static SuccessResponseData<Object> success(Object data)\n    {\n        return new SuccessResponseData<>(data);\n    }\n\n    public static SuccessResponseData success(Integer code, String message, Object data)\n    {\n        return new SuccessResponseData<>(code, message, data);\n    }\n\n    public static ErrorResponseData error(String message)\n    {\n        return new ErrorResponseData(message);\n    }\n\n    public static ErrorResponseData error(Integer code, String message)\n    {\n        return new ErrorResponseData(code, message);\n    }\n\n    public static ErrorResponseData error(Integer code, String message, Object object)\n    {\n        return new ErrorResponseData<>(code, message, object);\n    }\n\n    public static ErrorResponseData error(ExceptionEnum exceptionEnum)\n    {\n        return new ErrorResponseData(exceptionEnum.getErrorCode(), exceptionEnum.getErrorMsg());\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/common/response/SuccessResponseData.java",
    "content": "package com.xiao.skywalking.consumer.common.response;\n\nimport lombok.NoArgsConstructor;\n\n/**\n * 请求成功的返回\n */\n@NoArgsConstructor\npublic class SuccessResponseData<T> extends ResponseData<T> {\n\n    public SuccessResponseData(T data) {\n        super(true, DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, data);\n    }\n\n    public SuccessResponseData(Integer code, String message, T data) {\n        super(true, code, message, data);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/controller/FeignContoller.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :FeignContoller.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.consumer.controller;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RestController;\r\n\r\nimport com.xiao.skywalking.consumer.feign.FeignService;\r\nimport com.xiao.skywalking.consumer.ribbon.RibbonService;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@RestController\r\n@RefreshScope\r\npublic class FeignContoller\r\n{\r\n    @Autowired\r\n    FeignService feignService;\r\n\r\n    @Autowired\r\n    RibbonService ribbonService;\r\n\r\n    // @Value(\"${profile}\")\r\n    // private String profile;\r\n\r\n    @RequestMapping(path = \"/feign\")\r\n    public String feign(String hello)\r\n    {\r\n        // return feignService.helloSkywalking(hello) + ' ' + this.profile;\r\n        return feignService.helloSkywalking(hello);\r\n    }\r\n\r\n    @RequestMapping(path = \"/ribbon\")\r\n    public String ribbon(String hello)\r\n    {\r\n        return ribbonService.helloSkywalking(hello);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/feign/FeignService.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :FeignService.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.consumer.feign;\r\n\r\nimport org.springframework.cloud.netflix.feign.FeignClient;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\n\r\nimport com.xiao.skywalking.consumer.feign.impl.FeignServiceImpl;\r\n\r\n/**\r\n * [简要描述]:feign客户端，以及fallback熔断<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@FeignClient(value = \"provider-1112\", fallback = FeignServiceImpl.class)\r\npublic interface FeignService\r\n{\r\n    @RequestMapping(value = \"/skywalking\")\r\n    String helloSkywalking(@RequestParam(value = \"hello\") String hello);\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/feign/impl/FQA",
    "content": "Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'xxx' method 异常问题：\n\n错误原因是这里继承的接口类是一个controller接口，继承时会继承到父类的\n\n@RequestMapping(\"/api\")\nSpringMvc在做mapping映射的时候发现ConsumerFeignService和ConsumerFeignServiceFallBack的mapping重复了，所以抛出异常，如何解决呢？\n\n解决的方法有2个：\n\n一是更改ConsumerFeignServiceFallBack的mapping配置，代码如下：\n@Component\n@RequestMapping(\"fallback/api\")\npublic class ConsumerFeignServiceFallBack implements ConsumerFeignService {\n  @Override\n  public User getUserById(long id) {\n    return new User();\n  }\n \n  @Override\n  public String echo(String name) {\n    return \"echo error: \" + name;\n  }\n}\n二是使用fallbackFactory，代码如下：\n@Component\npublic class ConsumerFeignServiceFallBack implements FallbackFactory<ConsumerFeignService> {\n \n  @Override\n  public ConsumerFeignService create(Throwable cause) {\n    return new ConsumerFeignService() {\n      @Override\n      public User getUserById(long id) {\n        return new User();\n      }\n \n      @Override\n      public String echo(String name) {\n        return \"echo error: \" + name;\n      }\n    };\n  }\n}\n运行后，关闭服务提供者，发现熔断并没有生效，没有像单独使用@HystrixCommand时进入fallback方法，查了很多方式，发现原来是feign的hystix的配置开关没有打开\n\n解决方法，在application.yml中增加配置如下：\nfeign:\n hystrix:\n  enabled: true\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/feign/impl/FeignServiceImpl.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :FeignServiceImpl.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.consumer.feign.impl;\r\n\r\nimport org.springframework.beans.factory.annotation.Value;\r\nimport org.springframework.stereotype.Component;\r\n\r\nimport com.xiao.skywalking.consumer.feign.FeignService;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@Component\r\npublic class FeignServiceImpl implements FeignService\r\n{\r\n\r\n    // @Value(\"${profile}\") jdbc获取\r\n    // git获取变量\r\n    @Value(\"${springcloud.configure.test}\")\r\n    private String test;\r\n\r\n    @Override\r\n    public String helloSkywalking(String hello)\r\n    {\r\n        return \"Service error!\" + test;\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/java/com/xiao/skywalking/consumer/ribbon/RibbonService.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :RibbonService.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.consumer.ribbon;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.beans.factory.annotation.Value;\r\nimport org.springframework.stereotype.Service;\r\nimport org.springframework.web.client.RestTemplate;\r\n\r\nimport com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@Service\r\npublic class RibbonService\r\n{\r\n    @Autowired\r\n    private RestTemplate restTemplate;\r\n\r\n    // @Value(\"${profile}\") jdbc获取\r\n    // git获取变量\r\n    @Value(\"${springcloud.configure.test}\")\r\n    private String test;\r\n\r\n    // HystrixCommand出现异常调用fallback方法\r\n    @HystrixCommand(fallbackMethod = \"fallback\")\r\n    public String helloSkywalking(String hello)\r\n    {\r\n        return this.restTemplate.getForObject(\"http://provider-1112/skywalking?hello=\" + hello, String.class) + test;\r\n    }\r\n\r\n    public String fallback(String hello)\r\n    {\r\n        return \"Service error!\" + hello + \":\" + test;\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Consumer/src/main/resources/application.yml",
    "content": "server: \r\n  port: 1113\r\n#spring:\r\n  #application:\r\n    #name: service-1113\r\n# 开启熔断功能\r\nfeign: \r\n   hystrix: \r\n      enabled: true\r\n### spring 配置\r\nspring:\r\n  ##  zipkin 链路跟踪配置\r\n  sleuth:\r\n    enabled: true\r\n    #采样率，越高会有性能影响\r\n    sampler:\r\n      percentage: 1.0\r\n  cloud:\r\n    ## kafka zk配置 配合zipkin\r\n    stream:\r\n      kafka:\r\n        binder:\r\n          brokers: 192.168.206.203:9092\r\n          zkNodes: 192.168.206.203:2181"
  },
  {
    "path": "SpringCloud-Consumer/src/main/resources/bootstrap.yml",
    "content": "#使用bootsrap.yml,之所以不在application.yml中配置，spring boot会优先加载bootstrap.yml，不然上下文中无法读取到配置\r\nspring: \r\n    application: \r\n        name: consumer-1113\r\n    zipkin: \r\n      base-url: http://localhost:1115\r\n    cloud: \r\n        config: \r\n            profile: dev\r\n            label: master\r\n            # git配置需要\r\n            name: springcloud\r\n            # 配置中心url\r\n            uri: http://localhost:1110\r\n            #无法连接配置中心启动失败\r\n            #fail-fast: true\r\n            #使用服务发现到注册中心找配置中心\r\n            #discovery: \r\n                #使用配置中心的配置\r\n                #enabled: true\r\n                #配置中心服务id\r\n                #serviceId: config-server\r\n    #使用Spring Cloud Bus自动刷新 需要 rabbitmq支持\r\n    #rabbitmq:\r\n        #host: localhost\r\n        #port: 5673\r\n        #username: guest\r\n        #password: guest\r\n#注册中心客户端配置\r\neureka:\r\n  client:\r\n    serviceUrl:\r\n      defaultZone: http://localhost:1111/eureka/\r\n#使用Spring Cloud Bus自动刷新 需要 rabbitmq支持\r\n#endpoints:\r\n  #bus:\r\n    #enabled: true\r\n    #sensitive: false"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/README.MD",
    "content": "**配置中心(SpringCloud配置中心扩展)**\n\n_1._ **使用自定义读取配置源，基于mysql的配置读取实现**。<br>\n\n_2._ **设计简述**：<br>\n 1) 基于IP、应用名称、LABEL、Profile获取配置 <br>\n 1.1) IP主要用于区分不同区域获取不同配置信息 <br>\n 1.2) 应用名称+Label+profile遵循原spring-cloud config的设计 <br>\n \n 2) 表结构设计，参考：configMysql.sql文件 <br>\n 2.1) 维护应用与区域之间的关系，即在获取配置时，依据请求IP查询所属区域对应的配置信息。<br>\n 2.2) 抽象出具体配置项、配置组、应用配置信息。即配置组可挂多个配置项，应用环境配置挂多个配置组，以达到资源共享。<br>\n 2.3) 支持单个服务私有配置<br>\n 2.4) 维护客户端连接信息，提供服务的IP和端口<br>\n \n 3) 整体设计<br>\n 3.1) custom-config-server为服务端，单独部署启动，也可以集成到自己的应用，直接使用``@CustomEnableConfigServer``注解加上spring jdbc的配置即可：\n```\nspring:\n  application:\n    name: config-server\n  #mysql\n  datasource:\n    url: jdbc:mysql://192.168.206.210:3306/config_center?useSSL=false\n    username: admin\n    password: Admin@123\n    driver-class-name: com.mysql.jdbc.Driver\n    # 使用druid数据源\n    type: com.alibaba.druid.pool.DruidDataSource\n```\n 3.2) custom-config-service为Rest服务端，提供配置、应用、区域等维护的API，可单独部署应用也可以集成到web工程中 <br>\n 3.3) custom-config-web 提供前端的页面管理 <br>\n 3.4) custom-config-client 客户端jar包 <br>\n 3.5) custom-starter-config 客户端引用该工程即可 <br>\n 3.6) 客户端查询配置核心时序图，参考：配置中心查询核心时序图.png <br>\n 3.7) 客户端刷新实现简介：<br>\n    A. 改造原springcloud client，在发起restTemplate的时候，将客户端服务的端口上报到配置服务端，并添加refresh刷新的接口，其实际是调用了ContextRefresher.refresh()方法<br>\n    B. 配置服务端保存应用+环境+应用服务的IP：PORT信息到数据库<br>\n    C. 配置管理界面修改应用配置，进行发布配置刷新客户端配置<br>\n    D. 客户端引用starter-config jar包，并在需要刷新的配置类上添加@RefreshScope注解。[custom-config-simple](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Custom-ConfigCenter/custom-config-simple)使用方法<br>\n    E. 服务端发起刷新配置应用，通过应用+环境查找该应用下提供的所有应用服务，调用refresh刷新客户端的配置，如果调用失败标记该服务下线，下一次不进行刷新操作<br>\n    F. springcloud的刷新参考资料：<br>\n        [数据源刷新参考](https://www.jianshu.com/p/5acd4db7cd5e)<br>\n        [Spring Cloud Config 是如何实现热更新的](http://www.scienjus.com/spring-cloud-refresh/)<br>\n        [配置刷新基本流程](https://blog.csdn.net/cml_blog/article/details/78411312)<br>\n 3.8) 引入netty，实现心跳机制监听服务端客户端连接状态。<br>\n      A. 支持自定义netty端口，服务端和客户端自定义填写，配置参数：netty.server.port，默认使用8999<br>\n      B. springboot的 server.port 一定要配置到 bootstrap.yml配置文件中，客户端需要使用到该端口号上报到服务端<br>\n      C. springboot + netty 简单设计实现：<br>\n         心跳维持在线状态<br>\n         初始化连接时，模拟一个登陆操作，以此绑定netty连接端口和服务端所提供的端口，用于断开下线使用<br>\n         客户端失去心跳或异常连接，服务端监听到，标记应用离线<br>\n      D. 新增配置  ``spring.cloud.config.custom`` 参数来标记使用自定义配置中心，主要用于加载netty，使用心跳机制\n      E. netty实现配置刷新方案，netty连接后发起登录请求，上报客户端服务的IP和端口，后台数据库绑定netty和提供服务端口。服务端用一个ConcurrentHashMap存储连接，后台管理发起刷新请求通过netty发给客户端，刷新配置<br>      \n_3._**配置中心高可用方案理论**<br>\n既然使用spring-cloud套件，可结合eureka注册中心来实现高可用。其他详细设计可参考携程开源的apollo的高可用设计\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/README.md",
    "content": "**springcloud config client改造**\n\n1. 在客户端发起rest请求获取配置时，在http header中添加当前提供服务的端口号，参考：<br>\n``com.xiao.custom.config.client.configuration.ConfigServicePropertySourceLocator.getSecureRestTemplate``\n\n2. 新增refresh包，提供refresh API接口，技术关键点：<br>\n``com.xiao.custom.config.client.refresh.component.RefreshBeanConfig``类<br>\n``@ComponentScan``注解，用于扫描提供的api接口bean对象注入到spring容器中<br>\n\n3. ``@Configuration 和 @EnableConfigurationProperties`` 注解，来确定唯一引用位置 resouces/META-INF/spring.factories文件(SPI机制)<br>\n该文件内记录了需要加载的@Configuration注解类：<br>\n    ```$xslt\n    # Auto Configure\n    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\n    com.xiao.custom.config.client.configuration.ConfigClientAutoConfiguration\n    \n    # Bootstrap components\n    org.springframework.cloud.bootstrap.BootstrapConfiguration=\\\n    com.xiao.custom.config.client.configuration.ConfigServiceBootstrapConfiguration,\\\n    com.xiao.custom.config.client.configuration.DiscoveryClientConfigServiceBootstrapConfiguration\n    ```\n4. 引入netty，实现心跳机制监听服务端客户端连接状态。<br>\n       A. 支持自定义netty端口，服务端和客户端自定义填写，配置参数：netty.server.port，默认使用8999<br>\n       B. springboot的 server.port 一定要配置到 bootstrap.yml配置文件中，客户端需要使用到该端口号上报到服务端<br>\n       C. springboot + netty 简单设计实现：<br>\n          心跳维持在线状态<br>\n          初始化连接时，模拟一个登陆操作，以此绑定netty连接端口和服务端所提供的端口，用于断开下线使用<br>\n          客户端失去心跳或异常连接，服务端监听到，标记应用离线<br>\n       D. 新增配置  ``spring.cloud.config.custom`` 参数来标记使用自定义配置中心，主要用于加载netty，使用心跳机制\n       E. netty实现配置刷新方案，netty连接后发起登录请求，上报客户端服务的IP和端口，后台数据库绑定netty和提供服务端口。服务端用一个ConcurrentHashMap存储连接，后台管理发起刷新请求通过netty发给客户端，刷新配置<br>\n       \n       \n**配置中心(SpringCloud配置中心扩展**\n\n_1._ **使用自定义读取配置源，基于mysql的配置读取实现，兼容原声的springcloud config模块**。<br>\n\n_2._ **设计简述**：<br>\n 1) 基于IP、应用名称、LABEL、Profile获取配置 <br>\n 1.1) IP主要用于区分不同区域获取不同配置信息 <br>\n 1.2) 应用名称+Label+profile遵循原spring-cloud config的设计 <br>\n \n 2) 表结构设计，参考：configMysql.sql文件 <br>\n 2.1) 维护应用与区域之间的关系，即在获取配置时，依据请求IP查询所属区域对应的配置信息。<br>\n 2.2) 抽象出具体配置项、配置组、应用配置信息。即配置组可挂多个配置项，应用环境配置挂多个配置组，以达到资源共享。<br>\n 2.3) 支持单个服务私有配置<br>\n 2.4) 维护客户端连接信息，提供服务的IP和端口<br>\n \n 3) 整体设计<br>\n 3.1) 采用SpringCloud实现，Center-Server为服务端，单独部署启动，也可以集成到自己的应用，直接使用``@CustomEnableConfigServer``注解加上spring jdbc的配置即可：\n```\nspring:\n  application:\n    name: winner-config-server\n  #mysql\n  datasource:\n    url: jdbc:mysql://192.168.206.210:3306/config_center?useSSL=false\n    username: admin\n    password: Admin@123\n    driver-class-name: com.mysql.jdbc.Driver\n    # 使用druid数据源\n    type: com.alibaba.druid.pool.DruidDataSource\n```\n 3.2) center-service为Rest服务端，提供配置、应用、区域等维护的API，可单独部署应用也可以集成到web工程中 <br>\n 3.3) center-web 提供前端的页面管理，请求地址：http://localhost:9002 <br>\n 3.4) center-client 客户端jar包 <br>\n 3.5) starter-config 客户端引用该工程即可 <br>\n 3.6) 客户端查询配置核心时序图，参考：配置中心查询核心时序图.png <br>\n 3.7) 客户端刷新实现简介：<br>\n    A. 改造原springcloud client，在发起restTemplate的时候，将客户端服务的端口上报到配置服务端，并添加refresh刷新的接口，其实际是调用了ContextRefresher.refresh()方法<br>\n    B. 配置服务端保存应用+环境+应用服务的IP：PORT信息到数据库<br>\n    C. 配置管理界面修改应用配置，进行发布配置刷新客户端配置<br>\n    D. 客户端引用starter-config jar包，并在需要刷新的配置类上添加@RefreshScope注解。参考config-center-simple使用方法\n    `` <dependency>\n        <groupId>com.winner.config.center</groupId>\n        <artifactId>winner-starter-config</artifactId>\n        <version>1.0-SNAPSHOT</version>\n       </dependency>``<br>\n    E. 服务端发起刷新配置应用，通过应用+环境查找该应用下提供的所有应用服务，调用refresh刷新客户端的配置，如果调用失败标记该服务下线，下一次不进行刷新操作<br>\n    F. springcloud的刷新参考资料：<br>\n        [数据源刷新参考](https://www.jianshu.com/p/5acd4db7cd5e)<br>\n        [Spring Cloud Config 是如何实现热更新的](http://www.scienjus.com/spring-cloud-refresh/)<br>\n        [配置刷新基本流程](https://blog.csdn.net/cml_blog/article/details/78411312)<br>\n 3.8) 引入netty，实现心跳机制监听服务端客户端连接状态。<br>\n    A. 支持自定义netty端口，服务端和客户端自定义填写，配置参数：netty.server.port，默认使用8999<br>\n    B. springboot的 server.port 一定要配置到 bootstrap.yml配置文件中，客户端需要使用到该端口号上报到服务端<br>\n    C. springboot + netty 简单设计实现：<br>\n       心跳维持在线状态<br>\n       初始化连接时，模拟一个登陆操作，以此绑定netty连接端口和服务端所提供的端口，用于断开下线使用<br>\n       客户端失去心跳或异常连接，服务端监听到，标记应用离线<br>\n    D. 新增配置  ``spring.cloud.config.custom`` 参数来标记使用自定义配置中心，主要用于加载netty，使用心跳机制\n    E. netty实现配置刷新方案，netty连接后发起登录请求，上报客户端服务的IP和端口，后台数据库绑定netty和提供服务端口。服务端用一个ConcurrentHashMap存储连接，后台管理发起刷新请求通过netty发给客户端，刷新配置<br>\n    \n_3._**配置中心高可用方案理论**<br>\n既然使用spring-cloud套件，可结合eureka注册中心来实现高可用。其他详细设计可参考携程开源的apollo的高可用设计\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-client</artifactId>\n\n    <properties>\n        <netty.version>4.1.42.Final</netty.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-logging</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-commons</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-context</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.retry</groupId>\n            <artifactId>spring-retry</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <!--protostuff -->\n        <dependency>\n            <groupId>com.dyuproject.protostuff</groupId>\n            <artifactId>protostuff-core</artifactId>\n            <version>1.1.2</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n        <dependency>\n            <groupId>com.dyuproject.protostuff</groupId>\n            <artifactId>protostuff-runtime</artifactId>\n            <version>1.1.2</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n        <dependency>\n            <groupId>org.objenesis</groupId>\n            <artifactId>objenesis</artifactId>\n            <version>2.1</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-all</artifactId>\n            <version>${netty.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.6</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigClientAutoConfiguration.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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 */\npackage com.xiao.custom.config.client.configuration;\n\nimport com.xiao.custom.config.client.netty.client.NettyClient;\nimport org.springframework.beans.factory.BeanFactoryUtils;\nimport org.springframework.boot.actuate.health.HealthIndicator;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.cloud.context.refresh.ContextRefresher;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.env.Environment;\n\n/**\n * Expose a ConfigClientProperties just so that there is a way to inspect the properties\n * bound to it. It won't be available in time for autowiring into the bootstrap context,\n * but the values in this properties object will be the same as the ones used to bind to\n * the config server, if there is one.\n *\n * @author Dave Syer\n * @author Marcos Barbero\n */\n@Configuration\npublic class ConfigClientAutoConfiguration\n{\n    @Bean\n    public ConfigClientProperties configClientProperties(Environment environment, ApplicationContext context)\n    {\n        if (context.getParent() != null && BeanFactoryUtils\n                .beanNamesForTypeIncludingAncestors(context.getParent(), ConfigClientProperties.class).length > 0)\n        {\n            return BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(), ConfigClientProperties.class);\n        }\n        ConfigClientProperties client = new ConfigClientProperties(environment);\n        return client;\n    }\n\n    @Bean\n    public ConfigClientHealthProperties configClientHealthProperties()\n    {\n        return new ConfigClientHealthProperties();\n    }\n\n    @Configuration\n    @ConditionalOnClass(HealthIndicator.class)\n    @ConditionalOnBean(ConfigServicePropertySourceLocator.class)\n    @ConditionalOnProperty(value = \"health.config.enabled\", matchIfMissing = true)\n    protected static class ConfigServerHealthIndicatorConfiguration\n    {\n\n        @Bean\n        public ConfigServerHealthIndicator configServerHealthIndicator(ConfigServicePropertySourceLocator locator,\n                ConfigClientHealthProperties properties, Environment environment)\n        {\n            return new ConfigServerHealthIndicator(locator, environment, properties);\n        }\n    }\n\n    @Configuration\n    @ConditionalOnClass(ContextRefresher.class)\n    @ConditionalOnBean(ContextRefresher.class)\n    @ConditionalOnProperty(value = \"spring.cloud.config.watch.enabled\")\n    protected static class ConfigClientWatchConfiguration\n    {\n        @Bean\n        public ConfigClientWatch configClientWatch(ContextRefresher contextRefresher)\n        {\n            return new ConfigClientWatch(contextRefresher);\n        }\n    }\n\n    @Bean\n    @ConditionalOnProperty(name = \"spring.cloud.config.custom\", havingValue = \"true\")\n    public NettyClient nettyClient()\n    {\n        return new NettyClient();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigClientHealthProperties.java",
    "content": "/*\n * Copyright 2013-2016 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * @author Spencer Gibb\n */\n@ConfigurationProperties(\"health.config\")\npublic class ConfigClientHealthProperties {\n\t/**\n\t * Flag to indicate that the config server health indicator should be installed.\n\t */\n\tboolean enabled;\n\n\t/**\n\t * Time to live for cached result, in milliseconds. Default 300000 (5 min).\n\t */\n\tprivate long timeToLive = 60 * 5 * 1000;\n\n\tpublic boolean isEnabled() {\n\t\treturn this.enabled;\n\t}\n\n\tpublic void setEnabled(boolean enabled) {\n\t\tthis.enabled = enabled;\n\t}\n\n\tpublic long getTimeToLive() {\n\t\treturn timeToLive;\n\t}\n\n\tpublic void setTimeToLive(long timeToLive) {\n\t\tthis.timeToLive = timeToLive;\n\t}\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigClientProperties.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.core.env.Environment;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.util.UriComponentsBuilder;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\n/**\n * @author Dave Syer\n */\n@ConfigurationProperties(ConfigClientProperties.PREFIX)\npublic class ConfigClientProperties\n{\n\n    public static final String PREFIX = \"spring.cloud.config\";\n    public static final String TOKEN_HEADER = \"X-Config-Token\";\n    public static final String STATE_HEADER = \"X-Config-State\";\n\n    /**\n     * 自定义配置中心,默认不使用\n     * true使用，false不适用\n     */\n    private boolean custom = false;\n\n    /**\n     * server port\n     */\n    @Value(\"${server.port:}\")\n    private int serverPort;\n\n    /**\n     * 服务端netty端口号\n     */\n    @Value(\"${netty.server.port:8999}\")\n    private int nettyPort;\n\n    /**\n     * Flag to say that remote configuration is enabled. Default true;\n     */\n    private boolean enabled = true;\n\n    /**\n     * The default profile to use when fetching remote configuration (comma-separated).\n     * Default is \"default\".\n     */\n    private String profile = \"default\";\n\n    /**\n     * Name of application used to fetch remote properties.\n     */\n    @Value(\"${spring.application.name:application}\")\n    private String name;\n\n    /**\n     * The label name to use to pull remote configuration properties. The default is set\n     * on the server (generally \"master\" for a git based server).\n     */\n    private String label;\n\n    /**\n     * The username to use (HTTP Basic) when contacting the remote server.\n     */\n    private String username;\n\n    /**\n     * The password to use (HTTP Basic) when contacting the remote server.\n     */\n    private String password;\n\n    /**\n     * The URI of the remote server (default http://localhost:8888).\n     */\n    private String uri = \"http://localhost:8888\";\n\n    /**\n     * Discovery properties.\n     */\n    private Discovery discovery = new Discovery();\n\n    /**\n     * Flag to indicate that failure to connect to the server is fatal (default false).\n     */\n    private boolean failFast = false;\n\n    /**\n     * Security Token passed thru to underlying environment repository.\n     */\n    private String token;\n\n    /**\n     * Authorization token used by the client to connect to the server.\n     */\n    private String authorization;\n\n    private ConfigClientProperties()\n    {\n    }\n\n    public ConfigClientProperties(Environment environment)\n    {\n        String[] profiles = environment.getActiveProfiles();\n        if (profiles.length == 0)\n        {\n            profiles = environment.getDefaultProfiles();\n        }\n        this.setProfile(StringUtils.arrayToCommaDelimitedString(profiles));\n    }\n\n    public boolean isCustom()\n    {\n        return custom;\n    }\n\n    public void setCustom(boolean custom)\n    {\n        this.custom = custom;\n    }\n\n    public int getNettyPort()\n    {\n        return nettyPort;\n    }\n\n    public void setNettyPort(int nettyPort)\n    {\n        this.nettyPort = nettyPort;\n    }\n\n    public boolean isEnabled()\n    {\n        return this.enabled;\n    }\n\n    public void setEnabled(boolean enabled)\n    {\n        this.enabled = enabled;\n    }\n\n    public String getRawUri()\n    {\n        return extractCredentials().uri;\n    }\n\n    public String getUri()\n    {\n        return this.uri;\n    }\n\n    public void setUri(String url)\n    {\n        this.uri = url;\n    }\n\n    public String getName()\n    {\n        return this.name;\n    }\n\n    public void setName(String name)\n    {\n        this.name = name;\n    }\n\n    public String getProfile()\n    {\n        return this.profile;\n    }\n\n    public void setProfile(String env)\n    {\n        this.profile = env;\n    }\n\n    public String getLabel()\n    {\n        return this.label;\n    }\n\n    public void setLabel(String label)\n    {\n        this.label = label;\n    }\n\n    public String getUsername()\n    {\n        return extractCredentials().username;\n    }\n\n    public void setUsername(String username)\n    {\n        this.username = username;\n    }\n\n    public String getPassword()\n    {\n        return extractCredentials().password;\n    }\n\n    public void setPassword(String password)\n    {\n        this.password = password;\n    }\n\n    public Discovery getDiscovery()\n    {\n        return this.discovery;\n    }\n\n    public void setDiscovery(Discovery discovery)\n    {\n        this.discovery = discovery;\n    }\n\n    public boolean isFailFast()\n    {\n        return this.failFast;\n    }\n\n    public void setFailFast(boolean failFast)\n    {\n        this.failFast = failFast;\n    }\n\n    public String getToken()\n    {\n        return this.token;\n    }\n\n    public void setToken(String token)\n    {\n        this.token = token;\n    }\n\n    public String getAuthorization()\n    {\n        return this.authorization;\n    }\n\n    public void setAuthorization(String authorization)\n    {\n        this.authorization = authorization;\n    }\n\n    public int getServerPort()\n    {\n        return serverPort;\n    }\n\n    public void setServerPort(int serverPort)\n    {\n        this.serverPort = serverPort;\n    }\n\n    private Credentials extractCredentials()\n    {\n        Credentials result = new Credentials();\n        String uri = this.uri;\n        result.uri = uri;\n        Credentials explicitCredentials = getUsernamePassword();\n        result.username = explicitCredentials.username;\n        result.password = explicitCredentials.password;\n        try\n        {\n            URL url = new URL(uri);\n            String userInfo = url.getUserInfo();\n            // no credentials in url, return explicit credentials\n            if (StringUtils.isEmpty(userInfo) || \":\".equals(userInfo))\n            {\n                return result;\n            }\n            String bare = UriComponentsBuilder.fromHttpUrl(uri).userInfo(null).build().toUriString();\n            result.uri = bare;\n            // handle the password only case\n            if (!userInfo.contains(\":\"))\n            {\n                userInfo = userInfo + \":\";\n            }\n            String[] split = userInfo.split(\":\");\n            // set username and password from uri\n            result.username = split[0];\n            result.password = split[1];\n\n            // override password if explicitly set\n            if (explicitCredentials.password != null)\n            {\n                // Explicit username / password takes precedence\n                result.password = explicitCredentials.password;\n            }\n            // override username if explicitly set\n            if (!\"user\".equals(explicitCredentials.username))\n            {\n                // But the username can be overridden\n                result.username = explicitCredentials.username;\n            }\n            return result;\n        }\n        catch (MalformedURLException e)\n        {\n            throw new IllegalStateException(\"Invalid URL: \" + uri);\n        }\n    }\n\n    private Credentials getUsernamePassword()\n    {\n        Credentials credentials = new Credentials();\n\n        if (StringUtils.hasText(this.password))\n        {\n            credentials.password = this.password.trim();\n        }\n\n        if (StringUtils.hasText(this.username))\n        {\n            credentials.username = this.username.trim();\n        }\n        else\n        {\n            credentials.username = \"user\";\n        }\n        return credentials;\n    }\n\n    private static class Credentials\n    {\n        private String username;\n        private String password;\n        private String uri;\n    }\n\n    public static class Discovery\n    {\n        public static final String DEFAULT_CONFIG_SERVER = \"configserver\";\n\n        /**\n         * Flag to indicate that config server discovery is enabled (config server URL will be\n         * looked up via discovery).\n         */\n        private boolean enabled;\n        /**\n         * Service id to locate config server.\n         */\n        private String serviceId = DEFAULT_CONFIG_SERVER;\n\n        public boolean isEnabled()\n        {\n            return this.enabled;\n        }\n\n        public void setEnabled(boolean enabled)\n        {\n            this.enabled = enabled;\n        }\n\n        public String getServiceId()\n        {\n            return this.serviceId;\n        }\n\n        public void setServiceId(String serviceId)\n        {\n            this.serviceId = serviceId;\n        }\n\n    }\n\n    public ConfigClientProperties override(Environment environment)\n    {\n        ConfigClientProperties override = new ConfigClientProperties();\n        BeanUtils.copyProperties(this, override);\n        override.setName(environment.resolvePlaceholders(\n                \"${\" + ConfigClientProperties.PREFIX + \".name:${spring.application.name:application}}\"));\n        if (environment.containsProperty(ConfigClientProperties.PREFIX + \".profile\"))\n        {\n            override.setProfile(environment.getProperty(ConfigClientProperties.PREFIX + \".profile\"));\n        }\n        if (environment.containsProperty(ConfigClientProperties.PREFIX + \".label\"))\n        {\n            override.setLabel(environment.getProperty(ConfigClientProperties.PREFIX + \".label\"));\n        }\n        return override;\n    }\n\n    @Override\n    public String toString()\n    {\n        return \"ConfigClientProperties [enabled=\" + this.enabled + \", profile=\" + this.profile + \", name=\" + this.name\n                + \", label=\" + (this.label == null ? \"\" : this.label) + \", username=\" + this.username + \", password=\"\n                + this.password + \", uri=\" + this.uri + \", authorization=\" + this.authorization + \", discovery.enabled=\"\n                + this.discovery.enabled + \", failFast=\" + this.failFast + \", token=\" + this.token + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigClientStateHolder.java",
    "content": "package com.xiao.custom.config.client.configuration;\n\n/**\n * @author Spencer Gibb\n */\npublic class ConfigClientStateHolder {\n\tprivate static ThreadLocal<String> state = new ThreadLocal<>();\n\n\tpublic static void resetState() {\n\t\tstate.remove();\n\t}\n\n\tpublic static void setState(String newState) {\n\t\tif (newState == null) {\n\t\t\tresetState();\n\t\t\treturn;\n\t\t}\n\t\tstate.set(newState);\n\t}\n\n\tpublic static String getState() {\n\t\treturn state.get();\n\t}\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigClientWatch.java",
    "content": "/*\n * Copyright 2013-2016 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.springframework.cloud.context.refresh.ContextRefresher;\nimport org.springframework.context.EnvironmentAware;\nimport org.springframework.core.env.Environment;\nimport org.springframework.scheduling.annotation.Scheduled;\n\nimport javax.annotation.PostConstruct;\nimport java.io.Closeable;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport static org.springframework.util.StringUtils.hasText;\n\n/**\n * @author Spencer Gibb\n */\npublic class ConfigClientWatch implements Closeable, EnvironmentAware\n{\n\n    private static Log log = LogFactory.getLog(ConfigServicePropertySourceLocator.class);\n\n    private final AtomicBoolean running = new AtomicBoolean(false);\n    private final ContextRefresher refresher;\n    private Environment environment;\n\n    public ConfigClientWatch(ContextRefresher refresher)\n    {\n        this.refresher = refresher;\n    }\n\n    @Override\n    public void setEnvironment(Environment environment)\n    {\n        this.environment = environment;\n    }\n\n    @PostConstruct\n    public void start()\n    {\n        this.running.compareAndSet(false, true);\n    }\n\n    @Scheduled(initialDelayString = \"${spring.cloud.config.watch.initialDelay:180000}\", fixedDelayString = \"${spring.cloud.config.watch.delay:500}\")\n    public void watchConfigServer()\n    {\n        if (this.running.get())\n        {\n            String newState = this.environment.getProperty(\"config.client.state\");\n            String oldState = ConfigClientStateHolder.getState();\n\n            // only refresh if state has changed\n            if (stateChanged(oldState, newState))\n            {\n                ConfigClientStateHolder.setState(newState);\n                this.refresher.refresh();\n            }\n        }\n    }\n\n    /* for testing */ boolean stateChanged(String oldState, String newState)\n    {\n        return (!hasText(oldState) && hasText(newState)) || (hasText(oldState) && !oldState.equals(newState));\n    }\n\n    @Override\n    public void close()\n    {\n        this.running.compareAndSet(true, false);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigServerHealthIndicator.java",
    "content": "package com.xiao.custom.config.client.configuration;\n\nimport org.springframework.boot.actuate.health.AbstractHealthIndicator;\nimport org.springframework.boot.actuate.health.Health.Builder;\nimport org.springframework.core.env.CompositePropertySource;\nimport org.springframework.core.env.Environment;\nimport org.springframework.core.env.PropertySource;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author Spencer Gibb\n * @author Marcos Barbero\n */\npublic class ConfigServerHealthIndicator extends AbstractHealthIndicator\n{\n\n    private ConfigServicePropertySourceLocator locator;\n    private ConfigClientHealthProperties properties;\n    private Environment environment;\n\n    private long lastAccess = 0;\n\n    private PropertySource<?> cached;\n\n    public ConfigServerHealthIndicator(ConfigServicePropertySourceLocator locator, Environment environment,\n            ConfigClientHealthProperties properties)\n    {\n        this.environment = environment;\n        this.locator = locator;\n        this.properties = properties;\n    }\n\n    @Override\n    protected void doHealthCheck(Builder builder) throws Exception\n    {\n        PropertySource<?> propertySource = getPropertySource();\n        builder.up();\n        if (propertySource instanceof CompositePropertySource)\n        {\n            List<String> sources = new ArrayList<>();\n            for (PropertySource<?> ps : ((CompositePropertySource) propertySource).getPropertySources())\n            {\n                sources.add(ps.getName());\n            }\n            builder.withDetail(\"propertySources\", sources);\n        }\n        else if (propertySource != null)\n        {\n            builder.withDetail(\"propertySources\", propertySource.toString());\n        }\n        else\n        {\n            builder.unknown().withDetail(\"error\", \"no property sources located\");\n        }\n    }\n\n    private PropertySource<?> getPropertySource()\n    {\n        long accessTime = System.currentTimeMillis();\n        if (isCacheStale(accessTime))\n        {\n            this.lastAccess = accessTime;\n            this.cached = locator.locate(this.environment);\n        }\n        return this.cached;\n    }\n\n    private boolean isCacheStale(long accessTime)\n    {\n        if (this.cached == null)\n        {\n            return true;\n        }\n        return (accessTime - this.lastAccess) >= this.properties.getTimeToLive();\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigServiceBootstrapConfiguration.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.aspectj.lang.annotation.Aspect;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.aop.AopAutoConfiguration;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.core.env.ConfigurableEnvironment;\nimport org.springframework.retry.annotation.EnableRetry;\nimport org.springframework.retry.annotation.Retryable;\nimport org.springframework.retry.interceptor.RetryInterceptorBuilder;\nimport org.springframework.retry.interceptor.RetryOperationsInterceptor;\n\n/**\n * @author Dave Syer\n */\n@Configuration\n@EnableConfigurationProperties\npublic class ConfigServiceBootstrapConfiguration\n{\n\n    @Autowired\n    private ConfigurableEnvironment environment;\n\n    @Bean\n    public ConfigClientProperties configClientProperties()\n    {\n        ConfigClientProperties client = new ConfigClientProperties(this.environment);\n        return client;\n    }\n\n    @Bean\n    @ConditionalOnProperty(value = \"spring.cloud.config.enabled\", matchIfMissing = true)\n    public ConfigServicePropertySourceLocator configServicePropertySource(ConfigClientProperties properties)\n    {\n        ConfigServicePropertySourceLocator locator = new ConfigServicePropertySourceLocator(properties);\n        return locator;\n    }\n\n    @ConditionalOnProperty(value = \"spring.cloud.config.failFast\", matchIfMissing = false)\n    @ConditionalOnClass({ Retryable.class, Aspect.class, AopAutoConfiguration.class })\n    @Configuration\n    @EnableRetry(proxyTargetClass = true)\n    @Import(AopAutoConfiguration.class)\n    @EnableConfigurationProperties(RetryProperties.class)\n    protected static class RetryConfiguration\n    {\n\n        @Bean\n        @ConditionalOnMissingBean(name = \"configServerRetryInterceptor\")\n        public RetryOperationsInterceptor configServerRetryInterceptor(RetryProperties properties)\n        {\n            return RetryInterceptorBuilder.stateless()\n                    .backOffOptions(properties.getInitialInterval(), properties.getMultiplier(), properties\n                            .getMaxInterval()).maxAttempts(properties.getMaxAttempts()).build();\n        }\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/ConfigServicePropertySourceLocator.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport com.xiao.custom.config.client.environment.Environment;\nimport com.xiao.custom.config.client.environment.PropertySource;\nimport com.xiao.custom.config.client.netty.util.RemotingUtil;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.springframework.cloud.bootstrap.config.PropertySourceLocator;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.core.env.CompositePropertySource;\nimport org.springframework.core.env.MapPropertySource;\nimport org.springframework.http.*;\nimport org.springframework.http.client.ClientHttpRequestExecution;\nimport org.springframework.http.client.ClientHttpRequestInterceptor;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.http.client.SimpleClientHttpRequestFactory;\nimport org.springframework.retry.annotation.Retryable;\nimport org.springframework.util.Base64Utils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.client.HttpClientErrorException;\nimport org.springframework.web.client.HttpServerErrorException;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport static com.xiao.custom.config.client.configuration.ConfigClientProperties.STATE_HEADER;\nimport static com.xiao.custom.config.client.configuration.ConfigClientProperties.TOKEN_HEADER;\n\n/**\n * @author Dave Syer\n */\n@Order(0)\npublic class ConfigServicePropertySourceLocator implements PropertySourceLocator\n{\n\n    private static final String LOCAL_HOST = \"ClientServerHost\";\n    private static final String LOCAL_PORT = \"ClientServerPort\";\n\n    private static Log logger = LogFactory.getLog(ConfigServicePropertySourceLocator.class);\n\n    private RestTemplate restTemplate;\n    private ConfigClientProperties defaultProperties;\n\n    public ConfigServicePropertySourceLocator(ConfigClientProperties defaultProperties)\n    {\n        this.defaultProperties = defaultProperties;\n    }\n\n    @Override\n    @Retryable(interceptor = \"configServerRetryInterceptor\")\n    public org.springframework.core.env.PropertySource<?> locate(org.springframework.core.env.Environment environment)\n    {\n        ConfigClientProperties properties = this.defaultProperties.override(environment);\n        CompositePropertySource composite = new CompositePropertySource(\"configService\");\n        RestTemplate restTemplate = this.restTemplate == null ? getSecureRestTemplate(properties) : this.restTemplate;\n        Exception error = null;\n        String errorBody = null;\n        logger.info(\"Fetching config from server at: \" + properties.getRawUri());\n        try\n        {\n            String[] labels = new String[] { \"\" };\n            if (StringUtils.hasText(properties.getLabel()))\n            {\n                labels = StringUtils.commaDelimitedListToStringArray(properties.getLabel());\n            }\n\n            String state = ConfigClientStateHolder.getState();\n\n            // Try all the labels until one works\n            for (String label : labels)\n            {\n                Environment result = getRemoteEnvironment(restTemplate, properties, label.trim(), state);\n                if (result != null)\n                {\n                    logger.info(String\n                            .format(\"Located environment: name=%s, profiles=%s, label=%s, version=%s, state=%s\", result\n                                            .getName(),\n                                    result.getProfiles() == null ? \"\" : Arrays.asList(result.getProfiles()), result\n                                            .getLabel(), result.getVersion(), result.getState()));\n\n                    if (result.getPropertySources() != null)\n                    { // result.getPropertySources() can be null if using xml\n                        for (PropertySource source : result.getPropertySources())\n                        {\n                            @SuppressWarnings(\"unchecked\") Map<String, Object> map = (Map<String, Object>) source\n                                    .getSource();\n                            composite.addPropertySource(new MapPropertySource(source.getName(), map));\n                        }\n                    }\n\n                    if (StringUtils.hasText(result.getState()) || StringUtils.hasText(result.getVersion()))\n                    {\n                        HashMap<String, Object> map = new HashMap<>();\n                        putValue(map, \"config.client.state\", result.getState());\n                        putValue(map, \"config.client.version\", result.getVersion());\n                        composite.addFirstPropertySource(new MapPropertySource(\"configClient\", map));\n                    }\n                    return composite;\n                }\n            }\n        }\n        catch (HttpServerErrorException e)\n        {\n            error = e;\n            if (MediaType.APPLICATION_JSON.includes(e.getResponseHeaders().getContentType()))\n            {\n                errorBody = e.getResponseBodyAsString();\n            }\n        }\n        catch (Exception e)\n        {\n            error = e;\n        }\n        if (properties.isFailFast())\n        {\n            throw new IllegalStateException(\"Could not locate PropertySource and the fail fast property is set, failing\", error);\n        }\n        logger.warn(\"Could not locate PropertySource: \" + (errorBody == null ?\n                error == null ? \"label not found\" : error.getMessage() :\n                errorBody));\n        return null;\n\n    }\n\n    private void putValue(HashMap<String, Object> map, String key, String value)\n    {\n        if (StringUtils.hasText(value))\n        {\n            map.put(key, value);\n        }\n    }\n\n    private Environment getRemoteEnvironment(RestTemplate restTemplate, ConfigClientProperties properties, String label,\n            String state)\n    {\n        String path = \"/{name}/{profile}\";\n        String name = properties.getName();\n        String profile = properties.getProfile();\n        String token = properties.getToken();\n        String uri = properties.getRawUri();\n\n        Object[] args = new String[] { name, profile };\n        if (StringUtils.hasText(label))\n        {\n            args = new String[] { name, profile, label };\n            path = path + \"/{label}\";\n        }\n        ResponseEntity<Environment> response = null;\n\n        try\n        {\n            HttpHeaders headers = new HttpHeaders();\n            if (StringUtils.hasText(token))\n            {\n                headers.add(TOKEN_HEADER, token);\n            }\n            if (StringUtils.hasText(state))\n            { //TODO: opt in to sending state?\n                headers.add(STATE_HEADER, state);\n            }\n            final HttpEntity<Void> entity = new HttpEntity<>((Void) null, headers);\n            response = restTemplate.exchange(uri + path, HttpMethod.GET, entity, Environment.class, args);\n        }\n        catch (HttpClientErrorException e)\n        {\n            if (e.getStatusCode() != HttpStatus.NOT_FOUND)\n            {\n                throw e;\n            }\n        }\n\n        if (response == null || response.getStatusCode() != HttpStatus.OK)\n        {\n            return null;\n        }\n        Environment result = response.getBody();\n        return result;\n    }\n\n    public void setRestTemplate(RestTemplate restTemplate)\n    {\n        this.restTemplate = restTemplate;\n    }\n\n    private RestTemplate getSecureRestTemplate(ConfigClientProperties client)\n    {\n        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();\n        requestFactory.setReadTimeout((60 * 1000 * 3) + 5000); //TODO 3m5s, make configurable?\n        RestTemplate template = new RestTemplate(requestFactory);\n        String password = client.getPassword();\n        String authorization = client.getAuthorization();\n\n        if (password != null && authorization != null)\n        {\n            throw new IllegalStateException(\"You must set either 'password' or 'authorization'\");\n        }\n\n        if (password != null)\n        {\n            template.setInterceptors(Arrays.<ClientHttpRequestInterceptor>asList(new BasicAuthorizationInterceptor(client\n                    .getUsername(), password)));\n        }\n        else if (authorization != null)\n        {\n            template.setInterceptors(Arrays.<ClientHttpRequestInterceptor>asList(new GenericAuthorization(authorization)));\n        }\n        // 自定义 http header\n        template.setInterceptors(Arrays\n                .asList((ClientHttpRequestInterceptor) (httpRequest, bytes, clientHttpRequestExecution) ->\n                {\n                    HttpHeaders headers = httpRequest.getHeaders();\n                    // TODO  通过netty交互，上报客户端 服务IP和端口号\n                    headers.add(LOCAL_PORT, client.getServerPort() + \"\");\n                    headers.add(LOCAL_HOST, RemotingUtil.getLocalHost());\n                    return clientHttpRequestExecution.execute(httpRequest, bytes);\n                }));\n\n        return template;\n    }\n\n    private static class BasicAuthorizationInterceptor implements ClientHttpRequestInterceptor\n    {\n\n        private final String username;\n\n        private final String password;\n\n        public BasicAuthorizationInterceptor(String username, String password)\n        {\n            this.username = username;\n            this.password = (password == null ? \"\" : password);\n        }\n\n        @Override\n        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)\n                throws IOException\n        {\n            byte[] token = Base64Utils.encode((this.username + \":\" + this.password).getBytes());\n            request.getHeaders().add(\"Authorization\", \"Basic \" + new String(token));\n            return execution.execute(request, body);\n        }\n\n    }\n\n    private static class GenericAuthorization implements ClientHttpRequestInterceptor\n    {\n\n        private final String authorizationToken;\n\n        public GenericAuthorization(String authorizationToken)\n        {\n            this.authorizationToken = (authorizationToken == null ? \"\" : authorizationToken);\n        }\n\n        @Override\n        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)\n                throws IOException\n        {\n            request.getHeaders().add(\"Authorization\", authorizationToken);\n            return execution.execute(request, body);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/DiscoveryClientConfigServiceBootstrapConfiguration.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.cloud.client.ServiceInstance;\nimport org.springframework.cloud.client.discovery.DiscoveryClient;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.client.discovery.event.HeartbeatEvent;\nimport org.springframework.cloud.client.discovery.event.HeartbeatMonitor;\nimport org.springframework.cloud.commons.util.UtilAutoConfiguration;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.context.event.EventListener;\n\nimport java.util.List;\n\n/**\n * Bootstrap configuration for a config client that wants to lookup the config server via\n * discovery.\n *\n * @author Dave Syer\n */\n@ConditionalOnProperty(value = \"spring.cloud.config.discovery.enabled\", matchIfMissing = false)\n@Configuration\n@Import({ UtilAutoConfiguration.class })\n@EnableDiscoveryClient\npublic class DiscoveryClientConfigServiceBootstrapConfiguration\n{\n\n    private static Log logger = LogFactory.getLog(DiscoveryClientConfigServiceBootstrapConfiguration.class);\n\n    @Autowired\n    private ConfigClientProperties config;\n\n    @Autowired\n    private DiscoveryClient client;\n\n    private HeartbeatMonitor monitor = new HeartbeatMonitor();\n\n    @EventListener(ContextRefreshedEvent.class)\n    public void startup(ContextRefreshedEvent event)\n    {\n        refresh();\n    }\n\n    @EventListener(HeartbeatEvent.class)\n    public void heartbeat(HeartbeatEvent event)\n    {\n        if (monitor.update(event.getValue()))\n        {\n            refresh();\n        }\n    }\n\n    private void refresh()\n    {\n        try\n        {\n            logger.debug(\"Locating configserver via discovery\");\n            String serviceId = this.config.getDiscovery().getServiceId();\n            List<ServiceInstance> instances = this.client.getInstances(serviceId);\n            if (instances.isEmpty())\n            {\n                logger.warn(\"No instances found of configserver (\" + serviceId + \")\");\n                return;\n            }\n            ServiceInstance server = instances.get(0);\n            String url = getHomePage(server);\n            if (server.getMetadata().containsKey(\"password\"))\n            {\n                String user = server.getMetadata().get(\"user\");\n                user = user == null ? \"user\" : user;\n                this.config.setUsername(user);\n                String password = server.getMetadata().get(\"password\");\n                this.config.setPassword(password);\n            }\n            if (server.getMetadata().containsKey(\"configPath\"))\n            {\n                String path = server.getMetadata().get(\"configPath\");\n                if (url.endsWith(\"/\") && path.startsWith(\"/\"))\n                {\n                    url = url.substring(0, url.length() - 1);\n                }\n                url = url + path;\n            }\n            this.config.setUri(url);\n        }\n        catch (Exception ex)\n        {\n            logger.warn(\"Could not locate configserver via discovery\", ex);\n        }\n    }\n\n    private String getHomePage(ServiceInstance server)\n    {\n        return server.getUri().toString() + \"/\";\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/configuration/RetryProperties.java",
    "content": "/*\n * Copyright 2014-2015 the original author or authors.\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\npackage com.xiao.custom.config.client.configuration;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * @author Dave Syer\n *\n */\n@ConfigurationProperties(\"spring.cloud.config.retry\")\npublic class RetryProperties {\n\n\t/**\n\t * Initial retry interval in milliseconds.\n\t */\n\tlong initialInterval = 1000;\n\t/**\n\t * Multiplier for next interval.\n\t */\n\tdouble multiplier = 1.1;\n\t/**\n\t * Maximum interval for backoff.\n\t */\n\tlong maxInterval = 2000;\n\t/**\n\t * Maximum number of attempts.\n\t */\n\tint maxAttempts = 6;\n\n\tpublic long getInitialInterval() {\n\t\treturn this.initialInterval;\n\t}\n\n\tpublic void setInitialInterval(long initialInterval) {\n\t\tthis.initialInterval = initialInterval;\n\t}\n\n\tpublic double getMultiplier() {\n\t\treturn this.multiplier;\n\t}\n\n\tpublic void setMultiplier(double multiplier) {\n\t\tthis.multiplier = multiplier;\n\t}\n\n\tpublic long getMaxInterval() {\n\t\treturn this.maxInterval;\n\t}\n\n\tpublic void setMaxInterval(long maxInterval) {\n\t\tthis.maxInterval = maxInterval;\n\t}\n\n\tpublic int getMaxAttempts() {\n\t\treturn this.maxAttempts;\n\t}\n\n\tpublic void setMaxAttempts(int maxAttempts) {\n\t\tthis.maxAttempts = maxAttempts;\n\t}\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/environment/Environment.java",
    "content": "/*\n * Copyright 2013-2015 the original author or authors.\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\npackage com.xiao.custom.config.client.environment;\n\nimport com.fasterxml.jackson.annotation.JsonCreator;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * Simple plain text serializable encapsulation of a list of property sources. Basically a\n * DTO for {@link org.springframework.core.env.Environment}, but also applicable outside\n * the domain of a Spring application.\n *\n * @author Dave Syer\n * @author Spencer Gibb\n *\n */\npublic class Environment {\n\n\tprivate String name;\n\n\tprivate String[] profiles = new String[0];\n\n\tprivate String label;\n\n\tprivate List<PropertySource> propertySources = new ArrayList<>();\n\n\tprivate String version;\n\n\tprivate String state;\n\n\tpublic Environment(String name, String... profiles) {\n\t\tthis(name, profiles, \"master\", null, null);\n\t}\n\n\t/**\n\t * Copies all fields except propertySources\n\t * @param env\n\t */\n\tpublic Environment(Environment env) {\n\t\tthis(env.getName(), env.getProfiles(), env.getLabel(), env.getVersion(), env.getState());\n\t}\n\n\t@JsonCreator\n\tpublic Environment(@JsonProperty(\"name\") String name,\n\t\t\t@JsonProperty(\"profiles\") String[] profiles,\n\t\t\t@JsonProperty(\"label\") String label,\n\t\t\t@JsonProperty(\"version\") String version,\n\t\t\t@JsonProperty(\"state\") String state) {\n\t\tsuper();\n\t\tthis.name = name;\n\t\tthis.profiles = profiles;\n\t\tthis.label = label;\n\t\tthis.version = version;\n\t\tthis.state = state;\n\t}\n\n\tpublic void add(PropertySource propertySource) {\n\t\tthis.propertySources.add(propertySource);\n\t}\n\n\tpublic void addAll(List<PropertySource> propertySources) {\n\t\tthis.propertySources.addAll(propertySources);\n\t}\n\n\tpublic void addFirst(PropertySource propertySource) {\n\t\tthis.propertySources.add(0, propertySource);\n\t}\n\n\tpublic List<PropertySource> getPropertySources() {\n\t\treturn propertySources;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic String getLabel() {\n\t\treturn label;\n\t}\n\n\tpublic void setLabel(String label) {\n\t\tthis.label = label;\n\t}\n\n\tpublic String[] getProfiles() {\n\t\treturn profiles;\n\t}\n\n\tpublic void setProfiles(String[] profiles) {\n\t\tthis.profiles = profiles;\n\t}\n\n\tpublic String getVersion() {\n\t\treturn version;\n\t}\n\n\tpublic void setVersion(String version) {\n\t\tthis.version = version;\n\t}\n\n\tpublic String getState() {\n\t\treturn state;\n\t}\n\n\tpublic void setState(String state) {\n\t\tthis.state = state;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Environment [name=\" + name + \", profiles=\" + Arrays.asList(profiles)\n\t\t\t\t+ \", label=\" + label + \", propertySources=\" + propertySources\n\t\t\t\t+ \", version=\" + version\n\t\t\t\t+ \", state=\" + state + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/environment/PropertySource.java",
    "content": "/*\n * Copyright 2013-2014 the original author or authors.\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\npackage com.xiao.custom.config.client.environment;\n\nimport com.fasterxml.jackson.annotation.JsonCreator;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\nimport java.util.Map;\n\n/**\n * Simple plain text serializable encapsulation of a named source of key-value pairs.\n * Basically a DTO for {@link PropertySource}, but also applicable outside the domain of a\n * Spring application.\n * \n * @author Dave Syer\n *\n */\npublic class PropertySource {\n\n\tprivate String name;\n\n\tprivate Map<?, ?> source;\n\n\t@JsonCreator\n\tpublic PropertySource(@JsonProperty(\"name\") String name,\n\t\t\t@JsonProperty(\"source\") Map<?, ?> source) {\n\t\tthis.name = name;\n\t\tthis.source = source;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic Map<?, ?> getSource() {\n\t\treturn source;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"PropertySource [name=\" + name + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/client/NettyClient.java",
    "content": "package com.xiao.custom.config.client.netty.client;\n\nimport com.xiao.custom.config.client.configuration.ConfigClientProperties;\nimport com.xiao.custom.config.client.netty.dto.CommandEnum;\nimport com.xiao.custom.config.client.netty.dto.Message;\nimport com.xiao.custom.config.client.netty.factory.CoderFactory;\nimport com.xiao.custom.config.client.netty.factory.NamedThreadFactory;\nimport com.xiao.custom.config.client.netty.handler.ServiceHandler;\nimport com.xiao.custom.config.client.netty.util.RemotingUtil;\nimport io.netty.bootstrap.Bootstrap;\nimport io.netty.channel.*;\nimport io.netty.channel.nio.NioEventLoopGroup;\nimport io.netty.channel.socket.nio.NioSocketChannel;\nimport io.netty.handler.timeout.IdleStateHandler;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.context.refresh.ContextRefresher;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\n\nimport javax.annotation.Resource;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ScheduledThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * [简要描述]: netty客户端\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 16:42\n * @since JDK 1.8\n */\n@Slf4j\npublic class NettyClient implements ApplicationListener<ContextRefreshedEvent>, DisposableBean\n{\n    private String nettyServerHost = \"localhost\";\n    private int nettyServerPort = 8999;\n\n    private AtomicBoolean started = new AtomicBoolean(false);\n\n    /**\n     * 重连检测任务\n     */\n    private ScheduledExecutorService reConnectExecutor;\n\n    @Resource\n    private ConfigClientProperties configClientProperties;\n\n    @Autowired\n    private ContextRefresher refresher;\n\n    private Bootstrap boot;\n\n    private Channel channel;\n\n    public NettyClient()\n    {\n        log.info(\">>> 初始化netty 客户端......\");\n    }\n\n    @Override\n    public void destroy() throws Exception\n    {\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)\n    {\n        //是否使用自定义配置中心\n        if (!started.get() && configClientProperties.isCustom())\n        {\n            log.info(\">>> 配置中心服务地址:{}\", configClientProperties.getUri());\n            nettyServerHost = parseHost(configClientProperties.getUri());\n            nettyServerPort = configClientProperties.getNettyPort();\n            init();\n            connect();\n            //2分钟检测一次连接情况\n            reConnectExecutor.scheduleAtFixedRate((Runnable) () -> check(), 1, 2, TimeUnit.MINUTES);\n        }\n    }\n\n    /**\n     * [简要描述]:发送消息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param message :\n     * llxiao  2019/4/1 - 11:38\n     **/\n    public void pushMessage(Message message)\n    {\n        if (null != message && started.get())\n        {\n            channel.writeAndFlush(message);\n        }\n    }\n\n    private void login()\n    {\n        Message message = new Message();\n        message.setCommand(CommandEnum.LOGIN.getStatus());\n        message.setServerPort(configClientProperties.getServerPort());\n        message.setHostIp(RemotingUtil.parseLocalIP(channel));\n        message.setApplicationName(configClientProperties.getName());\n        pushMessage(message);\n    }\n\n    /**\n     * 获取服务端IP地址\n     *\n     * @param uri\n     * @return\n     */\n    private String parseHost(String uri)\n    {\n        URL url = null;\n        try\n        {\n            url = new URL(uri);\n        }\n        catch (MalformedURLException e)\n        {\n            log.error(\"解析地址错误!\");\n        }\n        return url.getHost();\n    }\n\n    private void init()\n    {\n        reConnectExecutor = new ScheduledThreadPoolExecutor(1, NamedThreadFactory\n                .create(\"Netty client reconnect-\", true));\n        EventLoopGroup group = new NioEventLoopGroup();\n\n        boot = new Bootstrap();\n        boot.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true);\n        boot.handler(new ChannelInitializer<Channel>()\n        {\n            @Override\n            protected void initChannel(Channel channel) throws Exception\n            {\n                ChannelPipeline pipeline = channel.pipeline();\n                //监听读写动作，10S后无服务器响应信息，4S后无客户端写动作，触发userEventTriggered发起心跳\n                pipeline.addLast(new IdleStateHandler(10, 4, 0));\n\n                //先解码 后编码\n                pipeline.addLast(CoderFactory.newDecoder());\n                pipeline.addLast(CoderFactory.newEncoder());\n\n                //业务处理\n                pipeline.addLast(new ServiceHandler(started, refresher));\n            }\n        });\n    }\n\n    private void connect()\n    {\n        log.info(\">>> 客户端建立netty 连接，服务端-IP:{},Port:{}....\", nettyServerHost, nettyServerPort);\n        try\n        {\n            final ChannelFuture sync = boot.connect(nettyServerHost, nettyServerPort).sync();\n            channel = sync.channel();\n            started.set(sync.isSuccess());\n            login();\n        }\n        catch (Exception e)\n        {\n            log.error(\">>> 连接服务端异常，等待重连....\", e);\n        }\n    }\n\n    private void check()\n    {\n\n        if (log.isDebugEnabled())\n        {\n            log.debug(\">>> 执行检测任务.....\");\n        }\n\n        if (!started.get())\n        {\n            log.info(\">>> 执行客户端重连操作...\");\n            connect();\n\n            if (started.get())\n            {\n                //重连成功后再次刷新下配置文件\n                refresher.refresh();\n            }\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/coder/ProtoDecoder.java",
    "content": "package com.xiao.custom.config.client.netty.coder;\n\nimport com.xiao.custom.config.client.netty.util.ProtostuffUtil;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.ByteToMessageDecoder;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 编码\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 13:54\n * @since JDK 1.8\n */\npublic class ProtoDecoder extends ByteToMessageDecoder\n{\n    private static final int PROTO_BUFF_FLAG = 4;\n\n    private Class<?> genericClass;\n\n    public ProtoDecoder(Class cls)\n    {\n        this.genericClass = cls;\n    }\n\n    @Override\n    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) throws Exception\n    {\n        if (byteBuf.readableBytes() < PROTO_BUFF_FLAG)\n        {\n            return;\n        }\n        byteBuf.markReaderIndex();\n        int dataLength = byteBuf.readInt();\n        if (dataLength < 0)\n        {\n            ctx.close();\n        }\n        if (byteBuf.readableBytes() < dataLength)\n        {\n            byteBuf.resetReaderIndex();\n        }\n        // 将ByteBuf转换为byte[]\n        byte[] data = new byte[dataLength];\n        byteBuf.readBytes(data);\n        // 将data转换成object\n        Object obj = ProtostuffUtil.deserialize(data, genericClass);\n        list.add(obj);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/coder/ProtoEncoder.java",
    "content": "package com.xiao.custom.config.client.netty.coder;\n\nimport com.xiao.custom.config.client.netty.util.ProtostuffUtil;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandler;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.MessageToByteEncoder;\n\n/**\n * [简要描述]: 解码\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 13:54\n * @since JDK 1.8\n */\n@ChannelHandler.Sharable\npublic class ProtoEncoder extends MessageToByteEncoder<Object>\n{\n    private Class<?> genericClass;\n\n    public ProtoEncoder(Class cls)\n    {\n        this.genericClass = cls;\n    }\n\n    @Override\n    protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception\n    {\n        // 序列化\n        if (genericClass.isInstance(msg))\n        {\n            byte[] data = ProtostuffUtil.serialize(msg);\n            byteBuf.writeInt(data.length);\n            byteBuf.writeBytes(data);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/dto/CommandEnum.java",
    "content": "package com.xiao.custom.config.client.netty.dto;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 16:18\n * @since JDK 1.8\n */\npublic enum CommandEnum\n{\n    /**\n     * 心跳\n     */\n    IDLE(0),\n    /**\n     * 刷新\n     */\n    REFRESH(2),\n    /**\n     * 登录，绑定信息\n     */\n    LOGIN(1);\n\n    int status;\n\n    CommandEnum(int status)\n    {\n        this.status = status;\n    }\n\n    public int getStatus()\n    {\n        return status;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/dto/Message.java",
    "content": "package com.xiao.custom.config.client.netty.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: Netty交互消息体\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 10:42\n * @since JDK 1.8\n */\n@Data\npublic class Message\n{\n    /**\n     * 0：心跳，1：登录以及绑定NETTY信息，2：刷新\n     */\n    private int command;\n\n    /**\n     * 消息体\n     */\n    private String message;\n\n    /**\n     * 返回状态\n     */\n    private int status;\n\n    /**\n     * 错误消息\n     */\n    private String errorMessage;\n\n    /**\n     * 客户端服务端口\n     */\n    private int serverPort;\n\n    /**\n     * 客户端服务IP\n     */\n    private String hostIp;\n\n    /**\n     * 应用名称\n     */\n    private String applicationName;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/factory/CoderFactory.java",
    "content": "package com.xiao.custom.config.client.netty.factory;\n\nimport com.xiao.custom.config.client.netty.coder.ProtoDecoder;\nimport com.xiao.custom.config.client.netty.coder.ProtoEncoder;\nimport com.xiao.custom.config.client.netty.dto.Message;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 14:31\n * @since JDK 1.8\n */\npublic class CoderFactory\n{\n    public static ProtoDecoder newDecoder()\n    {\n        return new ProtoDecoder(Message.class);\n    }\n\n    public static ProtoEncoder newEncoder()\n    {\n        return new ProtoEncoder(Message.class);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/factory/NamedThreadFactory.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  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 */\npackage com.xiao.custom.config.client.netty.factory;\n\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * Thread factory to name the thread purposely\n *\n * @author jiangping\n * @version $Id: NamedThreadFactory.java, v 0.1 Sept 5, 2016 10:17:10 PM tao Exp $\n */\npublic class NamedThreadFactory implements ThreadFactory\n{\n\n    private static final AtomicInteger poolNumber = new AtomicInteger(1);\n    private final AtomicInteger threadNumber = new AtomicInteger(1);\n    private final ThreadGroup group;\n    private final String namePrefix;\n    private final boolean isDaemon;\n\n    public NamedThreadFactory()\n    {\n        this(\"ThreadPool\");\n    }\n\n    public NamedThreadFactory(String name)\n    {\n        this(name, false);\n    }\n\n    public NamedThreadFactory(String preffix, boolean daemon)\n    {\n        SecurityManager s = System.getSecurityManager();\n        group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();\n        namePrefix = preffix + \"-\" + poolNumber.getAndIncrement() + \"-thread-\";\n        isDaemon = daemon;\n    }\n\n    /**\n     * Create a thread.\n     *\n     * @see ThreadFactory#newThread(Runnable)\n     */\n    @Override\n    public Thread newThread(Runnable r)\n    {\n        Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);\n        t.setDaemon(isDaemon);\n        if (t.getPriority() != Thread.NORM_PRIORITY)\n        {\n            t.setPriority(Thread.NORM_PRIORITY);\n        }\n        return t;\n    }\n\n    /**\n     * 自定义线程factory\n     *\n     * @param namePrefix\n     * @param daemon\n     * @return\n     */\n    public static ThreadFactory create(final String namePrefix, final boolean daemon)\n    {\n        return new NamedThreadFactory(namePrefix, daemon);\n    }\n\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/handler/ServiceHandler.java",
    "content": "package com.xiao.custom.config.client.netty.handler;\n\nimport com.xiao.custom.config.client.netty.dto.CommandEnum;\nimport com.xiao.custom.config.client.netty.dto.Message;\nimport com.xiao.custom.config.client.netty.util.RemotingUtil;\nimport io.netty.channel.ChannelHandler;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.channel.SimpleChannelInboundHandler;\nimport io.netty.handler.timeout.IdleState;\nimport io.netty.handler.timeout.IdleStateEvent;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cloud.context.refresh.ContextRefresher;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * [简要描述]: 服务端业务处理handler\n * [详细描述]:\n * 业务处理请使用线程池\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 17:16\n * @since JDK 1.8\n */\n@ChannelHandler.Sharable\n@Slf4j\npublic class ServiceHandler extends SimpleChannelInboundHandler<Message>\n{\n    private static final Message HEARTBEAT_SEQUENCE = new Message();\n\n    private AtomicBoolean stated;\n\n    private ContextRefresher refresher;\n\n    public ServiceHandler(AtomicBoolean stated, ContextRefresher refresher)\n    {\n        super();\n        this.stated = stated;\n        HEARTBEAT_SEQUENCE.setCommand(CommandEnum.IDLE.getStatus());\n        this.refresher = refresher;\n    }\n\n    @Override\n    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Message message) throws Exception\n    {\n        //心跳消息\n        if (CommandEnum.IDLE.getStatus() == message.getCommand())\n        {\n            if (log.isDebugEnabled())\n            {\n                log.debug(\">>> 接收到服务端返回心跳消息：{}\", message);\n            }\n        }\n        else if (CommandEnum.REFRESH.getStatus() == message.getCommand())\n        {\n            log.info(\">>> 服务端推送了刷新信息\", message.getCommand());\n            refresher.refresh();\n        }\n        else\n        {\n            log.info(\">>> 业务处理\");\n        }\n    }\n\n    @Override\n    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception\n    {\n        log.warn(\">>> 服务端异常，等待定时重连......\");\n        stated.set(false);\n        super.exceptionCaught(ctx, cause);\n    }\n\n    @Override\n    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception\n    {\n\n        if (evt instanceof IdleStateEvent)\n        {\n            IdleState state = ((IdleStateEvent) evt).state();\n            if (state == IdleState.WRITER_IDLE)\n            {\n                //如果没有触发写事件则向服务器发送一次心跳包\n                if (log.isDebugEnabled())\n                {\n                    log.debug(\">>> 客户端-IP:{},PORT:{}不活跃了，发起心跳请求.....\", RemotingUtil\n                            .parseLocalIP(ctx.channel()), RemotingUtil.parseLocalPort(ctx.channel()));\n                }\n                // 发起心跳请求\n                ctx.writeAndFlush(HEARTBEAT_SEQUENCE);\n            }\n            else if (state == IdleState.READER_IDLE)\n            {\n                //如果没有收到服务端的写 则表示服务器超时 判断是否断开连接\n                log.warn(\"未收到服务器消息，服务器可能出现异常。需要进行重连操作..\");\n                stated.set(false);\n                if (ctx.channel().isOpen())\n                {\n                    ctx.close();\n                }\n            }\n            else\n            {\n                super.userEventTriggered(ctx, evt);\n            }\n        }\n        else\n        {\n            super.userEventTriggered(ctx, evt);\n        }\n    }\n\n    //建立连接时回调\n    @Override\n    public void channelActive(ChannelHandlerContext ctx) throws Exception\n    {\n        log.info(\">>> 建立连接成功，服务端IP:{},PORT:{}\", RemotingUtil.parseRemoteIP(ctx.channel()), RemotingUtil\n                .parseRemotePort(ctx.channel()));\n        super.channelActive(ctx);\n    }\n\n    @Override\n    public void channelInactive(ChannelHandlerContext ctx) throws Exception\n    {\n        log.warn(\">>> 服务端不活跃了。IP:{},PORT:{}\", RemotingUtil.parseRemoteIP(ctx.channel()), RemotingUtil\n                .parseRemotePort(ctx.channel()));\n        super.channelInactive(ctx);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/util/ProtostuffUtil.java",
    "content": "/*\n * Winner\n * 文件名  :ProtostuffUtil.java\n * 创建人  :llxiao\n * 创建时间:2018年5月2日\n */\n\npackage com.xiao.custom.config.client.netty.util;\n\nimport com.dyuproject.protostuff.LinkedBuffer;\nimport com.dyuproject.protostuff.ProtostuffIOUtil;\nimport com.dyuproject.protostuff.Schema;\nimport com.dyuproject.protostuff.runtime.RuntimeSchema;\nimport org.objenesis.Objenesis;\nimport org.objenesis.ObjenesisStd;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * [简要描述]:序列化工具类（基于 Protostuff 实现）<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年5月2日\n * @since JDK 1.8\n */\npublic class ProtostuffUtil\n{\n    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<>();\n\n    private static Objenesis objenesis = new ObjenesisStd(true);\n\n    /**\n     * 获取类的schema\n     *\n     * @param cls\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    private static <T> Schema<T> getSchema(Class<T> cls)\n    {\n        Schema<T> schema = (Schema<T>) cachedSchema.get(cls);\n        if (schema == null)\n        {\n            schema = RuntimeSchema.createFrom(cls);\n            if (schema != null)\n            {\n                cachedSchema.put(cls, schema);\n            }\n        }\n        return schema;\n    }\n\n    /**\n     * [简要描述]:序列化（对象 -> 字节数组）<br/>\n     * [详细描述]:<br/>\n     *\n     * @param obj 序列化对象\n     * @return 对象字节数组\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> byte[] serialize(T obj)\n    {\n        Class<T> cls = (Class<T>) obj.getClass();\n        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);\n        try\n        {\n            Schema<T> schema = getSchema(cls);\n            return ProtostuffIOUtil.toByteArray(obj, schema, buffer);\n        }\n        catch (Exception e)\n        {\n            throw new IllegalStateException(e.getMessage(), e);\n        }\n        finally\n        {\n            buffer.clear();\n        }\n    }\n\n    /**\n     * [简要描述]:反序列化（字节数组 -> 对象）<br/>\n     * [详细描述]:<br/>\n     *\n     * @param data 数据\n     * @param cls class对象\n     * @return class对象\n     */\n    public static <T> T deserialize(byte[] data, Class<T> cls)\n    {\n        try\n        {\n            /*\n             * 如果一个类没有参数为空的构造方法时候，那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的\n             * 通过ObjenesisStd可以完美的避开这个问题\n             */\n            T message = (T) objenesis.newInstance(cls);// 实例化\n            Schema<T> schema = getSchema(cls);// 获取类的schema\n            ProtostuffIOUtil.mergeFrom(data, message, schema);\n            return message;\n        }\n        catch (Exception e)\n        {\n            throw new IllegalStateException(e.getMessage(), e);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/netty/util/RemotingUtil.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  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 */\npackage com.xiao.custom.config.client.netty.util;\n\nimport io.netty.channel.Channel;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.net.*;\nimport java.util.Enumeration;\n\n/**\n * Some utilities for remoting.\n *\n * @author jiangping\n * @version $Id: RemotingUtil.java, v 0.1 Mar 30, 2016 11:51:02 AM jiangping Exp $\n */\n@Slf4j\npublic class RemotingUtil\n{\n\n    /**\n     * Parse the remote address of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteAddress(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final SocketAddress remote = channel.remoteAddress();\n        return doParse(remote != null ? remote.toString().trim() : StringUtils.EMPTY);\n    }\n\n    /**\n     * Parse the local address of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseLocalAddress(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final SocketAddress local = channel.localAddress();\n        return doParse(local != null ? local.toString().trim() : StringUtils.EMPTY);\n    }\n\n    /**\n     * Parse the remote host ip of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteIP(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getAddress().getHostAddress();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the remote hostname of the channel.\n     * <p>\n     * Note: take care to use this method, for a reverse name lookup takes uncertain time in {@link InetAddress#getHostName}.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteHostName(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getAddress().getHostName();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the local host ip of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseLocalIP(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress local = (InetSocketAddress) channel.localAddress();\n        if (local != null)\n        {\n            return local.getAddress().getHostAddress();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the remote host port of the channel.\n     *\n     * @param channel\n     * @return int\n     */\n    public static int parseRemotePort(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return -1;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getPort();\n        }\n        return -1;\n    }\n\n    /**\n     * Parse the local host port of the channel.\n     *\n     * @param channel\n     * @return int\n     */\n    public static int parseLocalPort(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return -1;\n        }\n        final InetSocketAddress local = (InetSocketAddress) channel.localAddress();\n        if (local != null)\n        {\n            return local.getPort();\n        }\n        return -1;\n    }\n\n    /**\n     * Parse the socket address, omit the leading \"/\" if present.\n     * <p>\n     * e.g.1 /127.0.0.1:1234 -> 127.0.0.1:1234\n     * e.g.2 sofatest-2.stack.alipay.net/10.209.155.54:12200 -> 10.209.155.54:12200\n     *\n     * @param socketAddress\n     * @return String\n     */\n    public static String parseSocketAddressToString(SocketAddress socketAddress)\n    {\n        if (socketAddress != null)\n        {\n            return doParse(socketAddress.toString().trim());\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the host ip of socket address.\n     * <p>\n     * e.g. /127.0.0.1:1234 -> 127.0.0.1\n     *\n     * @param socketAddress\n     * @return String\n     */\n    public static String parseSocketAddressToHostIp(SocketAddress socketAddress)\n    {\n        final InetSocketAddress addrs = (InetSocketAddress) socketAddress;\n        if (addrs != null)\n        {\n            InetAddress addr = addrs.getAddress();\n            if (null != addr)\n            {\n                return addr.getHostAddress();\n            }\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * URL地址获取host信息\n     *\n     * @param url\n     * @return\n     */\n    public static String getHost(String url)\n    {\n        String host = \"\";\n        if (StringUtils.isNotBlank(url))\n        {\n            try\n            {\n                URL u = new URL(url);\n                host = u.getHost();\n            }\n            catch (Exception e)\n            {\n                log.error(\"Url错误，获取不到主机信息!\");\n            }\n        }\n\n        return host;\n    }\n\n    /**\n     * [简要描述]:获取本地IP地址<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.lang.String\n     * llxiao  2019/4/3 - 16:52\n     **/\n    public static String getLocalHost()\n    {\n        InetAddress inetAddress = getLocalHostLANAddress();\n        if (null != inetAddress)\n        {\n            return inetAddress.getHostName();\n        }\n        else\n        {\n            return \"\";\n        }\n    }\n\n    /**\n     * [简要描述]:获取本地的IP地址<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.net.InetAddress\n     * llxiao  2019/4/3 - 16:44\n     **/\n    public static InetAddress getLocalHostLANAddress()\n    {\n        InetAddress jdkSuppliedAddress = null;\n        try\n        {\n            InetAddress candidateAddress = null;\n            InetAddress inetAddr;\n            NetworkInterface iface;\n            // 遍历所有的网络接口\n            for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); )\n            {\n                iface = (NetworkInterface) ifaces.nextElement();\n                // 在所有的接口下再遍历IP\n                for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); )\n                {\n                    inetAddr = (InetAddress) inetAddrs.nextElement();\n                    if (!inetAddr.isLoopbackAddress())\n                    {// 排除loopback类型地址\n                        if (inetAddr.isSiteLocalAddress())\n                        {\n                            // 如果是site-local地址，就是它了\n                            return inetAddr;\n                        }\n                        else if (candidateAddress == null)\n                        {\n                            // site-local类型的地址未被发现，先记录候选地址\n                            candidateAddress = inetAddr;\n                        }\n                    }\n                }\n            }\n            if (candidateAddress != null)\n            {\n                jdkSuppliedAddress = candidateAddress;\n            }\n            else\n            {\n                // 如果没有发现 non-loopback地址.只能用最次选的方案\n                jdkSuppliedAddress = InetAddress.getLocalHost();\n            }\n        }\n        catch (Exception e)\n        {\n            log.error(\"获取本地IP地址错误，错误信息:\", e);\n        }\n        return jdkSuppliedAddress;\n    }\n\n    /**\n     * <ol>\n     * <li>if an address starts with a '/', skip it.\n     * <li>if an address contains a '/', substring it.\n     * </ol>\n     *\n     * @param addr\n     * @return\n     */\n    private static String doParse(String addr)\n    {\n        if (StringUtils.isBlank(addr))\n        {\n            return StringUtils.EMPTY;\n        }\n        if (addr.charAt(0) == '/')\n        {\n            return addr.substring(1);\n        }\n        else\n        {\n            int len = addr.length();\n            for (int i = 1; i < len; ++i)\n            {\n                if (addr.charAt(i) == '/')\n                {\n                    return addr.substring(i + 1);\n                }\n            }\n            return addr;\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/refresh/api/RefreshController.java",
    "content": "package com.xiao.custom.config.client.refresh.api;\n\nimport com.xiao.custom.config.client.refresh.service.ConfigRefreshService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]: 配置刷新rest服务\n * [详细描述]:  待考虑安全问题\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 14:18\n * @since JDK 1.8\n */\n//@RestController\n//@RequestMapping(\"/config\")\npublic class RefreshController\n{\n    /**\n     * 成功标识\n     */\n    private static final int SUCCESS = 0;\n\n//    @Autowired\n    private ConfigRefreshService configRefreshService;\n\n    /**\n     * [简要描述]:刷新配置<br/>\n     * [详细描述]:仅支持post请求<br/>\n     * <p>\n     * llxiao  2019/1/29 - 14:23\n     **/\n    @RequestMapping(value = \"/refresh\", method = RequestMethod.POST)\n    public int refresh()\n    {\n        configRefreshService.refresh();\n        return SUCCESS;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/refresh/component/RefreshBeanConfig.java",
    "content": "package com.xiao.custom.config.client.refresh.component;\n\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * [简要描述]: 注解扫描refresh包下所有的bean<br>\n * [详细描述]: 主要提供刷新配置文件的入口<br>\n * ComponentScan默认会扫描该类所在的包下的所有bean文件\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 14:07\n * @since JDK 1.8\n */\n//@Configuration\n//@ComponentScan\npublic class RefreshBeanConfig\n{\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/refresh/service/ConfigRefreshService.java",
    "content": "package com.xiao.custom.config.client.refresh.service;\n\n/**\n * [简要描述]: 配置刷新服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 14:19\n * @since JDK 1.8\n */\npublic interface ConfigRefreshService\n{\n    /**\n     * [简要描述]:刷新spring容器中的变更的配置<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/1/29 - 14:19\n     **/\n    void refresh();\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/java/com/xiao/custom/config/client/refresh/service/impl/ConfigRefreshServiceImpl.java",
    "content": "package com.xiao.custom.config.client.refresh.service.impl;\n\nimport com.xiao.custom.config.client.refresh.service.ConfigRefreshService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.context.refresh.ContextRefresher;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: 配置刷新服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 14:20\n * @since JDK 1.8\n */\n//@Service\n@Slf4j\npublic class ConfigRefreshServiceImpl implements ConfigRefreshService\n{\n//    @Autowired\n    private ContextRefresher refresher;\n\n    /**\n     * [简要描述]:刷新spring容器中的变更的配置<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/1/29 - 14:19\n     **/\n    @Override\n    public void refresh()\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"开始执行配置刷新动作......................\");\n        }\n        refresher.refresh();\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"配置刷新完成......................\");\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-client/src/main/resources/META-INF/spring.factories",
    "content": "# Auto Configure\norg.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.xiao.custom.config.client.configuration.ConfigClientAutoConfiguration\n\n# Bootstrap components\norg.springframework.cloud.bootstrap.BootstrapConfiguration=\\\ncom.xiao.custom.config.client.configuration.ConfigServiceBootstrapConfiguration,\\\ncom.xiao.custom.config.client.configuration.DiscoveryClientConfigServiceBootstrapConfiguration"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-dependencies/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-dependencies</artifactId>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-starter-config</artifactId>\n            </dependency>\n            <dependency>\n                <groupId>com.xiao.skywalking.demo</groupId>\n                <artifactId>custom-config-client</artifactId>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-pojo</artifactId>\n    <dependencies>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-collections</groupId>\n            <artifactId>commons-collections</artifactId>\n            <version>3.2.2</version>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis</artifactId>\n            <version>3.5.6</version>\n            <scope>compile</scope>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/common/BaseQuery.java",
    "content": "package com.xiao.custom.config.pojo.common;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:04\n * @since JDK 1.8\n */\n@Data\npublic class BaseQuery\n{\n    int pageNum = 1;\n\n    int pageSize = 10;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ApplicationConfigDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2019/01/07\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ApplicationConfigDto\n{\n    //\n    private Long id;\n\n    //关联的应用ID\n    private Long applicationId;\n\n    //配置项KEY\n    private String itemKey;\n\n    //配置项值\n    private String itemValue;\n\n    //配置描述\n    private String itemDesc;\n\n    //创建时间\n    private Date createTime;\n\n    //更新时间\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ApplicationDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport com.xiao.custom.config.pojo.entity.Application;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ApplicationDto\n{\n    //\n    private Long id;\n\n    //应用名称\n    private String application;\n\n    //应用描述\n    private String applicationName;\n\n    //\n    private String label;\n\n    //环境\n    private String profile;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n\n    //所属区域\n    private Long regionId;\n\n    //区域名称\n    private String regionName;\n\n    private String groupIds;\n\n    public static Application convertToEntity(ApplicationDto applicationConfigDto)\n    {\n        Application applicationConfig = null;\n        if (applicationConfigDto != null)\n        {\n            applicationConfig = new Application();\n            applicationConfig.setApplicationName(applicationConfigDto.getApplicationName());\n            applicationConfig.setCreateTime(applicationConfigDto.getCreateTime());\n            applicationConfig.setLabel(applicationConfigDto.getLabel());\n            applicationConfig.setProfile(applicationConfigDto.getProfile());\n            applicationConfig.setRegionId(applicationConfigDto.getRegionId());\n            applicationConfig.setId(applicationConfigDto.getId());\n            applicationConfig.setUpdateTime(applicationConfigDto.getUpdateTime());\n            applicationConfig.setApplication(applicationConfigDto.getApplication());\n        }\n        return applicationConfig;\n    }\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ClientHostInfoDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport lombok.Data;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 14:23\n * @since JDK 1.8\n */\n@Data\npublic class ClientHostInfoDto\n{\n    private Long id;\n\n    /**\n     * 应用ID\n     */\n    private Long applicationClientId;\n\n    /**\n     * 应用\n     */\n    private String application;\n\n    private String nettyIp;\n    private Integer nettyPort;\n\n    private String hostIp;\n\n    private Integer hostPort;\n\n    private Integer status;\n\n    private Date createTime;\n\n    private Date updateTime;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ConfigItemDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport com.xiao.custom.config.pojo.entity.ConfigItem;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ConfigItemDto\n{\n    //\n    private Long id;\n\n    //配置项KEY\n    private String itemKey;\n\n    //配置项值\n    private String itemValue;\n\n    //配置项描述\n    private String itemDesc;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n\n    //0可用,1不可用\n    private Integer status;\n\n    //应用类型，0通用，1开发环境，2测试环境，3生产环境，4其他。默认通用类型\n    private Integer itemType;\n\n    public static ConfigItem convertToEntity(ConfigItemDto configItemDto)\n    {\n        ConfigItem configItem = null;\n        if (configItemDto != null)\n        {\n            configItem = new ConfigItem();\n            configItem.setCreateTime(configItemDto.getCreateTime());\n            configItem.setItemDesc(configItemDto.getItemDesc());\n            configItem.setItemKey(configItemDto.getItemKey());\n            configItem.setItemValue(configItemDto.getItemValue());\n            configItem.setStatus(configItemDto.getStatus());\n            configItem.setId(configItemDto.getId());\n            configItem.setItemType(configItemDto.getItemType());\n            configItem.setUpdateTime(configItemDto.getUpdateTime());\n        }\n        return configItem;\n    }\n\n    public static ConfigItemDto convertToDto(ConfigItem configItem)\n    {\n        ConfigItemDto configItemDto = null;\n        if (configItem != null)\n        {\n            configItemDto = new ConfigItemDto();\n            configItemDto.setCreateTime(configItem.getCreateTime());\n            configItemDto.setId(configItem.getId());\n            configItemDto.setItemDesc(configItem.getItemDesc());\n            configItemDto.setItemKey(configItem.getItemKey());\n            configItemDto.setItemType(configItem.getItemType());\n            configItemDto.setItemValue(configItem.getItemValue());\n            configItemDto.setStatus(configItem.getStatus());\n            configItemDto.setUpdateTime(configItem.getUpdateTime());\n        }\n        return configItemDto;\n    }\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ConfigItemGroupDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroup;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ConfigItemGroupDto\n{\n    //\n    private Long id;\n\n    //组名称\n    private String groupName;\n\n    //组描述\n    private String groupDesc;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n\n    public static ConfigItemGroup convertToEntity(ConfigItemGroupDto configItemGroupDto)\n    {\n        ConfigItemGroup configItemGroup = null;\n        if (configItemGroupDto != null)\n        {\n            configItemGroup = new ConfigItemGroup();\n            configItemGroup.setCreateTime(configItemGroupDto.getCreateTime());\n            configItemGroup.setGroupDesc(configItemGroupDto.getGroupDesc());\n            configItemGroup.setGroupName(configItemGroupDto.getGroupName());\n            configItemGroup.setId(configItemGroupDto.getId());\n            configItemGroup.setUpdateTime(configItemGroupDto.getUpdateTime());\n        }\n        return configItemGroup;\n    }\n\n    public static ConfigItemGroupDto convertToDto(ConfigItemGroup configItemGroup)\n    {\n        ConfigItemGroupDto dto = null;\n        if (configItemGroup != null)\n        {\n            dto = new ConfigItemGroupDto();\n            dto.setCreateTime(configItemGroup.getCreateTime());\n            dto.setGroupDesc(configItemGroup.getGroupDesc());\n            dto.setGroupName(configItemGroup.getGroupName());\n            dto.setId(configItemGroup.getId());\n            dto.setUpdateTime(configItemGroup.getUpdateTime());\n        }\n        return dto;\n    }\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/RegionDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class RegionDto\n{\n    //\n    private Long id;\n\n    //区域名称\n    private String regionName;\n\n    //区域描述\n    private String regionDesc;\n\n    //创建时间\n    private Date createTime;\n\n    //更新时间\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/dto/ServerHostConfigDto.java",
    "content": "package com.xiao.custom.config.pojo.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ServerHostConfigDto\n{\n    //\n    private Long id;\n\n    //IP地址\n    private String serverHost;\n\n    //服务描述\n    private String serverDesc;\n\n    //关联区域\n    private Long regionId;\n\n    //区域名称\n    private String regionName;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/Application.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Application\n{\n    //\n    private Long id;\n\n    //应用\n    private String application;\n\n    //应用描述\n    private String applicationName;\n\n    //\n    private String label;\n\n    //环境\n    private String profile;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n\n    //所属区域\n    private Long regionId;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ApplicationConfig.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2019/01/07\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ApplicationConfig\n{\n    //\n    private Long id;\n\n    //关联的应用ID\n    private Long applicationId;\n\n    //配置项KEY\n    private String itemKey;\n\n    //配置项值\n    private String itemValue;\n\n    //配置描述\n    private String itemDesc;\n\n    //创建时间\n    private Date createTime;\n\n    //更新时间\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ApplicationItemGroupRelation.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ApplicationItemGroupRelation {\n    //\n    private Long id;\n\n    //应用ID\n    private Long applicationId;\n\n    //配置组ID\n    private Long itemGroupId;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/AuthUser.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.Data;\n\nimport java.sql.Timestamp;\n\n/**\n * @author : JoeTao\n * createAt: 2018/9/14\n */\n@Data\npublic class AuthUser\n{\n    private long id;\n    private String username;\n    private String password;\n    private String nickname;\n    /**\n     * 最后一次重置密码时间\n     */\n    private Timestamp lastResetTime;\n\n    private Role role;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ClientApplication.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.*;\n\nimport java.util.Date;\n\n/**\n * t_client_application\n * Created by Mybatis Generator on 2019/01/29\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@ToString\npublic class ClientApplication {\n    private Long id;\n\n    private String application;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private Integer status;\n\n    private String profile;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ClientHostInfo.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.*;\n\nimport java.util.Date;\n\n/**\n * t_client_host_info\n * Created by Mybatis Generator on 2019/01/29\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@ToString\npublic class ClientHostInfo\n{\n\n    /**\n     * 在线\n     */\n    public static final int ONLINE = 0;\n\n    private Long id;\n\n    private Long clientApplicationId;\n\n    private String hostIp;\n\n    private Integer hostPort;\n\n    private String nettyIp;\n    private Integer nettyPort;\n\n    private Integer status;\n\n    private Date createTime;\n\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ClientInfo.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 配置中心连接的应用客户端信息\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 14:37\n * @since JDK 1.8\n */\n@Data\npublic class ClientInfo\n{\n    private String applicationName;\n    private List<ClientHostInfo> hostInofs;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ConfigItem.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ConfigItem\n{\n    //\n    private Long id;\n\n    //配置项KEY\n    private String itemKey;\n\n    //配置项值\n    private String itemValue;\n\n    //配置项描述\n    private String itemDesc;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n\n    //0可用,1不可用\n    private Integer status;\n\n    //应用类型，0通用，1开发环境，2测试环境，3生产环境，4其他。默认通用类型\n    private Integer itemType;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ConfigItemGroup.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ConfigItemGroup {\n    //\n    private Long id;\n\n    //组名称\n    private String groupName;\n\n    //组描述\n    private String groupDesc;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ConfigItemGroupRelation.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ConfigItemGroupRelation {\n    //\n    private Long id;\n\n    //配置项ID\n    private Long itemId;\n\n    //组ID\n    private Long groupId;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/Region.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Region {\n    //\n    private Long id;\n\n    //区域名称\n    private String regionName;\n\n    //区域描述\n    private String regionDesc;\n\n    //创建时间\n    private Date createTime;\n\n    //更新时间\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/Role.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * @author : JoeTao\n * createAt: 2018/9/17\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Role\n{\n    private Long id;\n    private String name;\n    private String nameZh;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/entity/ServerHostConfig.java",
    "content": "package com.xiao.custom.config.pojo.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ServerHostConfig {\n    //\n    private Long id;\n\n    //IP地址\n    private String serverHost;\n\n    //服务描述\n    private String serverDesc;\n\n    //关联区域\n    private Long regionId;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ApplicationConfigMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.entity.ApplicationConfig;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\n\nimport java.util.List;\n\n/**\n * 应用对应的私有配置属性\n * Created by Mybatis Generator on 2019/01/07\n */\npublic interface ApplicationConfigMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ApplicationConfig record);\n\n    int insertSelective(ApplicationConfig record);\n\n    ApplicationConfig selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ApplicationConfig record);\n\n    int updateByPrimaryKey(ApplicationConfig record);\n\n    /**\n     * [简要描述]:分页查询应用关联的私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param query :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * llxiao  2019/1/7 - 15:27\n     **/\n    List<ApplicationConfigDto> pageQuery(ApplicationConfigQuery query);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ApplicationItemGroupRelationMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\npublic interface ApplicationItemGroupRelationMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ApplicationItemGroupRelation record);\n\n    int insertSelective(ApplicationItemGroupRelation record);\n\n    ApplicationItemGroupRelation selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ApplicationItemGroupRelation record);\n\n    int updateByPrimaryKey(ApplicationItemGroupRelation record);\n\n    /**\n     * [简要描述]:绑定应用与多个配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIdArr :\n     * @param appId :\n     * @return void\n     * jun.liu  2018/11/28 - 14:10\n     **/\n    int batchSave(@Param(\"groupIdArr\") String[] groupIdArr, @Param(\"appId\") Long appId);\n\n    /**\n     * [简要描述]:删除绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIdArr :\n     * @param appId :\n     * @return int\n     * jun.liu  2018/11/28 - 15:41\n     **/\n    int batchDelete(@Param(\"groupIdArr\") String[] groupIdArr, @Param(\"appId\") Long appId);\n\n    /**\n     * [简要描述]:应用ID删除关联配置信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId : 应用ID\n     * @return int\n     * llxiao  2018/12/24 - 10:34\n     **/\n    int deleteByAppId(@Param(\"appId\") Long appId);\n\n    /**\n     * [简要描述]:组ID统计关联的应用数量<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupId :\n     * @return int\n     * llxiao  2019/1/2 - 17:24\n     **/\n    int countByGroupId(String groupId);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ApplicationMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.entity.Application;\nimport com.xiao.custom.config.pojo.query.AppQuery;\n\nimport java.util.List;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\npublic interface ApplicationMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(Application record);\n\n    int insertSelective(Application record);\n\n    Application selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(Application record);\n\n    int updateByPrimaryKey(Application record);\n\n    /**\n     * [简要描述]:根据条件查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.entity.ApplicationConfig>\n     * jun.liu  2018/11/26 - 17:08\n     **/\n    List<ApplicationDto> pageApplicationConfig(AppQuery appQuery);\n\n    /**\n     * [简要描述]:区域ID统计应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param regionId :\n     * @return int\n     * llxiao  2019/1/2 - 17:55\n     **/\n    Integer countByRegionId(Long regionId);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/AuthMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author JoeTao\n * createAt: 2018/9/17\n */\n@Repository\npublic interface AuthMapper\n{\n    /**\n     * 根据用户名查找用户\n     *\n     * @param username\n     * @return\n     */\n    AuthUser findByUsername(@Param(\"username\") String username);\n\n    /**\n     * 创建新用户\n     *\n     * @param userDetail\n     */\n    void insert(AuthUser userDetail);\n\n    /**\n     * 创建用户角色\n     *\n     * @param userId\n     * @param roleId\n     * @return\n     */\n    int insertRole(@Param(\"userId\") long userId, @Param(\"roleId\") long roleId);\n\n    /**\n     * 根据角色id查找角色\n     *\n     * @param roleId\n     * @return\n     */\n    Role findRoleById(@Param(\"roleId\") long roleId);\n\n    /**\n     * 根据用户id查找该用户角色\n     *\n     * @param userId\n     * @return\n     */\n    Role findRoleByUserId(@Param(\"userId\") long userId);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ClientApplicationMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.entity.ClientApplication;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2019/01/29\n */\npublic interface ClientApplicationMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ClientApplication record);\n\n    int insertSelective(ClientApplication record);\n\n    ClientApplication selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ClientApplication record);\n\n    int updateByPrimaryKey(ClientApplication record);\n\n    /**\n     * [简要描述]:修改应用状态<br/>\n     * [详细描述]:<br/>\n     *\n     * @param application :\n     * @param profile :\n     * @param status :\n     * @return void\n     * llxiao  2019/1/30 - 16:11\n     **/\n    void updateStatus(@Param(\"application\") String application, @Param(\"profile\") String profile,\n            @Param(\"status\") int status);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ClientHostInfoMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.entity.ClientHostInfo;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n * Created by Mybatis Generator on 2019/01/29\n */\npublic interface ClientHostInfoMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ClientHostInfo record);\n\n    int insertSelective(ClientHostInfo record);\n\n    ClientHostInfo selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ClientHostInfo record);\n\n    int updateByPrimaryKey(ClientHostInfo record);\n\n    /**\n     * [简要描述]:应用名称+环境查询已连接的应用信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param application :\n     * @param profile :\n     * @return java.util.List<com.winner.config.center.pojo.db.entity.ClientHostInfo>\n     * llxiao  2019/1/30 - 11:15\n     **/\n    List<ClientHostInfo> queryByApplication(@Param(\"application\") String application, @Param(\"profile\") String profile);\n\n    /**\n     * [简要描述]:修改服务状态<br/>\n     * [详细描述]:0在线，1下线<br/>\n     *\n     * @param id :\n     * @param status:\n     * @return int\n     * llxiao  2019/1/30 - 14:18\n     **/\n    int updateStatus(@Param(\"id\") Long id, @Param(\"status\") int status);\n\n    /**\n     * [简要描述]:分页查询客户端连接信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param query : 查询条件\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ClientHostInfoDto>\n     * llxiao  2019/3/27 - 14:46\n     **/\n    List<ClientHostInfoDto> pageQuery(ClientHostInfoQuery query);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ConfigItemGroupMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroup;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\npublic interface ConfigItemGroupMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ConfigItemGroup record);\n\n    int insertSelective(ConfigItemGroup record);\n\n    ConfigItemGroup selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ConfigItemGroup record);\n\n    int updateByPrimaryKey(ConfigItemGroup record);\n\n    /**\n     * [简要描述]:通过条件查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/27 - 8:34\n     **/\n    List<ConfigItemGroupDto> pageConfigItemGroup(ConfigItemGroupQuery configItemGroupQuery);\n\n    /**\n     * [简要描述]:获取已绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:03\n     **/\n    List<ConfigItemGroupDto> pageRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery);\n\n    /**\n     * [简要描述]:获取未绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:32\n     **/\n    List<ConfigItemGroupDto> pageNotRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * jun.liu  2018/12/21 - 15:19\n     **/\n    int batchDelete(@Param(\"idArr\") String[] idArr);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ConfigItemGroupRelationMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\npublic interface ConfigItemGroupRelationMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ConfigItemGroupRelation record);\n\n    int insertSelective(ConfigItemGroupRelation record);\n\n    ConfigItemGroupRelation selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ConfigItemGroupRelation record);\n\n    int updateByPrimaryKey(ConfigItemGroupRelation record);\n\n    /**\n     * [简要描述]:批量绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemIdArr :\n     * @param groupId :\n     * @return int\n     * jun.liu  2018/11/28 - 9:48\n     **/\n    int batchSave(@Param(\"itemIdArr\") String[] itemIdArr, @Param(\"groupId\") Long groupId);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemIdArr :\n     * @param groupId :\n     * @return int\n     * jun.liu  2018/11/28 - 15:13\n     **/\n    int batchDelete(@Param(\"itemIdArr\") String[] itemIdArr, @Param(\"groupId\") Long groupId);\n\n    /**\n     * [简要描述]:通过itemId批量删除配置项和配置组关联关系<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * jun.liu  2018/12/24 - 15:50\n     **/\n    int batchDeleteByItemId(@Param(\"idArr\") String[] idArr);\n\n    /**\n     * [简要描述]:通过groupId批量删除配置项和配置组关联关系<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return void\n     * jun.liu  2018/12/25 - 8:59\n     **/\n    int batchDeleteByGroupId(@Param(\"idArr\") String[] idArr);\n\n    /**\n     * [简要描述]:统计配置项关联的配置组的数据<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemId :\n     * @return int\n     * llxiao  2019/1/2 - 17:38\n     **/\n    int countByItemId(String itemId);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ConfigItemMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItem;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\npublic interface ConfigItemMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ConfigItem record);\n\n    int insertSelective(ConfigItem record);\n\n    ConfigItem selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ConfigItem record);\n\n    int updateByPrimaryKey(ConfigItem record);\n\n    /**\n     * [简要描述]:通过条件查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/27 - 9:40\n     **/\n    List<ConfigItemDto> pageConfigItem(ConfigItemQuery configItemQuery);\n\n    /**\n     * [简要描述]:分页获取已关联group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/27 - 17:05\n     **/\n    List<ConfigItemDto> pageRefConfigItemWithGroup(ConfigItemQuery configItemQuery);\n\n    /**\n     * [简要描述]:分页获取未关联group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/28 - 10:04\n     **/\n    List<ConfigItemDto> pageNotRefConfigItemWithGroup(ConfigItemQuery configItemQuery);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * jun.liu  2018/12/20 - 19:17\n     **/\n    int batchDelete(@Param(\"idArr\") String[] idArr);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/RegionMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.entity.Region;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n * Created by Mybatis Generator on 2018/11/23\n */\npublic interface RegionMapper\n{\n    int deleteByPrimaryKey(Long id);\n\n    int insert(Region record);\n\n    int insertSelective(Region record);\n\n    Region selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(Region record);\n\n    int updateByPrimaryKey(Region record);\n\n    /**\n     * [简要描述]:通过条件查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param regionQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.RegionDto>\n     * jun.liu  2018/11/26 - 17:27\n     **/\n    List<RegionDto> pageRegion(RegionQuery regionQuery);\n\n    /**\n     * [简要描述]:查询所有的区域\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.RegionDto>\n     * mjye  2018/12/21 - 16:51\n     **/\n    List<RegionDto> selectRegion();\n\n    /**\n     * [简要描述]:批量删除\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * mjye  2018/12/25 - 10:37\n     **/\n    int batchDelete(@Param(\"idArr\") String[] idArr);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/mapper/ServerHostConfigMapper.java",
    "content": "package com.xiao.custom.config.pojo.mapper;\n\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.entity.ServerHostConfig;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\n\nimport java.util.List;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\npublic interface ServerHostConfigMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ServerHostConfig record);\n\n    int insertSelective(ServerHostConfig record);\n\n    ServerHostConfig selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ServerHostConfig record);\n\n    int updateByPrimaryKey(ServerHostConfig record);\n\n    /**\n     * [简要描述]:通过条件查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param serverHostConfigQuery :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ServerHostConfigDto>\n     * jun.liu  2018/11/27 - 9:51\n     **/\n    List<ServerHostConfigDto> pageServerHostConfig(ServerHostConfigQuery serverHostConfigQuery);\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/AppQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 16:51\n * @since JDK 1.8\n */\n@Data\npublic class AppQuery extends BaseQuery\n{\n    //应用\n    private String application;\n\n    //应用描述\n    private String applicationName;\n\n    //环境\n    private String profile;\n\n    //创建开始时间\n    private Data startTime;\n    //创建结束时间\n    private Data endTime;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/ApplicationConfigQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/7 15:18\n * @since JDK 1.8\n */\n@Data\npublic class ApplicationConfigQuery extends BaseQuery\n{\n    private Long applicationId;\n    private String itemKey;\n    private String itemDesc;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/ClientHostInfoQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]: 配置中心客户端连接列查询条件\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 14:21\n * @since JDK 1.8\n */\n@Data\npublic class ClientHostInfoQuery extends BaseQuery\n{\n    /**\n     * IP查询\n     */\n    private String hostIp;\n\n    /**\n     * 状态查询\n     */\n    private Integer status;\n\n    /**\n     * 应用查询\n     */\n    private String application;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/ConfigItemGroupQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:53\n * @since JDK 1.8\n */\n@Data\npublic class ConfigItemGroupQuery extends BaseQuery\n{\n    //组名称\n    private String groupName;\n\n    private String groupDesc;\n\n    private String createTime;\n\n    private String updateTime;\n\n    private Long appId;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/ConfigItemQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:36\n * @since JDK 1.8\n */\n@Data\npublic class ConfigItemQuery extends BaseQuery\n{\n    //配置项KEY\n    private String itemKey;\n\n    //配置项值\n    private String itemValue;\n\n    private String itemDesc;\n\n    //0可用,1不可用\n    private Integer status;\n\n    //应用类型，0通用，1开发环境，2测试环境，3生产环境，4其他。默认通用类型\n    private Integer itemType;\n\n    private String createTime;\n\n    private String updateTime;\n\n    private Long groupId;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/RegionQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:24\n * @since JDK 1.8\n */\n@Data\npublic class RegionQuery extends BaseQuery\n{\n    //区域名称\n    private String regionName;\n    //开始时间\n    private Date createTime;\n    //结束时间\n    private Date updateTime;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/java/com/xiao/custom/config/pojo/query/ServerHostConfigQuery.java",
    "content": "package com.xiao.custom.config.pojo.query;\n\nimport com.xiao.custom.config.pojo.common.BaseQuery;\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:47\n * @since JDK 1.8\n */\n@Data\npublic class ServerHostConfigQuery extends BaseQuery\n{\n    //IP地址\n    private String serverHost;\n\n    //服务描述\n    private String serverDesc;\n\n    //开始时间\n    private String createTime;\n    //结束时间\n    private String updateTime;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ApplicationConfigMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ApplicationConfigMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ApplicationConfig\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"application_id\" property=\"applicationId\" jdbcType=\"BIGINT\"/>\n        <result column=\"item_key\" property=\"itemKey\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_value\" property=\"itemValue\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_desc\" property=\"itemDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, application_id, item_key, item_value, item_desc, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_application_config\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_application_config\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationConfig\">\n    insert into t_application_config (id, application_id, item_key, \n      item_value, item_desc, create_time, \n      update_time)\n    values (#{id,jdbcType=BIGINT}, #{applicationId,jdbcType=BIGINT}, #{itemKey,jdbcType=VARCHAR}, \n      #{itemValue,jdbcType=VARCHAR}, #{itemDesc,jdbcType=VARCHAR}, now(),\n      #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationConfig\">\n        insert into t_application_config\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"applicationId != null\">\n                application_id,\n            </if>\n            <if test=\"itemKey != null\">\n                item_key,\n            </if>\n            <if test=\"itemValue != null\">\n                item_value,\n            </if>\n            <if test=\"itemDesc != null\">\n                item_desc,\n            </if>\n            create_time,\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"applicationId != null\">\n                #{applicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemKey != null\">\n                #{itemKey,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemValue != null\">\n                #{itemValue,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemDesc != null\">\n                #{itemDesc,jdbcType=VARCHAR},\n            </if>\n            now(),\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationConfig\">\n        update t_application_config\n        <set>\n            <if test=\"applicationId != null\">\n                application_id = #{applicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemKey != null\">\n                item_key = #{itemKey,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemValue != null\">\n                item_value = #{itemValue,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemDesc != null\">\n                item_desc = #{itemDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n                update_time = now(),\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationConfig\">\n    update t_application_config\n    set application_id = #{applicationId,jdbcType=BIGINT},\n      item_key = #{itemKey,jdbcType=VARCHAR},\n      item_value = #{itemValue,jdbcType=VARCHAR},\n      item_desc = #{itemDesc,jdbcType=VARCHAR},\n      update_time = now()\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <!-- 分页查询应用的私有配置 -->\n    <select id=\"pageQuery\" resultType=\"com.xiao.custom.config.pojo.dto.ApplicationConfigDto\"\n            parameterType=\"com.xiao.custom.config.pojo.query.ApplicationConfigQuery\">\n        SELECT t.id,t.application_id as applicationId,t.item_key as itemKey,\n        t.item_value as itemValue,t.item_desc as itemDesc,t.create_time as createTime,t.update_time as updateTime\n        FROM t_application_config t\n        where t.application_id = #{applicationId,jdbcType=BIGINT}\n        <if test=\"itemKey != null and itemKey !=''\">\n            and t.item_key like concat(concat('%',#{itemKey,jdbcType=VARCHAR}),'%')\n        </if>\n        <if test=\"itemDesc !=  null and itemDesc != ''\">\n            and t.item_desc like concat(concat('%',#{itemDesc,jdbcType=VARCHAR}),'%')\n        </if>\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ApplicationItemGroupRelationMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ApplicationItemGroupRelationMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"application_id\" property=\"applicationId\" jdbcType=\"BIGINT\"/>\n        <result column=\"item_group_id\" property=\"itemGroupId\" jdbcType=\"BIGINT\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, application_id, item_group_id\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_application_item_group_relation\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_application_item_group_relation\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation\"\n            useGeneratedKeys=\"true\" keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_application_item_group_relation (id, application_id, item_group_id\n      )\n    values (#{id,jdbcType=BIGINT}, #{applicationId,jdbcType=BIGINT}, #{itemGroupId,jdbcType=BIGINT}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation\">\n        insert into t_application_item_group_relation\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"applicationId != null\">\n                application_id,\n            </if>\n            <if test=\"itemGroupId != null\">\n                item_group_id,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"applicationId != null\">\n                #{applicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemGroupId != null\">\n                #{itemGroupId,jdbcType=BIGINT},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\"\n            parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation\">\n        update t_application_item_group_relation\n        <set>\n            <if test=\"applicationId != null\">\n                application_id = #{applicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemGroupId != null\">\n                item_group_id = #{itemGroupId,jdbcType=BIGINT},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\"\n            parameterType=\"com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation\">\n    update t_application_item_group_relation\n    set application_id = #{applicationId,jdbcType=BIGINT},\n      item_group_id = #{itemGroupId,jdbcType=BIGINT}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <insert id=\"batchSave\">\n        insert into t_application_item_group_relation (application_id, item_group_id)\n        values\n        <foreach collection=\"groupIdArr\" item=\"groupId\" separator=\",\">\n            (#{appId,jdbcType=BIGINT}, #{groupId,jdbcType=BIGINT})\n        </foreach>\n    </insert>\n\n    <delete id=\"batchDelete\">\n        delete from t_application_item_group_relation where application_id = #{appId} and item_group_id in\n        <foreach collection=\"groupIdArr\" item=\"groupId\" separator=\",\" open=\"(\" close=\")\">\n            #{groupId}\n        </foreach>\n    </delete>\n\n    <!-- 应用ID删除关联的配置组信息 -->\n    <delete id=\"deleteByAppId\">\n        delete from t_application_item_group_relation where application_id = #{appId}\n    </delete>\n\n    <!-- 应用组ID统计使用的应用数量 -->\n    <select id=\"countByGroupId\" resultType=\"java.lang.Integer\">\n        select count(id) from t_application_item_group_relation where item_group_id = #{groupId}\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ApplicationMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.winner.config.center.pojo.db.mapper.ApplicationMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.winner.config.center.pojo.db.entity.Application\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"application\" property=\"application\" jdbcType=\"VARCHAR\"/>\n        <result column=\"application_name\" property=\"applicationName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"label\" property=\"label\" jdbcType=\"VARCHAR\"/>\n        <result column=\"profile\" property=\"profile\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"region_id\" property=\"regionId\" jdbcType=\"BIGINT\"/>\n    </resultMap>\n\n    <resultMap id=\"DtoResultMap\" type=\"com.winner.config.center.pojo.db.dto.ApplicationDto\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"application\" property=\"application\" jdbcType=\"VARCHAR\"/>\n        <result column=\"application_name\" property=\"applicationName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"label\" property=\"label\" jdbcType=\"VARCHAR\"/>\n        <result column=\"profile\" property=\"profile\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"region_id\" property=\"regionId\" jdbcType=\"BIGINT\"/>\n        <result column=\"region_name\" property=\"regionName\" jdbcType=\"VARCHAR\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, application, application_name, label, profile, create_time, update_time, region_id\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_application\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_application\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.winner.config.center.pojo.db.entity.Application\"\n            useGeneratedKeys=\"true\" keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_application (id, application, application_name,\n      label, profile, create_time, \n      update_time, region_id)\n    values (#{id,jdbcType=BIGINT}, #{application,jdbcType=VARCHAR}, #{applicationName,jdbcType=VARCHAR}, \n      #{label,jdbcType=VARCHAR}, #{profile,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateTime,jdbcType=TIMESTAMP}, #{regionId,jdbcType=BIGINT})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.winner.config.center.pojo.db.entity.Application\">\n        insert into t_application\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"application != null\">\n                application,\n            </if>\n            <if test=\"applicationName != null\">\n                application_name,\n            </if>\n            <if test=\"label != null\">\n                label,\n            </if>\n            <if test=\"profile != null\">\n                profile,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"regionId != null\">\n                region_id,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"application != null\">\n                #{application,jdbcType=VARCHAR},\n            </if>\n            <if test=\"applicationName != null\">\n                #{applicationName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"label != null\">\n                #{label,jdbcType=VARCHAR},\n            </if>\n            <if test=\"profile != null\">\n                #{profile,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"regionId != null\">\n                #{regionId,jdbcType=BIGINT},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.winner.config.center.pojo.db.entity.Application\">\n        update t_application\n        <set>\n            <if test=\"application != null\">\n                application = #{application,jdbcType=VARCHAR},\n            </if>\n            <if test=\"applicationName != null\">\n                application_name = #{applicationName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"label != null\">\n                label = #{label,jdbcType=VARCHAR},\n            </if>\n            <if test=\"profile != null\">\n                profile = #{profile,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"regionId != null\">\n                region_id = #{regionId,jdbcType=BIGINT},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.winner.config.center.pojo.db.entity.Application\">\n    update t_application\n    set application = #{application,jdbcType=VARCHAR},\n      application_name = #{applicationName,jdbcType=VARCHAR},\n      label = #{label,jdbcType=VARCHAR},\n      profile = #{profile,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      region_id = #{regionId,jdbcType=BIGINT}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <select id=\"pageApplicationConfig\" resultMap=\"DtoResultMap\"\n            parameterType=\"com.winner.config.center.pojo.db.query.AppQuery\">\n        SELECT app.*,r.region_name FROM t_application app left join t_region r on app.region_id = r.id\n        where 1 = 1\n        <if test=\"application != null and application != ''\">\n            and app.application like concat(concat('%',#{application,jdbcType=VARCHAR}),'%')\n        </if>\n        <if test=\"profile != null and profile !=''\">\n            and profile = #{profile,jdbcType=VARCHAR}\n        </if>\n        <if test=\"applicationName != null and applicationName != ''\">\n            and application_name like concat(concat('%',#{applicationName,jdbcType=VARCHAR}),'%')\n        </if>\n        <if test=\"startTime != null and startTime != ''\">\n            and create_time &gt;= #{startTime}\n        </if>\n        <if test=\"endTime != null and endTime != ''\">\n            and create_time &lt;= #{endTime}\n        </if>\n        order by id desc\n    </select>\n\n    <!-- 区域ID统计应用 -->\n    <select id=\"countByRegionId\" resultType=\"java.lang.Integer\">\n        select count(*) from t_application where region_id = #{regionId}\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/AuthMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.AuthMapper\">\n    <select id=\"findByUsername\" resultType=\"com.xiao.custom.config.pojo.entity.AuthUser\">\n        SELECT id,nickname, username, password from t_sys_user where username = #{username};\n    </select>\n\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.AuthUser\" useGeneratedKeys=\"true\"\n            keyProperty=\"id\">\n        insert into t_sys_user (username, password,nickname) VALUES (#{username}, #{password},#{nikename});\n    </insert>\n\n    <insert id=\"insertRole\">\n        insert into t_sys_user_role (user_id, role_id) VALUES (#{userId}, #{roleId});\n    </insert>\n\n    <select id=\"findRoleById\" resultType=\"com.xiao.custom.config.pojo.entity.Role\">\n      select id, name, nameZh from t_sys_role where id = #{roleId}\n    </select>\n\n    <select id=\"findRoleByUserId\" resultType=\"com.xiao.custom.config.pojo.entity.Role\">\n        select * from t_sys_role where id in (SELECT role_id from t_sys_user_role where user_id = #{userId});\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ClientApplicationMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ClientApplicationMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ClientApplication\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"application\" property=\"application\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"profile\" property=\"profile\" jdbcType=\"VARCHAR\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, application, create_time, update_time, status, profile\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_client_application\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_client_application\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientApplication\">\n    insert into t_client_application (id, application, create_time, \n      update_time, status, profile\n      )\n    values (#{id,jdbcType=BIGINT}, #{application,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}, #{profile,jdbcType=VARCHAR}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientApplication\">\n        insert into t_client_application\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"application != null\">\n                application,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"status != null\">\n                status,\n            </if>\n            <if test=\"profile != null\">\n                profile,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"application != null\">\n                #{application,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"status != null\">\n                #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"profile != null\">\n                #{profile,jdbcType=VARCHAR},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientApplication\">\n        update t_client_application\n        <set>\n            <if test=\"application != null\">\n                application = #{application,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"profile != null\">\n                profile = #{profile,jdbcType=VARCHAR},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientApplication\">\n    update t_client_application\n    set application = #{application,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=INTEGER},\n      profile = #{profile,jdbcType=VARCHAR}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n    <!-- 标记应用已下线 -->\n    <update id=\"updateStatus\">\n        update t_client_application set status = #{status},update_time = now() where application = #{application} and profile = #{profile}\n    </update>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ClientHostInfoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ClientHostInfoMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ClientHostInfo\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"client_application_id\" property=\"clientApplicationId\" jdbcType=\"BIGINT\"/>\n        <result column=\"host_ip\" property=\"hostIp\" jdbcType=\"VARCHAR\"/>\n        <result column=\"host_port\" property=\"hostPort\" jdbcType=\"INTEGER\"/>\n        <result column=\"netty_ip\" property=\"nettyIp\" jdbcType=\"VARCHAR\"/>\n        <result column=\"netty_port\" property=\"nettyPort\" jdbcType=\"INTEGER\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n\n    <sql id=\"Base_Column_List\">\n    id, client_application_id, host_ip, host_port,netty_ip,netty_port, status, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_client_host_info\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <!-- 查询所有应用相关的数据 -->\n    <select id=\"queryByApplication\" resultMap=\"BaseResultMap\">\n        select h.* from t_client_host_info h left join t_client_application a on h.client_application_id = a.id\n        where a.application = #{application} and a.profile = #{profile} and h.status = 0 and a.status = 0;\n    </select>\n\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_client_host_info\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientHostInfo\">\n    insert into t_client_host_info (id, client_application_id, host_ip, \n      host_port, status, create_time, \n      update_time)\n    values (#{id,jdbcType=BIGINT}, #{clientApplicationId,jdbcType=BIGINT}, #{hostIp,jdbcType=VARCHAR}, \n      #{hostPort,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientHostInfo\">\n        insert into t_client_host_info\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"clientApplicationId != null\">\n                client_application_id,\n            </if>\n            <if test=\"hostIp != null\">\n                host_ip,\n            </if>\n            <if test=\"hostPort != null\">\n                host_port,\n            </if>\n            <if test=\"status != null\">\n                status,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"clientApplicationId != null\">\n                #{clientApplicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"hostIp != null\">\n                #{hostIp,jdbcType=VARCHAR},\n            </if>\n            <if test=\"hostPort != null\">\n                #{hostPort,jdbcType=INTEGER},\n            </if>\n            <if test=\"status != null\">\n                #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientHostInfo\">\n        update t_client_host_info\n        <set>\n            <if test=\"clientApplicationId != null\">\n                client_application_id = #{clientApplicationId,jdbcType=BIGINT},\n            </if>\n            <if test=\"hostIp != null\">\n                host_ip = #{hostIp,jdbcType=VARCHAR},\n            </if>\n            <if test=\"hostPort != null\">\n                host_port = #{hostPort,jdbcType=INTEGER},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ClientHostInfo\">\n    update t_client_host_info\n    set client_application_id = #{clientApplicationId,jdbcType=BIGINT},\n      host_ip = #{hostIp,jdbcType=VARCHAR},\n      host_port = #{hostPort,jdbcType=INTEGER},\n      status = #{status,jdbcType=INTEGER},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = now()\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <!-- 主键更新状态，标记为下线 -->\n    <update id=\"updateStatus\">\n        update t_client_host_info set update_time = now(),status = #{status} where id = #{id}\n    </update>\n\n    <!-- 查询客户端列表 -->\n    <select id=\"pageQuery\" parameterType=\"com.xiao.custom.config.pojo.query.ClientHostInfoQuery\"\n            resultType=\"com.xiao.custom.config.pojo.dto.ClientHostInfoDto\">\n        SELECT c.id,c.client_application_id as applicationClientId,c.host_ip as hostIp,c.host_port as\n        hostPort,c.netty_ip as nettyPort,c.netty_port as nettyPort, c.status,c.create_time as createTime,c.update_time as updateTime,app.application\n        FROM t_client_host_info c,t_client_application app\n        where c.client_application_id = app.id\n        <if test=\"hostIp != null and hostIp != ''\">\n            and c.host_ip = #{hostIp}\n        </if>\n        <if test=\"application != null and application != ''\">\n            and app.application = #{application}\n        </if>\n        <if test=\"status != null\">\n            and c.status = #{status}\n        </if>\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ConfigItemGroupMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ConfigItemGroupMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ConfigItemGroup\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_name\" property=\"groupName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"group_desc\" property=\"groupDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n\n    <resultMap id=\"DtoResultMap\" type=\"com.xiao.custom.config.pojo.dto.ConfigItemGroupDto\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_name\" property=\"groupName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"group_desc\" property=\"groupDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, group_name, group_desc, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_config_item_group\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_config_item_group\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroup\" useGeneratedKeys=\"true\"\n            keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_config_item_group (id, group_name, group_desc, \n      create_time, update_time)\n    values (#{id,jdbcType=BIGINT}, #{groupName,jdbcType=VARCHAR}, #{groupDesc,jdbcType=VARCHAR}, \n      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroup\">\n        insert into t_config_item_group\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"groupName != null\">\n                group_name,\n            </if>\n            <if test=\"groupDesc != null\">\n                group_desc,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"groupName != null\">\n                #{groupName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"groupDesc != null\">\n                #{groupDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroup\">\n        update t_config_item_group\n        <set>\n            <if test=\"groupName != null\">\n                group_name = #{groupName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"groupDesc != null\">\n                group_desc = #{groupDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroup\">\n    update t_config_item_group\n    set group_name = #{groupName,jdbcType=VARCHAR},\n      group_desc = #{groupDesc,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <select id=\"pageConfigItemGroup\" resultMap=\"DtoResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_config_item_group\n        <where>\n            <if test=\"groupName != null and groupName!=''\">\n                and group_name like '%${groupName}%'\n            </if>\n            <if test=\"groupDesc != null and groupDesc!=''\">\n                and group_desc like '%${groupDesc}%'\n            </if>\n            <if test=\"createTime != null and createTime != ''\">\n                and create_time like '%${createTime}%'\n            </if>\n            <if test=\"updateTime != null and updateTime != ''\">\n                and update_time like '%${updateTime}%'\n            </if>\n        </where>\n    </select>\n\n    <select id=\"pageRefGroupWithApp\" resultMap=\"DtoResultMap\">\n        select t1.id, t1.group_name, t1.group_desc,\n        t1.create_time, t1.update_time from t_config_item_group t1 left join\n        t_application_item_group_relation t2 on t2.item_group_id = t1.id left join\n        t_application t3 on t3.id = t2.application_id\n        <where>\n            <if test=\"groupName != null and groupName != ''\">\n                and t1.group_name like '%${groupName}'\n            </if>\n            <if test=\"createTime != null and createTime != ''\">\n                and t1.create_time = '%${createTime}%'\n            </if>\n            <if test=\"appId != null\">\n                and t3.id = #{appId}\n            </if>\n        </where>\n    </select>\n\n    <select id=\"pageNotRefGroupWithApp\" resultMap=\"DtoResultMap\">\n        select * from t_config_item_group\n        where id not in (\n        select item_group_id from t_application_item_group_relation\n        <where>\n            <if test=\"appId != null\">\n                and application_id = #{appId}\n            </if>\n        </where>\n        )\n        <if test=\"groupName != null and groupName != ''\">\n            and group_name like '%${groupName}'\n        </if>\n        <if test=\"createTime != null and createTime != ''\">\n            and create_time = '%${createTime}%'\n        </if>\n    </select>\n\n    <delete id=\"batchDelete\">\n        delete from t_config_item_group where id in\n        <foreach collection=\"idArr\" separator=\",\" item=\"id\" open=\"(\" close=\")\">\n            #{id}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ConfigItemGroupRelationMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ConfigItemGroupRelationMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"item_id\" property=\"itemId\" jdbcType=\"BIGINT\"/>\n        <result column=\"group_id\" property=\"groupId\" jdbcType=\"BIGINT\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, item_id, group_id\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_config_item_group_relation\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_config_item_group_relation\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation\"\n            useGeneratedKeys=\"true\" keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_config_item_group_relation (id, item_id, group_id\n      )\n    values (#{id,jdbcType=BIGINT}, #{itemId,jdbcType=BIGINT}, #{groupId,jdbcType=BIGINT}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation\">\n        insert into t_config_item_group_relation\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"itemId != null\">\n                item_id,\n            </if>\n            <if test=\"groupId != null\">\n                group_id,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemId != null\">\n                #{itemId,jdbcType=BIGINT},\n            </if>\n            <if test=\"groupId != null\">\n                #{groupId,jdbcType=BIGINT},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\"\n            parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation\">\n        update t_config_item_group_relation\n        <set>\n            <if test=\"itemId != null\">\n                item_id = #{itemId,jdbcType=BIGINT},\n            </if>\n            <if test=\"groupId != null\">\n                group_id = #{groupId,jdbcType=BIGINT},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation\">\n    update t_config_item_group_relation\n    set item_id = #{itemId,jdbcType=BIGINT},\n      group_id = #{groupId,jdbcType=BIGINT}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <insert id=\"batchSave\">\n        insert into t_config_item_group_relation(item_id, group_id)\n        values\n        <foreach collection=\"itemIdArr\" item=\"itemId\" separator=\",\">\n            (#{itemId},#{groupId})\n        </foreach>\n    </insert>\n\n    <delete id=\"batchDelete\">\n        delete from t_config_item_group_relation where group_id = #{groupId} and item_id in\n        <foreach collection=\"itemIdArr\" item=\"itemId\" separator=\",\" open=\"(\" close=\")\">\n            #{itemId}\n        </foreach>\n    </delete>\n\n    <delete id=\"batchDeleteByItemId\">\n        delete from t_config_item_group_relation where item_id in\n        <foreach collection=\"idArr\" item=\"itemId\" separator=\",\" open=\"(\" close=\")\">\n            #{itemId}\n        </foreach>\n    </delete>\n\n    <delete id=\"batchDeleteByGroupId\">\n        delete from t_config_item_group_relation where group_id in\n        <foreach collection=\"idArr\" item=\"groupId\" separator=\",\" open=\"(\" close=\")\">\n            #{groupId}\n        </foreach>\n    </delete>\n\n    <!-- 统计配置项关联的配置项组的数量 -->\n    <select id=\"countByItemId\" resultType=\"java.lang.Integer\">\n        select count(id) from t_config_item_group_relation where item_id = #{itemId};\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ConfigItemMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ConfigItemMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ConfigItem\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"item_key\" property=\"itemKey\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_value\" property=\"itemValue\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_desc\" property=\"itemDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"item_type\" property=\"itemType\" jdbcType=\"INTEGER\"/>\n    </resultMap>\n\n    <resultMap id=\"DtoResultMap\" type=\"com.xiao.custom.config.pojo.dto.ConfigItemDto\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"item_key\" property=\"itemKey\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_value\" property=\"itemValue\" jdbcType=\"VARCHAR\"/>\n        <result column=\"item_desc\" property=\"itemDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"INTEGER\"/>\n        <result column=\"item_type\" property=\"itemType\" jdbcType=\"INTEGER\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, item_key, item_value, item_desc, create_time, update_time, status, item_type\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_config_item\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_config_item\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItem\" useGeneratedKeys=\"true\"\n            keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_config_item (id, item_key, item_value, \n      item_desc, create_time, update_time, \n      status,item_type)\n    values (#{id,jdbcType=BIGINT}, #{itemKey,jdbcType=VARCHAR}, #{itemValue,jdbcType=VARCHAR}, \n      #{itemDesc,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, \n      #{status,jdbcType=INTEGER}, #{itemType,jdbcType=INTEGER})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItem\">\n        insert into t_config_item\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"itemKey != null\">\n                item_key,\n            </if>\n            <if test=\"itemValue != null\">\n                item_value,\n            </if>\n            <if test=\"itemDesc != null\">\n                item_desc,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"status != null\">\n                status,\n            </if>\n            <if test=\"itemType != null\">\n                item_type,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"itemKey != null\">\n                #{itemKey,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemValue != null\">\n                #{itemValue,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemDesc != null\">\n                #{itemDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"status != null\">\n                #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"itemType != null\">\n                #{itemType,jdbcType=INTEGER},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItem\">\n        update t_config_item\n        <set>\n            <if test=\"itemKey != null\">\n                item_key = #{itemKey,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemValue != null\">\n                item_value = #{itemValue,jdbcType=VARCHAR},\n            </if>\n            <if test=\"itemDesc != null\">\n                item_desc = #{itemDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"status != null\">\n                status = #{status,jdbcType=INTEGER},\n            </if>\n            <if test=\"itemType != null\">\n                item_type = #{itemType,jdbcType=INTEGER},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ConfigItem\">\n    update t_config_item\n    set item_key = #{itemKey,jdbcType=VARCHAR},\n      item_value = #{itemValue,jdbcType=VARCHAR},\n      item_desc = #{itemDesc,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=INTEGER},\n      item_type = #{itemType,jdbcType=INTEGER}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <select id=\"pageConfigItem\" resultMap=\"DtoResultMap\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_config_item\n        <where>\n            <if test=\"itemKey != null and itemKey!=''\">\n                and item_key like '%${itemKey}%'\n            </if>\n            <if test=\"itemValue != null and itemValue!=''\">\n                and item_value like '%${itemValue}%'\n            </if>\n            <if test=\"itemDesc != null and itemDesc!=''\">\n                and item_desc like '%${itemDesc}%'\n            </if>\n            <if test=\"status != null\">\n                and status = #{status}\n            </if>\n            <if test=\"itemType != null\">\n                and item_type = #{itemType}\n            </if>\n            <if test=\"createTime != null and createTime != ''\">\n                and create_time like '%${createTime}%'\n            </if>\n            <if test=\"updateTime != null and updateTime != ''\">\n                and update_time like '%${updateTime}%'\n            </if>\n        </where>\n    </select>\n\n    <select id=\"pageRefConfigItemWithGroup\" resultMap=\"DtoResultMap\">\n        select t1.id, t1.item_key, t1.item_value, t1.item_desc, t1.create_time,\n        t1.update_time, t1.status, t1.item_type\n        from t_config_item t1 left join t_config_item_group_relation t2 on t2.item_id = t1.id\n        left join t_config_item_group t3 on t3.id = t2.group_id\n        <where>\n            <if test=\"itemKey != null and itemKey != ''\">\n                and t1.item_key like '%${itemKey}%'\n            </if>\n            <if test=\"createTime != null and createTime != ''\">\n                and t1.create_time like '%${createTime}%'\n            </if>\n            <if test=\"updateTime != null and updateTime != ''\">\n                and t1.update_time like '%${updateTime}%'\n            </if>\n            <if test=\"groupId != null\">\n                and t3.id = #{groupId}\n            </if>\n        </where>\n    </select>\n\n    <select id=\"pageNotRefConfigItemWithGroup\" resultMap=\"DtoResultMap\">\n        select t1.id, t1.item_key, t1.item_value, t1.item_desc, t1.create_time,\n        t1.update_time, t1.status, t1.item_type\n        from t_config_item t1 where t1.id not in (select t2.item_id from t_config_item_group_relation t2\n        <where>\n            <if test=\"groupId != null\">\n                and t2.group_id = #{groupId}\n            </if>\n        </where>\n        )\n        <if test=\"itemKey != null and itemKey != ''\">\n            and t1.item_key like '%${itemKey}%'\n        </if>\n        <if test=\"createTime != null and createTime != ''\">\n            and t1.create_time like '%${createTime}%'\n        </if>\n        <if test=\"updateTime != null and updateTime != ''\">\n            and t1.update_time like '%${updateTime}%'\n        </if>\n    </select>\n\n    <update id=\"batchDelete\">\n        delete from t_config_item where id in\n        <foreach collection=\"idArr\" item=\"id\" separator=\",\" index=\"index\" open=\"(\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/RegionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.winner.config.center.pojo.db.mapper.RegionMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.winner.config.center.pojo.db.entity.Region\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"region_name\" property=\"regionName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"region_desc\" property=\"regionDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n\n    <resultMap id=\"DtoResultMap\" type=\"com.winner.config.center.pojo.db.dto.RegionDto\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"region_name\" property=\"regionName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"region_desc\" property=\"regionDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n\n    <sql id=\"Base_Column_List\">\n    id, region_name, region_desc, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_region\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_region\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.winner.config.center.pojo.db.entity.Region\" useGeneratedKeys=\"true\"\n            keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_region (id, region_name, region_desc, \n      create_time, update_time)\n    values (#{id,jdbcType=BIGINT}, #{regionName,jdbcType=VARCHAR}, #{regionDesc,jdbcType=VARCHAR}, \n      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.winner.config.center.pojo.db.entity.Region\">\n        insert into t_region\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"regionName != null\">\n                region_name,\n            </if>\n            <if test=\"regionDesc != null\">\n                region_desc,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"regionName != null\">\n                #{regionName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"regionDesc != null\">\n                #{regionDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.winner.config.center.pojo.db.entity.Region\">\n        update t_region\n        <set>\n            <if test=\"regionName != null\">\n                region_name = #{regionName,jdbcType=VARCHAR},\n            </if>\n            <if test=\"regionDesc != null\">\n                region_desc = #{regionDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.winner.config.center.pojo.db.entity.Region\">\n    update t_region\n    set region_name = #{regionName,jdbcType=VARCHAR},\n      region_desc = #{regionDesc,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <select id=\"pageRegion\" resultMap=\"DtoResultMap\">\n        select id, region_name, region_desc, create_time, update_time\n        <!-- <include refid=\"Base_Column_List\"/> -->\n        from t_region\n        <where>1=1\n            <if test=\"regionName != null and regionName != ''\">\n                and region_name like '%${regionName}%'\n            </if>\n            <if test=\"createTime != null\">\n                and create_time &gt;= #{createTime}\n            </if>\n            <if test=\"updateTime != null\">\n                and update_time &lt;= #{updateTime}\n            </if>\n        </where>\n    </select>\n\n    <select id=\"selectRegion\" resultType=\"com.winner.config.center.pojo.db.dto.RegionDto\">\n        select t.id as id,t.region_name as regionName from  t_region t\n        </select>\n\n    <delete id=\"batchDelete\">\n        delete from t_region where id in\n        <foreach collection=\"idArr\" item=\"id\" separator=\",\" index=\"index\" open=\"(\" close=\")\">\n            #{id}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-pojo/src/main/resources/com/xiao/custom/config/pojo/mapper/ServerHostConfigMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"com.xiao.custom.config.pojo.mapper.ServerHostConfigMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.xiao.custom.config.pojo.entity.ServerHostConfig\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"server_host\" property=\"serverHost\" jdbcType=\"VARCHAR\"/>\n        <result column=\"server_desc\" property=\"serverDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"region_id\" property=\"regionId\" jdbcType=\"BIGINT\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n\n    <resultMap id=\"DtoResultMap\" type=\"com.xiao.custom.config.pojo.dto.ServerHostConfigDto\">\n        <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/>\n        <result column=\"server_host\" property=\"serverHost\" jdbcType=\"VARCHAR\"/>\n        <result column=\"server_desc\" property=\"serverDesc\" jdbcType=\"VARCHAR\"/>\n        <result column=\"region_id\" property=\"regionId\" jdbcType=\"BIGINT\"/>\n        <result column=\"region_name\" property=\"regionName\" jdbcType=\"VARCHAR\"/>\n        <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n        <result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n    </resultMap>\n    <sql id=\"Base_Column_List\">\n    id, server_host, server_desc, region_id, create_time, update_time\n  </sql>\n    <select id=\"selectByPrimaryKey\" resultMap=\"BaseResultMap\" parameterType=\"java.lang.Long\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        from t_server_host_config\n        where id = #{id,jdbcType=BIGINT}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    delete from t_server_host_config\n    where id = #{id,jdbcType=BIGINT}\n  </delete>\n    <insert id=\"insert\" parameterType=\"com.xiao.custom.config.pojo.entity.ServerHostConfig\" useGeneratedKeys=\"true\"\n            keyColumn=\"id\" keyProperty=\"id\">\n    insert into t_server_host_config (id, server_host, server_desc, \n      region_id, create_time, update_time\n      )\n    values (#{id,jdbcType=BIGINT}, #{serverHost,jdbcType=VARCHAR}, #{serverDesc,jdbcType=VARCHAR}, \n      #{regionId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ServerHostConfig\">\n        insert into t_server_host_config\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                id,\n            </if>\n            <if test=\"serverHost != null\">\n                server_host,\n            </if>\n            <if test=\"serverDesc != null\">\n                server_desc,\n            </if>\n            <if test=\"regionId != null\">\n                region_id,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"id != null\">\n                #{id,jdbcType=BIGINT},\n            </if>\n            <if test=\"serverHost != null\">\n                #{serverHost,jdbcType=VARCHAR},\n            </if>\n            <if test=\"serverDesc != null\">\n                #{serverDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"regionId != null\">\n                #{regionId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </trim>\n    </insert>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.xiao.custom.config.pojo.entity.ServerHostConfig\">\n        update t_server_host_config\n        <set>\n            <if test=\"serverHost != null\">\n                server_host = #{serverHost,jdbcType=VARCHAR},\n            </if>\n            <if test=\"serverDesc != null\">\n                server_desc = #{serverDesc,jdbcType=VARCHAR},\n            </if>\n            <if test=\"regionId != null\">\n                region_id = #{regionId,jdbcType=BIGINT},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n        </set>\n        where id = #{id,jdbcType=BIGINT}\n    </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.xiao.custom.config.pojo.entity.ServerHostConfig\">\n    update t_server_host_config\n    set server_host = #{serverHost,jdbcType=VARCHAR},\n      server_desc = #{serverDesc,jdbcType=VARCHAR},\n      region_id = #{regionId,jdbcType=BIGINT},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=BIGINT}\n  </update>\n\n    <select id=\"pageServerHostConfig\" resultMap=\"DtoResultMap\">\n        select\n        s.id, s.server_host, s.server_desc,s.region_id,r.region_name, s.create_time, s.update_time\n        from t_server_host_config s\n        left join t_region r on s.region_id=r.id\n        <where>\n            <if test=\"serverHost != null and serverHost!=''\">\n                and s.server_host like '%${serverHost}%'\n            </if>\n            <if test=\"serverDesc != null and serverDesc!=''\">\n                and s.server_desc like '%${serverDesc}%'\n            </if>\n            \n            <!--<if test=\"createTime != null and createTime !=''\">-->\n            <!--&lt;!&ndash; create_time like '%${createTime}%' &ndash;&gt;-->\n            <!--and s.create_time &gt;= #{createTime}-->\n            <!--</if>-->\n            <!--<if test=\"updateTime != null and \">-->\n            <!--&lt;!&ndash; update_time like '%${updateTime}%' &ndash;&gt;-->\n            <!--and s.update_time &lt;= #{updateTime}-->\n            <!--</if>-->\n        </where>\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/README.md",
    "content": "1. 配置中心服务端，集成注册中心、配置中心一体化\n2. 使用mysql存储配置\n3. 客户端访问时，会记录客户端提供的服务信息保存到数据库，便于管理平台发布更新配置"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-server</artifactId>\n\n    <properties>\n        <netty.version>4.1.42.Final</netty.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-jdbc</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka-server</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-config-server</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n\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            <version>1.1.10</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-collections</groupId>\n            <artifactId>commons-collections</artifactId>\n            <version>3.2.2</version>\n        </dependency>\n\n        <!-- 开发者工具 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>4.1.12</version>\n            <scope>compile</scope>\n        </dependency>\n\n        <!--protostuff -->\n        <dependency>\n            <groupId>com.dyuproject.protostuff</groupId>\n            <artifactId>protostuff-core</artifactId>\n            <version>1.1.2</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n        <dependency>\n            <groupId>com.dyuproject.protostuff</groupId>\n            <artifactId>protostuff-runtime</artifactId>\n            <version>1.1.2</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n        <dependency>\n            <groupId>org.objenesis</groupId>\n            <artifactId>objenesis</artifactId>\n            <version>2.1</version>\n            <!-- <scope>test</scope> -->\n        </dependency>\n\n        <dependency>\n            <groupId>io.netty</groupId>\n            <artifactId>netty-all</artifactId>\n            <version>${netty.version}</version>\n        </dependency>\n\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/ConfigerCenterApplication.java",
    "content": "package com.xiao.custom.config.server;\n\nimport com.xiao.custom.config.server.annotation.CustomEnableConfigServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\n\n/**\n * [简要描述]: 自定义配置中心实现,注册中心、配置中心合并一体化\n * [详细描述]: spring-cloud config扩展\n *\n * @author llxiao\n * @version 1.0, 2019/1/31 10:01\n * @since JDK 1.8\n */\n@SpringBootApplication(scanBasePackages = \"com.xiao.custom.config\")\n@CustomEnableConfigServer\n@EnableEurekaServer\npublic class ConfigerCenterApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConfigerCenterApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/annotation/CustomEnableConfigServer.java",
    "content": "package com.xiao.custom.config.server.annotation;\n\nimport com.xiao.custom.config.server.config.CustomEnvironmentRepositoryConfiguration;\nimport org.springframework.cloud.config.server.EnableConfigServer;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Import;\n\nimport java.lang.annotation.*;\n\n/**\n * [简要描述]: 自定义配置中心注解\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/22 15:50\n * @since JDK 1.8\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Configuration\n@Import(CustomEnvironmentRepositoryConfiguration.class)\n@EnableConfigServer\npublic @interface CustomEnableConfigServer\n{\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/config/CustomEnvironmentRepositoryConfiguration.java",
    "content": "package com.xiao.custom.config.server.config;\n\nimport com.xiao.custom.config.server.environment.CustomEnvironmentRepository;\nimport com.xiao.custom.config.server.manager.ClientManagerService;\nimport com.xiao.custom.config.server.service.RepositoryService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.config.server.environment.EnvironmentRepository;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/22 15:49\n * @since JDK 1.8\n */\n@Configuration\npublic class CustomEnvironmentRepositoryConfiguration\n{\n    @Autowired\n    private RepositoryService repositoryService;\n\n    @Autowired\n    private ClientManagerService clientManagerService;\n\n    @Bean\n    public EnvironmentRepository environmentRepository()\n    {\n        return new CustomEnvironmentRepository(repositoryService, clientManagerService);\n    }\n\n    @Bean\n    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(JdbcTemplate template)\n    {\n        return new NamedParameterJdbcTemplate(template);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/controller/RefreshController.java",
    "content": "package com.xiao.custom.config.server.controller;\n\nimport com.xiao.custom.config.server.service.RefreshService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 10:29\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/refresh\")\npublic class RefreshController\n{\n    @Autowired\n    private RefreshService refreshService;\n\n    @RequestMapping(\"/client\")\n    public boolean refresh(@RequestParam(\"ip\") String ip, @RequestParam(\"port\") int port)\n    {\n        return refreshService.refresh(ip, port);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/environment/CustomEnvironmentRepository.java",
    "content": "package com.xiao.custom.config.server.environment;\n\nimport com.xiao.custom.config.server.manager.ClientManagerService;\nimport com.xiao.custom.config.server.service.RepositoryService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.collections.MapUtils;\nimport org.springframework.cloud.config.environment.Environment;\nimport org.springframework.cloud.config.environment.PropertySource;\nimport org.springframework.cloud.config.server.environment.EnvironmentRepository;\nimport org.springframework.core.Ordered;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.*;\n\nimport static org.springframework.util.StringUtils.commaDelimitedListToStringArray;\nimport static org.springframework.util.StringUtils.isEmpty;\n\n/**\n * [简要描述]: 数据库实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/22 15:16\n * @since JDK 1.8\n */\n@Slf4j\npublic class CustomEnvironmentRepository implements EnvironmentRepository, Ordered\n{\n    /**\n     * config server 一些默认配置\n     */\n    private static final String APPLICATION = \"application\";\n    private static final String DEFAULT_PROFILE = \"default\";\n    private static final String DEFAULT_LABEL = \"master\";\n\n    private static final String CLIENT_HOST = \"ClientServerHost\";\n    private static final String CLIENT_PORT = \"ClientServerPort\";\n\n    /**\n     * Squid 服务代理\n     */\n    private static final String X_FORWARDED_FOR = \"X-Forwarded-For\";\n    /**\n     * apache 服务代理\n     */\n    private static final String PROXY_CLIENT_IP = \"Proxy-Client-IP\";\n    /**\n     * weblogic 服务代理\n     */\n    private static final String WL_PROXY_CLIENT_IP = \"WL-Proxy-Client-IP\";\n    /**\n     * http 其他代理\n     */\n    private static final String HTTP_CLIENT_IP = \"HTTP_CLIENT_IP\";\n    /**\n     * nginx服务代理\n     */\n    private static final String X_REA_IP = \"X-Real-IP\";\n    private static final String UNKNOWN = \"unknown\";\n\n    private int order = Ordered.LOWEST_PRECEDENCE - 10;\n\n    private RepositoryService repositoryService;\n\n    private ClientManagerService clientManagerService;\n\n    public CustomEnvironmentRepository(RepositoryService repositoryService, ClientManagerService clientManagerService)\n    {\n        this.repositoryService = repositoryService;\n        this.clientManagerService = clientManagerService;\n    }\n\n    @Override\n    public Environment findOne(String application, String profile, String label)\n    {\n        String ip = saveClientInfo(application, profile);\n\n        String config = application;\n        if (isEmpty(label))\n        {\n            label = DEFAULT_LABEL;\n        }\n        if (isEmpty(profile))\n        {\n            profile = DEFAULT_PROFILE;\n        }\n        if (!profile.startsWith(DEFAULT_PROFILE))\n        {\n            profile = DEFAULT_PROFILE + ',' + profile;\n        }\n        String[] profiles = commaDelimitedListToStringArray(profile);\n        Environment environment = new Environment(application, profiles, label, null, null);\n        if (!config.startsWith(APPLICATION))\n        {\n            config = APPLICATION + ',' + config;\n        }\n        List<String> applications = new ArrayList<>(new LinkedHashSet<>(Arrays\n                .asList(commaDelimitedListToStringArray(config))));\n        List<String> envs = new ArrayList<>(new LinkedHashSet<>(Arrays.asList(profiles)));\n        Collections.reverse(applications);\n        Collections.reverse(envs);\n        Map<String, Object> resource;\n        for (String app : applications)\n        {\n            for (String env : envs)\n            {\n                resource = repositoryService.getPropertySource(ip, app, label, env);\n                if (MapUtils.isNotEmpty(resource))\n                {\n                    environment.add(new PropertySource(app + '-' + env, resource));\n                }\n            }\n        }\n        return environment;\n    }\n\n    private String saveClientInfo(String application, String profile)\n    {\n        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder\n                .getRequestAttributes();\n        String ip = \"\";\n        String port = \"\";\n        if (null != servletRequestAttributes)\n        {\n            HttpServletRequest request = servletRequestAttributes.getRequest();\n\n            //获取IP\n            ip = request.getHeader(CLIENT_HOST);\n            if (org.apache.commons.lang3.StringUtils.isBlank(ip))\n            {\n                ip = getClientIp(request);\n            }\n            port = request.getHeader(CLIENT_PORT);\n            log.info(\">>> 应用：{}开始从配置中心拉取配置\", application);\n            log.info(\">>> 应用端服务器信息-IP:{},Port:{}\", ip, port);\n            if (!isEmpty(ip) && !isEmpty(port))\n            {\n                clientManagerService.setClientHost(application, profile, ip, Integer.parseInt(port));\n            }\n        }\n        return ip;\n    }\n\n    private String getClientIp(HttpServletRequest request)\n    {\n        String ip = null;\n        //X-Forwarded-For：Squid 服务代理\n        String ipAddresses = request.getHeader(X_FORWARDED_FOR);\n        if (isEmpty(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses))\n        {\n            //Proxy-Client-IP：apache 服务代理\n            ipAddresses = request.getHeader(PROXY_CLIENT_IP);\n        }\n        if (isEmpty(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses))\n        {\n            //WL-Proxy-Client-IP：weblogic 服务代理\n            ipAddresses = request.getHeader(WL_PROXY_CLIENT_IP);\n        }\n        if (isEmpty(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses))\n        {\n            //HTTP_CLIENT_IP：有些代理服务器\n            ipAddresses = request.getHeader(HTTP_CLIENT_IP);\n        }\n        if (isEmpty(ipAddresses) || UNKNOWN.equalsIgnoreCase(ipAddresses))\n        {\n            //X-Real-IP：nginx服务代理\n            ipAddresses = request.getHeader(X_REA_IP);\n        }\n\n        //有些网络通过多层代理，那么获取到的ip就会有多个，一般都是通过逗号（,）分割开来，并且第一个ip为客户端的真实IP\n        if (ipAddresses != null && ipAddresses.length() != 0)\n        {\n            ip = ipAddresses.split(\",\")[0];\n        }\n\n        //还是不能获取到，最后再通过request.getRemoteAddr();获取\n        if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ipAddresses))\n        {\n            ip = request.getRemoteAddr();\n        }\n        return ip;\n    }\n\n    @Override\n    public int getOrder()\n    {\n        return order;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/manager/ClientManagerService.java",
    "content": "package com.xiao.custom.config.server.manager;\n\n/**\n * [简要描述]: 服务端链接管理\n * [详细描述]: 服务名称+链接的IP地址\n *\n * @author llxiao\n * @version 1.0, 2019/1/28 11:26\n * @since JDK 1.8\n */\npublic interface ClientManagerService\n{\n    /**\n     * 在线\n     */\n    int ON_LINE = 0;\n    /**\n     * 离线\n     */\n    int OFF_LINE = 1;\n\n    /**\n     * [简要描述]:存储服务链接信息，服务IP<br/>\n     * [详细描述]:<br/>\n     *\n     * @param serviceName : 应用名\n     * @param profile: 应用环境\n     * @param hostIp : 应用对应服务的IP\n     * @param hostPort : 应用对应服务的端口\n     * llxiao  2019/1/28 - 11:38\n     **/\n    void setClientHost(String serviceName, String profile, String hostIp, int hostPort);\n\n    /**\n     * [简要描述]:更新状态<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostIp : 客户端IP\n     * @param nettyPort : 客户端PORT\n     * @param status : 0在线，1离线\n     * llxiao  2019/4/1 - 10:34\n     **/\n    void updateStatus(String hostIp, int nettyPort, int status);\n\n    /**\n     * [简要描述]:更新应用的服务信息与NETTY连接的IP信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostIp :\n     * @param hostPort :\n     * @param nettyPort :\n     * @param nettyHostIp :\n     * @return void\n     * llxiao  2019/4/1 - 11:49\n     **/\n    void updateNettyInfo(String hostIp, int hostPort, int nettyPort, String nettyHostIp);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/manager/SqlConstants.java",
    "content": "package com.xiao.custom.config.server.manager;\n\n/**\n * [简要描述]: SQL常量\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 16:53\n * @since JDK 1.8\n */\npublic interface SqlConstants\n{\n\n    /**\n     * 应用名称和环境查找应用ID，返回Null则表示不存在\n     */\n    String SELECT_APPLICATION = \"select id from t_client_application a where application = :application and profile = :profile\";\n\n    /**\n     * 插入一条应用环境信息，应用名称+环境\n     */\n    String INSERT_APPLICATION = \"INSERT INTO `t_client_application` (`application`,`profile`,`create_time`) VALUES (:application,:profile,now())\";\n\n    /**\n     * 主键ID更新应服务状态\n     */\n    String UPDATE_APPLICATION = \"update t_client_application set status = 0,update_time = now() where id = :id\";\n\n    /**\n     * 应用ID+客户端IP+客户端提供服务IP 查询客户端信息主键ID\n     */\n    String SELECT_APPLICATION_HOST_INFO = \"select id from t_client_host_info where client_application_id = :appId and host_ip = :ip and host_port = :port\";\n\n    /**\n     * 插入一条应用服务端的客户端HOST信息 应用主键ID+客户端IP+客户端提供的服务端口\n     */\n    String INSERT_APPLICATION_HOST_INFO = \"INSERT INTO `t_client_host_info` (`client_application_id`, `host_ip`, `host_port`,`create_time`) VALUES (:appId, :ip,:port, now())\";\n\n    /**\n     * 主键ID更新用服务端的客户端HOST信息的状态\n     */\n    String UPDATE_APPLICATION_HOST_INFO = \"update t_client_host_info set status = 0 ,update_time = now() where id = :id\";\n\n    /**\n     * IP+PORT更新客户端状态\n     */\n    String UPDATE_CLIENT_STATUS = \"update t_client_host_info set status = :status,update_time = now() where netty_ip = :nettyIp and netty_port = :nettyPort\";\n\n    /**\n     * 绑定host和netty端口信息，标记上线\n     */\n    String UPDATE_NETTY_INFO = \"update t_client_host_info set netty_port = :nettyPort,netty_ip = :nettyIp,status = 0,update_time = now()  where host_ip = :ip and host_port = :port\";\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/manager/impl/ClientManagerServiceDbImpl.java",
    "content": "package com.xiao.custom.config.server.manager.impl;\n\nimport com.xiao.custom.config.server.manager.ClientManagerService;\nimport com.xiao.custom.config.server.manager.SqlConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.dao.EmptyResultDataAccessException;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.core.PreparedStatementCreator;\nimport org.springframework.jdbc.core.namedparam.MapSqlParameterSource;\nimport org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;\nimport org.springframework.jdbc.core.namedparam.SqlParameterSource;\nimport org.springframework.jdbc.support.GeneratedKeyHolder;\nimport org.springframework.jdbc.support.KeyHolder;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]: 客户端管理jdbc实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/29 16:28\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class ClientManagerServiceDbImpl implements ClientManagerService, SqlConstants\n{\n    @Autowired\n    private JdbcTemplate jdbcTemplate;\n\n    @Autowired\n    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;\n\n    /**\n     * [简要描述]:存储服务链接信息，服务IP<br/>\n     * [详细描述]:<br/>\n     *\n     * @param serviceName : 应用名\n     * @param profile : 应用环境\n     * @param hostIp : 应用对应服务的IP\n     * @param hostPort : 应用对应服务的端口\n     **/\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void setClientHost(String serviceName, String profile, String hostIp, int hostPort)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"=======存储服务链接信息:\");\n            log.debug(\"应用名称:{}\", serviceName);\n            log.debug(\"应用环境:{}\", profile);\n            log.debug(\"应用IP:{}\", hostIp);\n            log.debug(\"应用端口:{}\", hostPort);\n        }\n        // 应用\n        Long id = processApplication(serviceName, profile);\n        // 应用主机信息\n        processHost(hostIp, hostPort, id);\n    }\n\n    /**\n     * [简要描述]:更新状态<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostIp : 客户端IP\n     * @param hostPort : 客户端PORT\n     * @param status : status\n     **/\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void updateStatus(String hostIp, int hostPort, int status)\n    {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"status\", status);\n        params.put(\"nettyIp\", hostIp);\n        params.put(\"nettyPort\", hostPort);\n        namedParameterJdbcTemplate.update(SqlConstants.UPDATE_CLIENT_STATUS, params);\n\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostIp :\n     * @param hostPort :\n     * @param nettyPort :\n     * @param nettyHostIp llxiao  2019/4/1 - 11:49\n     **/\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void updateNettyInfo(String hostIp, int hostPort, int nettyPort, String nettyHostIp)\n    {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"nettyPort\", nettyPort);\n        params.put(\"ip\", hostIp);\n        params.put(\"port\", hostPort);\n        params.put(\"nettyIp\", nettyHostIp);\n        namedParameterJdbcTemplate.update(SqlConstants.UPDATE_NETTY_INFO, params);\n    }\n\n    /**\n     * 客户端应用维护\n     *\n     * @param serviceName\n     * @param profile\n     * @return\n     */\n    private Long processApplication(String serviceName, String profile)\n    {\n        //应用+环境 是否存在\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"application\", serviceName);\n        params.put(\"profile\", profile);\n        Long id = getPriKey(SELECT_APPLICATION, params);\n\n        if (null == id)\n        {\n            //插入\n            id = insertApplication(serviceName, profile);\n        }\n        else\n        {\n            updateApplicationStatus(id);\n        }\n        return id;\n    }\n\n    private Long getPriKey(String sql, Map<String, Object> params)\n    {\n        Long id = null;\n        try\n        {\n            id = namedParameterJdbcTemplate.queryForObject(sql, params, Long.class);\n        }\n        catch (EmptyResultDataAccessException e)\n        {\n            log.warn(\"获取不到数据\");\n        }\n        return id;\n    }\n\n    /**\n     * 客户主机信息维护\n     *\n     * @param hostIp\n     * @param hostPort\n     * @param id\n     */\n    private void processHost(String hostIp, int hostPort, Long id)\n    {\n        // 添加客户端IP和端口信息\n        Map<String, Object> params = new HashMap<>(3);\n        params.put(\"appId\", id);\n        params.put(\"ip\", hostIp);\n        params.put(\"port\", hostPort);\n        Long hostId = getPriKey(SELECT_APPLICATION_HOST_INFO, params);\n        if (null == hostId)\n        {\n            //添加\n            namedParameterJdbcTemplate.update(INSERT_APPLICATION_HOST_INFO, params);\n        }\n        else\n        {\n            params = new HashMap<>(1);\n            params.put(\"id\", id);\n            //更新状态\n            namedParameterJdbcTemplate.update(UPDATE_APPLICATION_HOST_INFO, params);\n        }\n    }\n\n    private void updateApplicationStatus(Long id)\n    {\n        Map<String, Long> param = new HashMap<>(1);\n        param.put(\"id\", id);\n        namedParameterJdbcTemplate.update(UPDATE_APPLICATION, param);\n    }\n\n    private Long insertApplication(String serviceName, String profile)\n    {\n        MapSqlParameterSource parameters = new MapSqlParameterSource();\n        parameters.addValue(\"application\", serviceName);\n        parameters.addValue(\"profile\", profile);\n        return insertReKey(INSERT_APPLICATION, parameters);\n        //        return insertReId(connection ->\n        //        {\n        //            PreparedStatement pstmt = connection.prepareStatement(INSERT_APPLICATION, Statement.RETURN_GENERATED_KEYS);\n        //            pstmt.setString(1, serviceName);\n        //            pstmt.setString(2, profile);\n        //            return pstmt;\n        //        });\n    }\n\n    /**\n     * [简要描述]:jdbcTemplate方式插入一条数据，返回主键<br/>\n     * [详细描述]:<br/>\n     *\n     * @param preparedStatementCreator :\n     * @return java.lang.Long\n     * llxiao  2019/1/29 - 17:11\n     **/\n    private Long insertReId(PreparedStatementCreator preparedStatementCreator)\n    {\n        KeyHolder keyHolder = new GeneratedKeyHolder();\n        jdbcTemplate.update(preparedStatementCreator, keyHolder);\n        return keyHolder.getKey().longValue();\n    }\n\n    /**\n     * [简要描述]:NamedParameterJdbcTemplate方式插入一条数据，返回主键<br/>\n     * [详细描述]:<br/>\n     *\n     * @param sql : 执行的SQL\n     * @param params : 参数\n     * @return java.lang.Long\n     * llxiao  2019/1/29 - 17:44\n     **/\n    private Long insertReKey(String sql, SqlParameterSource params)\n    {\n        KeyHolder keyHolder = new GeneratedKeyHolder();\n        namedParameterJdbcTemplate.update(sql, params, keyHolder, new String[] { \"id\" });\n        return keyHolder.getKey().longValue();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/coder/ProtoDecoder.java",
    "content": "package com.xiao.custom.config.server.netty.coder;\n\nimport com.xiao.custom.config.server.netty.util.ProtostuffUtil;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.ByteToMessageDecoder;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 编码\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 13:54\n * @since JDK 1.8\n */\npublic class ProtoDecoder extends ByteToMessageDecoder\n{\n    private static final int PROTO_BUFF_FLAG = 4;\n\n    private Class<?> genericClass;\n\n    public ProtoDecoder(Class cls)\n    {\n        this.genericClass = cls;\n    }\n\n    @Override\n    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) throws Exception\n    {\n        if (byteBuf.readableBytes() < PROTO_BUFF_FLAG)\n        {\n            return;\n        }\n        byteBuf.markReaderIndex();\n        int dataLength = byteBuf.readInt();\n        if (dataLength < 0)\n        {\n            ctx.close();\n        }\n        if (byteBuf.readableBytes() < dataLength)\n        {\n            byteBuf.resetReaderIndex();\n        }\n        // 将ByteBuf转换为byte[]\n        byte[] data = new byte[dataLength];\n        byteBuf.readBytes(data);\n        // 将data转换成object\n        Object obj = ProtostuffUtil.deserialize(data, genericClass);\n        list.add(obj);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/coder/ProtoEncoder.java",
    "content": "package com.xiao.custom.config.server.netty.coder;\n\nimport com.xiao.custom.config.server.netty.util.ProtostuffUtil;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandler;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.MessageToByteEncoder;\n\n/**\n * [简要描述]: 解码\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 13:54\n * @since JDK 1.8\n */\n@ChannelHandler.Sharable\npublic class ProtoEncoder extends MessageToByteEncoder<Object>\n{\n    private Class<?> genericClass;\n\n    public ProtoEncoder(Class cls)\n    {\n        this.genericClass = cls;\n    }\n\n    @Override\n    protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception\n    {\n        // 序列化\n        if (genericClass.isInstance(msg))\n        {\n            byte[] data = ProtostuffUtil.serialize(msg);\n            byteBuf.writeInt(data.length);\n            byteBuf.writeBytes(data);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/dto/CommandEnum.java",
    "content": "package com.xiao.custom.config.server.netty.dto;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 16:18\n * @since JDK 1.8\n */\npublic enum CommandEnum\n{\n    /**\n     * 心跳\n     */\n    IDLE(0),\n    /**\n     * 登录，绑定信息\n     */\n    LOGIN(1),\n    /**\n     * 刷新动作\n     */\n    REFRESH(2);\n\n    int status;\n\n    CommandEnum(int status)\n    {\n        this.status = status;\n    }\n\n    public int getStatus()\n    {\n        return status;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/dto/Message.java",
    "content": "package com.xiao.custom.config.server.netty.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: Netty交互消息体\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 10:42\n * @since JDK 1.8\n */\n@Data\npublic class Message\n{\n    /**\n     * 0：心跳，1：登录，2：刷新\n     */\n    private int command;\n\n    /**\n     * 消息体\n     */\n    private String message;\n\n    /**\n     * 返回状态\n     */\n    private int status;\n\n    /**\n     * 错误消息\n     */\n    private String errorMessage;\n\n    /**\n     * 客户端服务端口\n     */\n    private int serverPort;\n\n    /**\n     * 客户端服务IP\n     */\n    private String hostIp;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/factory/CoderFactory.java",
    "content": "package com.xiao.custom.config.server.netty.factory;\n\nimport com.xiao.custom.config.server.netty.coder.ProtoDecoder;\nimport com.xiao.custom.config.server.netty.coder.ProtoEncoder;\nimport com.xiao.custom.config.server.netty.dto.Message;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 14:31\n * @since JDK 1.8\n */\npublic class CoderFactory\n{\n    public static ProtoDecoder newDecoder()\n    {\n        return new ProtoDecoder(Message.class);\n    }\n\n    public static ProtoEncoder newEncoder()\n    {\n        return new ProtoEncoder(Message.class);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/factory/NamedThreadFactory.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  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 */\npackage com.xiao.custom.config.server.netty.factory;\n\nimport java.util.concurrent.ThreadFactory;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * Thread factory to name the thread purposely\n *\n * @author jiangping\n * @version $Id: NamedThreadFactory.java, v 0.1 Sept 5, 2016 10:17:10 PM tao Exp $\n */\npublic class NamedThreadFactory implements ThreadFactory\n{\n\n    private static final AtomicInteger poolNumber = new AtomicInteger(1);\n    private final AtomicInteger threadNumber = new AtomicInteger(1);\n    private final ThreadGroup group;\n    private final String namePrefix;\n    private final boolean isDaemon;\n\n    public NamedThreadFactory()\n    {\n        this(\"ThreadPool\");\n    }\n\n    public NamedThreadFactory(String name)\n    {\n        this(name, false);\n    }\n\n    public NamedThreadFactory(String preffix, boolean daemon)\n    {\n        SecurityManager s = System.getSecurityManager();\n        group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();\n        namePrefix = preffix + \"-\" + poolNumber.getAndIncrement() + \"-thread-\";\n        isDaemon = daemon;\n    }\n\n    /**\n     * Create a thread.\n     *\n     * @see ThreadFactory#newThread(Runnable)\n     */\n    @Override\n    public Thread newThread(Runnable r)\n    {\n        Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);\n        t.setDaemon(isDaemon);\n        if (t.getPriority() != Thread.NORM_PRIORITY)\n        {\n            t.setPriority(Thread.NORM_PRIORITY);\n        }\n        return t;\n    }\n\n    /**\n     * 自定义线程factory\n     *\n     * @param namePrefix\n     * @param daemon\n     * @return\n     */\n    public static ThreadFactory create(final String namePrefix, final boolean daemon)\n    {\n        return new NamedThreadFactory(namePrefix, daemon);\n    }\n\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/handler/ServiceHandler.java",
    "content": "package com.xiao.custom.config.server.netty.handler;\n\nimport com.xiao.custom.config.server.manager.ClientManagerService;\nimport com.xiao.custom.config.server.netty.dto.CommandEnum;\nimport com.xiao.custom.config.server.netty.dto.Message;\nimport com.xiao.custom.config.server.netty.manager.Connection;\nimport com.xiao.custom.config.server.netty.manager.ConnectionManager;\nimport com.xiao.custom.config.server.netty.util.RemotingUtil;\nimport io.netty.channel.ChannelHandler;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.channel.SimpleChannelInboundHandler;\nimport io.netty.handler.timeout.IdleStateEvent;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * [简要描述]: 业务handler\n * [详细描述]:\n * ##@Sharable 注解用来说明ChannelHandler是否可以在多个channel直接共享使用,单例的ChannelHandler<br>\n * 业务处理，请使用线程池来处理<br>\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 16:00\n * @since JDK 1.8\n */\n@Slf4j\n@ChannelHandler.Sharable\npublic class ServiceHandler extends SimpleChannelInboundHandler<Message>\n{\n    private ClientManagerService clientManagerService;\n\n    private ConnectionManager connectionManager;\n\n    public ServiceHandler(ClientManagerService clientManagerService, ConnectionManager connectionManager)\n    {\n        super();\n        this.clientManagerService = clientManagerService;\n        this.connectionManager = connectionManager;\n    }\n\n    @Override\n    public void channelActive(ChannelHandlerContext ctx) throws Exception\n    {\n        log.info(\">>> 客户端-IP:{},PORT:{},连接到服务器...\", RemotingUtil.parseRemoteIP(ctx.channel()), RemotingUtil\n                .parseRemotePort(ctx.channel()));\n        super.channelActive(ctx);\n    }\n\n    @Override\n    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Message message) throws Exception\n    {\n\n        String nettyIp = RemotingUtil.parseRemoteIP(channelHandlerContext.channel());\n        int nettyPort = RemotingUtil.parseRemotePort(channelHandlerContext.channel());\n        if (CommandEnum.IDLE.getStatus() == message.getCommand())\n        {\n            if (log.isDebugEnabled())\n            {\n                log.debug(\">>> 客户端-IP:{},PORT:{}发起了心跳请求.\", nettyIp, nettyPort);\n            }\n            //收到心跳维护客户端http服务和netty服务关系\n            channelHandlerContext.channel().writeAndFlush(message);\n        }\n        else if (CommandEnum.LOGIN.getStatus() == message.getCommand())\n        {\n            log.info(\">>> 客户端-IP:{},PORT:{}发起了登录请求\", message.getHostIp(), message.getServerPort());\n            log.info(\">>> 客户端-Netty IP:{},Netty PORT:{}发起了登录请求\", nettyIp, nettyPort);\n            //绑定应用信息和netty端口信息\n            clientManagerService.updateNettyInfo(message.getHostIp(), message.getServerPort(), nettyPort, nettyIp);\n            connectionManager.addConnection(new Connection(channelHandlerContext.channel(), message.getHostIp(), message\n                    .getServerPort()));\n        }\n        else\n        {\n            log.info(\">>> 业务处理......\");\n        }\n\n    }\n\n    @Override\n    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception\n    {\n        String ip = RemotingUtil.parseRemoteIP(ctx.channel());\n        int port = RemotingUtil.parseRemotePort(ctx.channel());\n        log.error(\">>> 客户端-IP:{},PORT:{}关闭了连接,并进行下线操作!\", ip, port);\n        // 下线处理\n        if (ctx.channel().isOpen())\n        {\n            ctx.close();\n        }\n        clientManagerService.updateStatus(ip, port, ClientManagerService.OFF_LINE);\n        connectionManager.remove(ip, port);\n    }\n\n    @Override\n    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\">>> 已超过5S，未收到客户端发送到的消息.....\");\n        }\n\n        if (evt instanceof IdleStateEvent)\n        {\n            //读取心跳超时后，会将此channel连接断开\n            try\n            {\n                String ip = RemotingUtil.parseRemoteIP(ctx.channel());\n                int port = RemotingUtil.parseRemotePort(ctx.channel());\n                log.warn(\">>> 关闭这个不活跃的连接-IP:{},PORT:{}并进行离线操作\", ip, port);\n                //  心跳，关闭连接\n                if (ctx.channel().isOpen())\n                {\n                    ctx.close();\n                    clientManagerService.updateStatus(ip, port, ClientManagerService.OFF_LINE);\n                    connectionManager.remove(ip, port);\n                }\n            }\n            catch (Exception e)\n            {\n                log.warn(\">>> 关闭链路异常....\", e);\n            }\n        }\n        else\n        {\n            super.userEventTriggered(ctx, evt);\n        }\n    }\n\n    @Override\n    public void channelInactive(ChannelHandlerContext ctx) throws Exception\n    {\n        String ip = RemotingUtil.parseRemoteIP(ctx.channel());\n        int port = RemotingUtil.parseRemotePort(ctx.channel());\n        //        log.warn(\">>> 客户端已断开连接......:{}\", ctx);\n        log.warn(\">>> 关闭这个不活跃的连接-IP:{},PORT:{}并进行离线操作\", ip, port);\n        // 下线处理\n        if (ctx.channel().isOpen())\n        {\n            ctx.close();\n        }\n        clientManagerService.updateStatus(ip, port, ClientManagerService.OFF_LINE);\n        connectionManager.remove(ip, port);\n        super.channelInactive(ctx);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/manager/Connection.java",
    "content": "package com.xiao.custom.config.server.netty.manager;\n\nimport com.xiao.custom.config.server.netty.util.RemotingUtil;\nimport io.netty.channel.Channel;\nimport lombok.Data;\n\n/**\n * [简要描述]: channel连接\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 08:44\n * @since JDK 1.8\n */\n@Data\npublic class Connection\n{\n    public static final String SPLIT = \":\";\n\n    private String uniqueKey;\n    private String nettyIp;\n    private int nettyPort;\n    private String serverIp;\n    private int serverPort;\n    private Channel channel;\n\n    public Connection()\n    {\n\n    }\n\n    public Connection(Channel channel)\n    {\n        this.nettyIp = RemotingUtil.parseRemoteIP(channel);\n        this.nettyPort = RemotingUtil.parseRemotePort(channel);\n        this.uniqueKey = nettyIp + SPLIT + nettyPort;\n        this.channel = channel;\n    }\n\n    public Connection(Channel channel, String serverIp, int serverPort)\n    {\n        this.nettyIp = RemotingUtil.parseRemoteIP(channel);\n        this.nettyPort = RemotingUtil.parseRemotePort(channel);\n        this.uniqueKey = nettyIp + SPLIT + nettyPort;\n        this.channel = channel;\n        this.serverIp = serverIp;\n        this.serverPort = serverPort;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/manager/ConnectionManager.java",
    "content": "package com.xiao.custom.config.server.netty.manager;\n\nimport io.netty.channel.Channel;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * [简要描述]: 连接数管理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 08:40\n * @since JDK 1.8\n */\n@Component(\"connectionManager\")\n@Slf4j\npublic class ConnectionManager\n{\n    /**\n     * 总连接数\n     */\n    private ConcurrentHashMap<String, Connection> conns = new ConcurrentHashMap();\n\n    /**\n     * 活跃连接数\n     */\n    private AtomicLong activeConnect = new AtomicLong(0);\n\n    /**\n     * [简要描述]:添加一个Channel连接<br/>\n     * [详细描述]:<br/>\n     *\n     * @param connection :\n     * llxiao  2019/4/4 - 8:54\n     **/\n    public void addConnection(Connection connection)\n    {\n        if (null != connection)\n        {\n            log.info(\">>> 新增了一个连接：{}\", connection);\n            if (log.isDebugEnabled())\n            {\n                log.debug(\">>> 新增了一个连接：{}\", connection);\n            }\n            conns.put(connection.getUniqueKey(), connection);\n            activeConnect.incrementAndGet();\n        }\n    }\n\n    /**\n     * [简要描述]:Key 获取一个连接<br/>\n     * [详细描述]:找不到返回一个null<br/>\n     *\n     * @param uniqueKey :\n     * @return com.winner.config.center.server.netty.manager.Connection\n     * llxiao  2019/4/4 - 8:57\n     **/\n    public Connection getConnection(String uniqueKey)\n    {\n        Connection connection = null;\n        if (StringUtils.isNotBlank(uniqueKey))\n        {\n            connection = conns.get(uniqueKey);\n        }\n        return connection;\n    }\n\n    /**\n     * [简要描述]:依据IP、PORT查找连接信息<br/>\n     * [详细描述]:找不到返回一个null<br/>\n     *\n     * @param nettyIp :\n     * @param nettyPot :\n     * @return com.winner.config.center.server.netty.manager.Connection\n     * llxiao  2019/4/4 - 9:02\n     **/\n    public Connection getConnection(String nettyIp, int nettyPot)\n    {\n        Connection connection = null;\n        if (StringUtils.isNotBlank(nettyIp))\n        {\n            connection = this.getConnection(nettyIp + Connection.SPLIT + nettyPot);\n        }\n        return connection;\n    }\n\n    /**\n     * [简要描述]:依据IP、PORT查找连接信息<br/>\n     * [详细描述]:找不到返回一个null<br/>\n     *\n     * @param nettyIp :\n     * @param nettyPot :\n     * @return java.nio.channels.Channel\n     * llxiao  2019/4/4 - 9:04\n     **/\n    public Channel getChannel(String nettyIp, int nettyPot)\n    {\n        Channel channel = null;\n        if (StringUtils.isNotBlank(nettyIp))\n        {\n            Connection connection = this.getConnection(nettyIp, nettyPot);\n            if (null != connection)\n            {\n                channel = connection.getChannel();\n            }\n        }\n        return channel;\n    }\n\n    /**\n     * [简要描述]:Key 获取一个连接<br/>\n     * [详细描述]:找不到返回一个null<br/>\n     *\n     * @param uniqueKey :\n     * @return io.netty.channel.Channel\n     * llxiao  2019/4/4 - 9:08\n     **/\n    public Channel getChannel(String uniqueKey)\n    {\n        Channel channel = null;\n        if (StringUtils.isNotBlank(uniqueKey))\n        {\n            Connection connection = this.getConnection(uniqueKey);\n            if (null != connection)\n            {\n                channel = connection.getChannel();\n            }\n        }\n        return channel;\n    }\n\n    /**\n     * [简要描述]:删除一个连接<br/>\n     * [详细描述]:<br/>\n     *\n     * @param uniqueKey :\n     * @return void\n     * llxiao  2019/4/4 - 9:09\n     **/\n    public void remove(String uniqueKey)\n    {\n        if (StringUtils.isNotBlank(uniqueKey))\n        {\n            Connection connection = conns.remove(uniqueKey);\n            if (null != connection)\n            {\n                log.info(\">>> 删除了一个连接：{}\", connection);\n                if (log.isDebugEnabled())\n                {\n                    log.debug(\">>> 删除了一个连接：{}\", connection);\n                }\n                activeConnect.decrementAndGet();\n            }\n        }\n    }\n\n    /**\n     * [简要描述]:删除一个连接<br/>\n     * [详细描述]:<br/>\n     *\n     * @param nettyIp :\n     * @param nettyPort :\n     * @return void\n     * llxiao  2019/4/4 - 9:09\n     **/\n    public void remove(String nettyIp, int nettyPort)\n    {\n        if (StringUtils.isNotBlank(nettyIp))\n        {\n            String uniqueKey = nettyIp + Connection.SPLIT + nettyPort;\n            this.remove(uniqueKey);\n        }\n    }\n\n    /**\n     * [简要描述]:获取当前总连接数<br/>\n     * [详细描述]:<br/>\n     *\n     * @return long\n     * llxiao  2019/4/4 - 9:14\n     **/\n    public long getCurrentConnectNum()\n    {\n        return activeConnect.get();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/server/NettyServer.java",
    "content": "package com.xiao.custom.config.server.netty.server;\n\nimport com.xiao.custom.config.server.manager.ClientManagerService;\nimport com.xiao.custom.config.server.netty.factory.CoderFactory;\nimport com.xiao.custom.config.server.netty.factory.NamedThreadFactory;\nimport com.xiao.custom.config.server.netty.handler.ServiceHandler;\nimport com.xiao.custom.config.server.netty.manager.ConnectionManager;\nimport com.xiao.custom.config.server.netty.util.NettyConfig;\nimport com.xiao.custom.config.server.netty.util.NettyEventLoopUtil;\nimport io.netty.bootstrap.ServerBootstrap;\nimport io.netty.buffer.PooledByteBufAllocator;\nimport io.netty.channel.*;\nimport io.netty.channel.epoll.EpollEventLoopGroup;\nimport io.netty.channel.nio.NioEventLoopGroup;\nimport io.netty.handler.timeout.IdleStateHandler;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.event.ContextRefreshedEvent;\nimport org.springframework.stereotype.Component;\n\nimport java.net.InetSocketAddress;\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * [简要描述]: Netty服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 14:23\n * @since JDK 1.8\n */\n@Component\n@Slf4j\npublic class NettyServer implements ApplicationListener<ContextRefreshedEvent>, DisposableBean\n{\n    /**\n     * 启动状态\n     */\n    private AtomicBoolean started = new AtomicBoolean(false);\n\n    @Value(\"${netty.server.port}\")\n    private int port;\n\n    @Autowired\n    private ClientManagerService clientManagerService;\n\n    @Autowired\n    private ConnectionManager connectionManager;\n\n    private ScheduledExecutorService scheduledExecutorService;\n\n    private ExecutorService simpleExecutor;\n\n    /**\n     * server bootstrap\n     */\n    private ServerBootstrap serverBootstrap;\n\n    /**\n     * channelFuture\n     */\n    private ChannelFuture channelFuture;\n\n    /**\n     * boss event loop group, boss group should not be daemon, need shutdown manually\n     */\n    private final EventLoopGroup bossGroup = NettyEventLoopUtil\n            .newEventLoopGroup(1, new NamedThreadFactory(\"Winner-netty-server-boss\", false));\n\n    /**\n     * worker event loop group. Reuse I/O worker threads between rpc servers.\n     */\n    private static final EventLoopGroup workerGroup = NettyEventLoopUtil.newEventLoopGroup(\n            Runtime.getRuntime().availableProcessors() * 2, new NamedThreadFactory(\"Winner-netty-server-worker\", true));\n\n    static\n    {\n        if (workerGroup instanceof NioEventLoopGroup)\n        {\n            ((NioEventLoopGroup) workerGroup).setIoRatio(NettyConfig.NETTY_IO_RATIO_DEFAULT);\n        }\n        else if (workerGroup instanceof EpollEventLoopGroup)\n        {\n            ((EpollEventLoopGroup) workerGroup).setIoRatio(NettyConfig.NETTY_IO_RATIO_DEFAULT);\n        }\n    }\n\n    @Override\n    public void destroy() throws Exception\n    {\n        stop();\n    }\n\n    @Override\n    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)\n    {\n        initNetty();\n        setHandler();\n        start();\n        // 启动后5S开始检查Netty server的状态，每个2两分钟执行一次\n        scheduledExecutorService.scheduleAtFixedRate(() -> check(), 1, 2, TimeUnit.MINUTES);\n    }\n\n    private void check()\n    {\n        if (!started.get())\n        {\n            log.info(\">>> Re start netty server!\");\n            start();\n        }\n    }\n\n    private void setHandler()\n    {\n\n        serverBootstrap.childHandler(new ChannelInitializer()\n        {\n            @Override\n            protected void initChannel(Channel channel) throws Exception\n            {\n                ChannelPipeline pipeline = channel.pipeline();\n\n                // 设置心跳，readerIdleTime：读空闲5S发起心跳处理，writerIdleTime：写空闲时间，allIdleTime：所有空闲时间,5S内没有 read动作，触发userEventTriggered动作\n                pipeline.addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));\n\n                //编解码\n                pipeline.addLast(CoderFactory.newDecoder());\n                pipeline.addLast(CoderFactory.newEncoder());\n\n                // 业务handler\n                pipeline.addLast(new ServiceHandler(clientManagerService, connectionManager));\n            }\n        });\n    }\n\n    private void start()\n    {\n        log.info(\">>>> Netty Server start......\");\n        try\n        {\n            this.channelFuture = this.serverBootstrap.bind(new InetSocketAddress(port)).sync();\n            started.set(this.channelFuture.isSuccess());\n            log.info(\">>>> Netty Server start successfully,Open port: {}\", port);\n        }\n        catch (InterruptedException e)\n        {\n            log.error(\">>>> Netty Server start failed!\");\n            log.error(\"Error message:\", e);\n        }\n    }\n\n    private void initNetty()\n    {\n        scheduledExecutorService = new ScheduledThreadPoolExecutor(1, NamedThreadFactory\n                .create(\"Scheduled check netty server-\", true));\n        simpleExecutor = Executors.newSingleThreadExecutor(new NamedThreadFactory(\"Netty server-\", true));\n\n        log.info(\">>>> Netty Server init......\");\n        this.serverBootstrap = new ServerBootstrap();\n        this.serverBootstrap.group(bossGroup, workerGroup).channel(NettyEventLoopUtil.getServerSocketChannelClass())\n                .option(ChannelOption.SO_BACKLOG, NettyConfig.TCP_SO_BACKLOG_DEFAULT)\n                .option(ChannelOption.SO_REUSEADDR, NettyConfig.TCP_SO_REUSEADDR_DEFAULT)\n                .childOption(ChannelOption.TCP_NODELAY, NettyConfig.TCP_NODELAY_DEFAULT)\n                .childOption(ChannelOption.SO_KEEPALIVE, NettyConfig.TCP_SO_KEEPALIVE_DEFAULT);\n\n        this.serverBootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)\n                .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);\n\n        this.serverBootstrap\n                .childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(NettyConfig.NETTY_BUFFER_LOW_WATERMARK_DEFAULT, NettyConfig.NETTY_BUFFER_HIGH_WATERMARK_DEFAULT));\n    }\n\n    private void stop()\n    {\n        log.warn(\">>> Stop Netty server..............\");\n        if (started.get())\n        {\n            workerGroup.shutdownGracefully();\n            bossGroup.shutdownGracefully();\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/util/NettyConfig.java",
    "content": "package com.xiao.custom.config.server.netty.util;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/30 14:57\n * @since JDK 1.8\n */\npublic class NettyConfig\n{\n    public static final int NETTY_IO_RATIO_DEFAULT = 70;\n\n    public static final int TCP_SO_BACKLOG_DEFAULT = 128;\n\n    public static final boolean TCP_SO_REUSEADDR_DEFAULT = true;\n\n    public static final boolean TCP_NODELAY_DEFAULT = true;\n\n    public static final boolean TCP_SO_KEEPALIVE_DEFAULT = true;\n\n    /**\n     * low.watermark默认大小为8388608，即8M；\n     * high.watermark默认大小为16777216，即16M\n     * 两个参数控制的是Channel.isWritable()方法\n     * https://www.jianshu.com/p/a1166c34ae46\n     */\n    public static final Integer NETTY_BUFFER_HIGH_WATERMARK_DEFAULT = 64 * 1024;\n    public static final Integer NETTY_BUFFER_LOW_WATERMARK_DEFAULT = 32 * 1024;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/util/NettyEventLoopUtil.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  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 */\npackage com.xiao.custom.config.server.netty.util;\n\nimport io.netty.bootstrap.ServerBootstrap;\nimport io.netty.channel.EventLoopGroup;\nimport io.netty.channel.epoll.*;\nimport io.netty.channel.nio.NioEventLoopGroup;\nimport io.netty.channel.socket.ServerSocketChannel;\nimport io.netty.channel.socket.SocketChannel;\nimport io.netty.channel.socket.nio.NioServerSocketChannel;\nimport io.netty.channel.socket.nio.NioSocketChannel;\n\nimport java.util.concurrent.ThreadFactory;\n\n/**\n * Utils for netty EventLoop\n *\n * @author YANGLiiN\n * @version $Id: NettyEventLoopUtil.java, v 1.5 2018-05-28 14:07 YANGLiiN $\n */\npublic class NettyEventLoopUtil\n{\n\n    /**\n     * check whether epoll enabled, and it would not be changed during runtime.\n     */\n    private static boolean epollEnabled = Epoll.isAvailable();\n\n    /**\n     * Create the right event loop according to current platform and system property, fallback to NIO when epoll not enabled.\n     *\n     * @param nThreads\n     * @param threadFactory\n     * @return an EventLoopGroup suitable for the current platform\n     */\n    public static EventLoopGroup newEventLoopGroup(int nThreads, ThreadFactory threadFactory)\n    {\n        return epollEnabled ?\n                new EpollEventLoopGroup(nThreads, threadFactory) :\n                new NioEventLoopGroup(nThreads, threadFactory);\n    }\n\n    /**\n     * @return a SocketChannel class suitable for the given EventLoopGroup implementation\n     */\n    public static Class<? extends SocketChannel> getClientSocketChannelClass()\n    {\n        return epollEnabled ? EpollSocketChannel.class : NioSocketChannel.class;\n    }\n\n    /**\n     * @return a ServerSocketChannel class suitable for the given EventLoopGroup implementation\n     */\n    public static Class<? extends ServerSocketChannel> getServerSocketChannelClass()\n    {\n        return epollEnabled ? EpollServerSocketChannel.class : NioServerSocketChannel.class;\n    }\n\n    /**\n     * Use {@link EpollMode#LEVEL_TRIGGERED} for server bootstrap if level trigger enabled by system properties,\n     * otherwise use {@link EpollMode#EDGE_TRIGGERED}.\n     *\n     * @param serverBootstrap server bootstrap\n     */\n    public static void enableTriggeredMode(ServerBootstrap serverBootstrap)\n    {\n        if (epollEnabled)\n        {\n            serverBootstrap.childOption(EpollChannelOption.EPOLL_MODE, EpollMode.EDGE_TRIGGERED);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/util/ProtostuffUtil.java",
    "content": "/*\n * Winner \n * 文件名  :ProtostuffUtil.java\n * 创建人  :llxiao\n * 创建时间:2018年5月2日\n*/\n\npackage com.xiao.custom.config.server.netty.util;\n\nimport com.dyuproject.protostuff.LinkedBuffer;\nimport com.dyuproject.protostuff.ProtostuffIOUtil;\nimport com.dyuproject.protostuff.Schema;\nimport com.dyuproject.protostuff.runtime.RuntimeSchema;\nimport org.objenesis.Objenesis;\nimport org.objenesis.ObjenesisStd;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * [简要描述]:序列化工具类（基于 Protostuff 实现）<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年5月2日\n * @since JDK 1.8\n */\npublic class ProtostuffUtil\n{\n    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();\n\n    private static Objenesis objenesis = new ObjenesisStd(true);\n\n    /**\n     * 获取类的schema\n     * \n     * @param cls\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    private static <T> Schema<T> getSchema(Class<T> cls)\n    {\n        Schema<T> schema = (Schema<T>) cachedSchema.get(cls);\n        if (schema == null)\n        {\n            schema = RuntimeSchema.createFrom(cls);\n            if (schema != null)\n            {\n                cachedSchema.put(cls, schema);\n            }\n        }\n        return schema;\n    }\n\n    /**\n     * [简要描述]:序列化（对象 -> 字节数组）<br/>\n     * [详细描述]:<br/>\n     * \n     * @author llxiao\n     * @param obj\n     *            序列化对象\n     * @return 对象字节数组\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> byte[] serialize(T obj)\n    {\n        Class<T> cls = (Class<T>) obj.getClass();\n        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);\n        try\n        {\n            Schema<T> schema = getSchema(cls);\n            return ProtostuffIOUtil.toByteArray(obj, schema, buffer);\n        }\n        catch (Exception e)\n        {\n            throw new IllegalStateException(e.getMessage(), e);\n        }\n        finally\n        {\n            buffer.clear();\n        }\n    }\n\n    /**\n     * [简要描述]:反序列化（字节数组 -> 对象）<br/>\n     * [详细描述]:<br/>\n     * \n     * @author llxiao\n     * @param data\n     *            数据\n     * @param cls\n     *            class对象\n     * @return class对象\n     */\n    public static <T> T deserialize(byte[] data, Class<T> cls)\n    {\n        try\n        {\n            /*\n             * 如果一个类没有参数为空的构造方法时候，那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的\n             * 通过ObjenesisStd可以完美的避开这个问题\n             */\n            T message = (T) objenesis.newInstance(cls);// 实例化\n            Schema<T> schema = getSchema(cls);// 获取类的schema\n            ProtostuffIOUtil.mergeFrom(data, message, schema);\n            return message;\n        }\n        catch (Exception e)\n        {\n            throw new IllegalStateException(e.getMessage(), e);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/netty/util/RemotingUtil.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  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 */\npackage com.xiao.custom.config.server.netty.util;\n\nimport io.netty.channel.Channel;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.net.*;\n\n/**\n * Some utilities for remoting.\n *\n * @author jiangping\n * @version $Id: RemotingUtil.java, v 0.1 Mar 30, 2016 11:51:02 AM jiangping Exp $\n */\npublic class RemotingUtil\n{\n\n    /**\n     * Parse the remote address of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteAddress(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final SocketAddress remote = channel.remoteAddress();\n        return doParse(remote != null ? remote.toString().trim() : StringUtils.EMPTY);\n    }\n\n    /**\n     * Parse the local address of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseLocalAddress(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final SocketAddress local = channel.localAddress();\n        return doParse(local != null ? local.toString().trim() : StringUtils.EMPTY);\n    }\n\n    /**\n     * Parse the remote host ip of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteIP(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getAddress().getHostAddress();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the remote hostname of the channel.\n     * <p>\n     * Note: take care to use this method, for a reverse name lookup takes uncertain time in {@link InetAddress#getHostName}.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseRemoteHostName(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getAddress().getHostName();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the local host ip of the channel.\n     *\n     * @param channel\n     * @return\n     */\n    public static String parseLocalIP(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return StringUtils.EMPTY;\n        }\n        final InetSocketAddress local = (InetSocketAddress) channel.localAddress();\n        if (local != null)\n        {\n            return local.getAddress().getHostAddress();\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the remote host port of the channel.\n     *\n     * @param channel\n     * @return int\n     */\n    public static int parseRemotePort(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return -1;\n        }\n        final InetSocketAddress remote = (InetSocketAddress) channel.remoteAddress();\n        if (remote != null)\n        {\n            return remote.getPort();\n        }\n        return -1;\n    }\n\n    /**\n     * Parse the local host port of the channel.\n     *\n     * @param channel\n     * @return int\n     */\n    public static int parseLocalPort(final Channel channel)\n    {\n        if (null == channel)\n        {\n            return -1;\n        }\n        final InetSocketAddress local = (InetSocketAddress) channel.localAddress();\n        if (local != null)\n        {\n            return local.getPort();\n        }\n        return -1;\n    }\n\n    /**\n     * Parse the socket address, omit the leading \"/\" if present.\n     * <p>\n     * e.g.1 /127.0.0.1:1234 -> 127.0.0.1:1234\n     * e.g.2 sofatest-2.stack.alipay.net/10.209.155.54:12200 -> 10.209.155.54:12200\n     *\n     * @param socketAddress\n     * @return String\n     */\n    public static String parseSocketAddressToString(SocketAddress socketAddress)\n    {\n        if (socketAddress != null)\n        {\n            return doParse(socketAddress.toString().trim());\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * Parse the host ip of socket address.\n     * <p>\n     * e.g. /127.0.0.1:1234 -> 127.0.0.1\n     *\n     * @param socketAddress\n     * @return String\n     */\n    public static String parseSocketAddressToHostIp(SocketAddress socketAddress)\n    {\n        final InetSocketAddress addrs = (InetSocketAddress) socketAddress;\n        if (addrs != null)\n        {\n            InetAddress addr = addrs.getAddress();\n            if (null != addr)\n            {\n                return addr.getHostAddress();\n            }\n        }\n        return StringUtils.EMPTY;\n    }\n\n    /**\n     * URL地址获取host信息\n     *\n     * @param url\n     * @return\n     */\n    public static String getHost(String url)\n    {\n        String host = \"\";\n        try\n        {\n            URL u = new URL(url);\n            host = u.getHost();\n        }\n        catch (MalformedURLException e)\n        {\n\n        }\n        return host;\n    }\n\n    /**\n     * <ol>\n     * <li>if an address starts with a '/', skip it.\n     * <li>if an address contains a '/', substring it.\n     * </ol>\n     *\n     * @param addr\n     * @return\n     */\n    private static String doParse(String addr)\n    {\n        if (StringUtils.isBlank(addr))\n        {\n            return StringUtils.EMPTY;\n        }\n        if (addr.charAt(0) == '/')\n        {\n            return addr.substring(1);\n        }\n        else\n        {\n            int len = addr.length();\n            for (int i = 1; i < len; ++i)\n            {\n                if (addr.charAt(i) == '/')\n                {\n                    return addr.substring(i + 1);\n                }\n            }\n            return addr;\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/service/RefreshService.java",
    "content": "package com.xiao.custom.config.server.service;\n\n/**\n * [简要描述]: 刷新操作\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 09:36\n * @since JDK 1.8\n */\npublic interface RefreshService\n{\n    /**\n     * [简要描述]:刷新服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ip :\n     * @param port :\n     * @return void\n     * llxiao  2019/4/4 - 9:44\n     **/\n    boolean refresh(String ip, int port);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/service/RepositoryService.java",
    "content": "package com.xiao.custom.config.server.service;\n\nimport java.util.Map;\n\n/**\n * [简要描述]: 资源服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/23 08:36\n * @since JDK 1.8\n */\npublic interface RepositoryService\n{\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ip : 服务IP\n     * @param application : 应用名称\n     * @param label : 标签默认master\n     * @param profile : 环境\n     * @return java.util.Map\n     * llxiao  2018/11/23 - 8:38\n     **/\n    Map<String, Object> getPropertySource(String ip, String application, String label, String profile);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/service/impl/JdbcRepositoryServiceImpl.java",
    "content": "package com.xiao.custom.config.server.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.xiao.custom.config.server.service.RepositoryService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.core.ResultSetExtractor;\nimport org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\n\n/**\n * [简要描述]: 资源获取，jdbc实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/23 08:39\n * @since JDK 1.8\n */\n@Slf4j\n@Service\npublic class JdbcRepositoryServiceImpl implements RepositoryService\n{\n    //区域查询\n    private static final String REGION_SQL = \"select region_id from t_server_host_config h where h.server_host = ?\";\n\n    //主配置查询\n    private static final String ITEM_GROUP_SQL =\n            \"select air.item_group_id from t_application ac STRAIGHT_JOIN t_application_item_group_relation air on ac.id = air.application_id where ac.region_id = (\"\n                    + REGION_SQL + \") and ac.application = ? and ac.label = ? and ac.profile = ?\";\n\n    // 配置组查询配置项\n    private static final String ITEM_ID_SQL = \"select cigr.item_id from t_config_item_group cig left join t_config_item_group_relation cigr on cig.id = cigr.group_id where cig.id in (:ids)\";\n\n    // 具体配置项内容查询\n    private static final String ITEM_SQL = \"select ci.item_key,ci.item_value from t_config_item ci where ci.status = 0 and ci.id in (:ids)\";\n\n    //IP、应用、环境查询主应用ID\n    private static final String QUERY_APPLICATION_ID = \"select app.id from t_application app where app.region_id = (select region_id from t_server_host_config h where h.server_host = ?) and app.application = ? and app.label = ? and app.profile = ?\";\n\n    //查询应用私有配置\n    private static final String PRIVATE_CONFIG_ITEM_SQL = \"select ac.item_key,ac.item_value from t_application_config ac where ac.application_id = :appId\";\n\n    @Autowired\n    private JdbcTemplate jdbcTemplate;\n\n    //返回结果获取long id结合\n    private ResultSetExtractor<List<Long>> tResultSetExtractor = rs ->\n    {\n        List<Long> itemGroups = new ArrayList<>();\n        while (rs.next())\n        {\n            itemGroups.add(rs.getLong(1));\n        }\n        return itemGroups;\n    };\n\n    //获取具体的资源集合\n    private ResultSetExtractor<Map<String, Object>> sourceExtractor = rs ->\n    {\n        Map<String, Object> map = new LinkedHashMap<>();\n        while (rs.next())\n        {\n            map.put(rs.getString(1), rs.getObject(2));\n        }\n        return map;\n    };\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ip : 服务IP\n     * @param application : 应用名称\n     * @param label : 标签默认master\n     * @param profile : 环境\n     * @return java.util.Map\n     * llxiao  2018/11/23 - 8:38\n     **/\n    @Override\n    public Map<String, Object> getPropertySource(String ip, String application, String label, String profile)\n    {\n        if (log.isDebugEnabled())\n        {\n            log.debug(\"Query config properties for Jdbc!\");\n            log.debug(\"[ip:{},application:{},label:{},profile:{}]\", ip, application, label, profile);\n        }\n        Map<String, Object> map = new HashMap<>();\n        // 公共配置项\n        List<Long> itemGroupIds = queryIds(ITEM_GROUP_SQL, ip, application, label, profile);\n        if (!CollectionUtils.isEmpty(itemGroupIds))\n        {\n            List<Long> itemIds = queryItemsForGroups(itemGroupIds);\n            if (!CollectionUtils.isEmpty(itemIds))\n            {\n                map = queryItems(itemIds);\n                if (log.isDebugEnabled())\n                {\n                    log.debug(\"Found public properties:{}\", map);\n                }\n            }\n        }\n\n        //私有配置项\n        Map<String, Object> privateItems = queryPrivateItems(ip, application, label, profile);\n        if (CollectionUtil.isNotEmpty(privateItems))\n        {\n            map.putAll(privateItems);\n            if (log.isDebugEnabled())\n            {\n                log.debug(\"Found private properties:{}\", privateItems);\n            }\n        }\n        return map;\n    }\n\n    //获取资源集合\n    private Map<String, Object> queryItems(List<Long> itemIds)\n    {\n        NamedParameterJdbcTemplate itemsTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);\n        Map<String, List<Long>> stringMap = new HashMap<>();\n        stringMap.put(\"ids\", itemIds);\n        return itemsTemplate.query(ITEM_SQL, stringMap, sourceExtractor);\n    }\n\n    //查询私有属性\n    private Map<String, Object> queryPrivateItems(String ip, String application, String label, String profile)\n    {\n        Map<String, Object> privateItems = new HashMap<>();\n        List<Long> appIds = queryIds(QUERY_APPLICATION_ID, ip, application, label, profile);\n        if (CollectionUtil.isNotEmpty(appIds) && appIds.size() == 1)\n        {\n            NamedParameterJdbcTemplate itemsTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);\n            Map<String, Long> params = new HashMap<>();\n            params.put(\"appId\", appIds.get(0));\n            privateItems = itemsTemplate.query(PRIVATE_CONFIG_ITEM_SQL, params, sourceExtractor);\n        }\n        return privateItems;\n    }\n\n    // 获取所有的Item 的ID集合\n    private List<Long> queryItemsForGroups(List<Long> itemGroupIds)\n    {\n        NamedParameterJdbcTemplate itemIdsTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);\n        Map<String, List<Long>> stringMap = new HashMap<>();\n        stringMap.put(\"ids\", itemGroupIds);\n        return itemIdsTemplate.queryForList(ITEM_ID_SQL, stringMap, Long.class);\n    }\n\n    //获取对应的配置项组列表\n    private List<Long> queryIds(String sql, String ip, String application, String label, String profile)\n    {\n        return jdbcTemplate.query(sql, new Object[] { ip, application, label, profile }, tResultSetExtractor);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/java/com/xiao/custom/config/server/service/impl/RefreshServiceImpl.java",
    "content": "package com.xiao.custom.config.server.service.impl;\n\nimport com.xiao.custom.config.server.netty.dto.CommandEnum;\nimport com.xiao.custom.config.server.netty.dto.Message;\nimport com.xiao.custom.config.server.netty.manager.Connection;\nimport com.xiao.custom.config.server.netty.manager.ConnectionManager;\nimport com.xiao.custom.config.server.service.RefreshService;\nimport io.netty.channel.Channel;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.Resource;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 09:45\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class RefreshServiceImpl implements RefreshService\n{\n    @Resource\n    private ConnectionManager connectionManager;\n\n    /**\n     * [简要描述]:刷新服务<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ip :\n     * @param port :\n     * @return void\n     * llxiao  2019/4/4 - 9:44\n     **/\n    @Override\n    public boolean refresh(String ip, int port)\n    {\n        boolean flag = false;\n        if (StringUtils.isNotBlank(ip))\n        {\n            Connection connection = connectionManager.getConnection(ip, port);\n            if (null != connection)\n            {\n                log.info(\">>> 服务端通知IP:{},PORT:{}的客户端刷新配置....\", connection.getServerIp(), connection.getServerPort());\n                Channel channel = connection.getChannel();\n                Message message = new Message();\n                message.setCommand(CommandEnum.REFRESH.getStatus());\n                message.setMessage(\"服务通知客户端发起刷新配置\");\n                channel.writeAndFlush(message);\n                flag = true;\n            }\n            else\n            {\n                log.error(\">>> 无法发起刷新配置请求，当前IP:{}和PORT:{}找不到对应的客户端信息...\", ip, port);\n            }\n        }\n        return flag;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-server/src/main/resources/application.yml",
    "content": "server:\n  port: 9000\n  #context-path: /config-server\nspring:\n  application:\n    name: config-server\n  #mysql\n  datasource:\n    url: jdbc:mysql://192.168.206.210:3306/config_center?useSSL=false&useUnicode=true&characterEncoding=UTF-8\n    username: admin\n    password: Admin@123\n    driver-class-name: com.mysql.jdbc.Driver\n    # 使用druid数据源\n    type: com.alibaba.druid.pool.DruidDataSource\n  ## spring-cloud config请求路径拦截配置，注册中心配置中心合并样式问题处理\n  cloud:\n    config:\n      server:\n        prefix: /config\n#netty服务端口，默认8999\nnetty:\n  server:\n    port: 8999\n\n##配置中心\neureka:\n  instance:\n    hostname: localhost\n    prefer-ip-address: true\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n  client:\n    register-with-eureka: true\n    fetch-registry: false\n    service-url:\n      defaultZone: http://localhost:9000/eureka/\n  server:\n    ##以下配置，生产环境不建议使用\n    ###自我保护机制关闭\n    enable-self-preservation: false\n    ## 清理间隔（单位毫秒，默认是60*1000）\n    eviction-interval-timer-in-ms: 20000\n##注册中心的日志error级别\n#logging.com.netflix.eureka.registry: ERROR\nlogging.level.com.netflix.eureka.registry: ERROR\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/README.md",
    "content": "1.配置管理提供个后台接口服务"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-service</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka-server</artifactId>\n        </dependency>\n        <!-- 配置中心 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n\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            <version>1.1.10</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis-spring</artifactId>\n            <version>1.3.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n            <version>1.3.1</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper-spring-boot-starter</artifactId>\n            <version>1.2.5</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.1.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>custom-config-pojo</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>4.1.12</version>\n            <scope>compile</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>custom-config-service</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/ConfigServiceApplication.java",
    "content": "package com.xiao.custom.config.service;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.web.client.RestTemplateBuilder;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * [简要描述]: 注册中心、配置中心一体化\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/21 11:37\n * @since JDK 1.8\n */\n@SpringBootApplication(scanBasePackages = \"com.xiao.custom.config\")\n@MapperScan(\"com.xiao.custom.config.pojo.mapper\")\n@EnableEurekaServer\npublic class ConfigServiceApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConfigServiceApplication.class, args);\n    }\n\n    // 启动的时候要注意，由于我们在controller中注入了RestTemplate，所以启动的时候需要实例化该类的一个实例\n    @Autowired\n    private RestTemplateBuilder builder;\n\n    // 使用RestTemplateBuilder来实例化RestTemplate对象，spring默认已经注入了RestTemplateBuilder实例\n    @Bean\n    public RestTemplate restTemplate()\n    {\n        return builder.build();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/ApplicationApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.entity.Application;\nimport com.xiao.custom.config.pojo.entity.ApplicationConfig;\nimport com.xiao.custom.config.pojo.query.AppQuery;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.service.service.ApplicationItemGroupRelationService;\nimport com.xiao.custom.config.service.service.ApplicationService;\nimport com.xiao.custom.config.service.service.ConfigItemGroupService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/28 10:18\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/application\")\n@Slf4j\npublic class ApplicationApi\n{\n    @Autowired\n    private ApplicationService applicationConfigService;\n    @Autowired\n    private ConfigItemGroupService configItemGroupService;\n    @Autowired\n    private ApplicationItemGroupRelationService applicationItemGroupRelationService;\n\n    /**\n     * [简要描述]:分页获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * jun.liu  2018/11/28 - 10:20\n     **/\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ApplicationDto> pageApplicationConfig(@RequestBody AppQuery appQuery)\n    {\n        return applicationConfigService.pageApplicationConfig(appQuery, appQuery.getPageNum(), appQuery.getPageSize());\n    }\n\n    /**\n     * [简要描述]:新增应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 10:29\n     **/\n    @RequestMapping(value = \"/save\")\n    public Boolean save(@RequestBody ApplicationDto applicationConfigDto)\n    {\n        if (StringUtils.isBlank(applicationConfigDto.getApplication()) || StringUtils\n                .isBlank(applicationConfigDto.getLabel()) || StringUtils.isBlank(applicationConfigDto.getProfile()))\n        {\n            log.info(\"新增应用失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        applicationConfigDto.setCreateTime(new Date());\n        String[] groupIdArr = null;\n        if (StringUtils.isNotBlank(applicationConfigDto.getGroupIds()))\n        {\n            groupIdArr = applicationConfigDto.getGroupIds().split(\",\");\n        }\n        int a = applicationConfigService.save(ApplicationDto.convertToEntity(applicationConfigDto), groupIdArr);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 14:54\n     **/\n    @RequestMapping(value = \"/update\")\n    public Boolean update(@RequestBody ApplicationDto applicationConfigDto)\n    {\n        if (null == applicationConfigDto.getId() || StringUtils.isBlank(applicationConfigDto.getApplication())\n                || StringUtils.isBlank(applicationConfigDto.getLabel()) || StringUtils\n                .isBlank(applicationConfigDto.getProfile()))\n        {\n            log.info(\"更新应用失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        Application applicationConfig = applicationConfigService\n                .selectApplicationConfigById(applicationConfigDto.getId());\n        if (applicationConfig == null)\n        {\n            log.info(\"通过id:\" + applicationConfigDto.getId() + \"获取应用失败\");\n            throw new RuntimeException(\"获取应用失败\");\n        }\n        applicationConfig.setUpdateTime(new Date());\n        applicationConfig.setRegionId(applicationConfigDto.getRegionId());\n        applicationConfig.setProfile(applicationConfigDto.getProfile());\n        applicationConfig.setLabel(applicationConfigDto.getLabel());\n        applicationConfig.setApplicationName(applicationConfigDto.getApplicationName());\n        applicationConfig.setApplication(applicationConfigDto.getApplication());\n        int a = applicationConfigService.update(applicationConfig);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 14:54\n     **/\n    @RequestMapping(value = \"/delete/{id}\")\n    public Boolean delete(@PathVariable(\"id\") Long id)\n    {\n        if (null == id)\n        {\n            log.info(\"删除应用失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        int a = applicationConfigService.delete(id);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:应用更新配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id : 应用主键ID\n     * @return boolean\n     * llxiao  2019/1/30 - 10:52\n     **/\n    @RequestMapping(\"/refresh\")\n    public boolean refresh(@RequestParam(\"id\") Long id)\n    {\n        return applicationConfigService.refresh(id);\n    }\n\n    /**\n     * [简要描述]:批量发布<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id : 客户端ID集合\n     * @return boolean\n     * llxiao  2019/3/27 - 20:05\n     **/\n    @RequestMapping(\"/batchRefresh\")\n    public boolean batchRefresh(@RequestBody Long[] id)\n    {\n        return this.applicationConfigService.batchRefresh(id);\n    }\n\n    /**\n     * [简要描述]:获取已绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 14:59\n     **/\n    @RequestMapping(value = \"/isRefApp\")\n    public PageInfo<ConfigItemGroupDto> pageRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        if (null == configItemGroupQuery.getAppId())\n        {\n            log.info(\"获取已绑定该应用的配置组失败,appId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return configItemGroupService\n                .pageRefGroupWithApp(configItemGroupQuery, configItemGroupQuery.getPageNum(), configItemGroupQuery\n                        .getPageSize());\n    }\n\n    /**\n     * [简要描述]:获取未绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:31\n     **/\n    @RequestMapping(value = \"/notRefApp\")\n    public PageInfo<ConfigItemGroupDto> pageNotRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        if (null == configItemGroupQuery.getAppId())\n        {\n            log.info(\"获取未绑定该应用的配置组失败,appId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return configItemGroupService\n                .pageNotRefGroupWithApp(configItemGroupQuery, configItemGroupQuery.getPageNum(), configItemGroupQuery\n                        .getPageSize());\n    }\n\n    /**\n     * [简要描述]:批量绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIds :\n     * @param appId :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 15:34\n     **/\n    @RequestMapping(value = \"/batchSaveRef\")\n    public Boolean batchSave(String groupIds, Long appId)\n    {\n        if (StringUtils.isBlank(groupIds) || null == appId)\n        {\n            log.info(\"绑定应用与配置组失败,{groupIds}、{appId}不能为空\", groupIds, appId);\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        Application applicationConfig = applicationConfigService.selectApplicationConfigById(appId);\n        if (null == applicationConfig)\n        {\n            log.info(\"绑定应用与配置组失败,{appId}找不到对应的应用信息\", appId);\n            return false;\n        }\n        String[] groupIdArr = groupIds.split(\",\");\n        int a = applicationItemGroupRelationService.batchSave(groupIdArr, appId);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:删除绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIds :\n     * @param appId :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 15:39\n     **/\n    @RequestMapping(value = \"/batchDeleteRef\")\n    public Boolean batchDelete(String groupIds, Long appId)\n    {\n        if (StringUtils.isBlank(groupIds) || null == appId)\n        {\n            log.info(\"删除应用与配置组失败,{groupIds}、{appId}不能为空\", groupIds, appId);\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        String[] groupIdArr = groupIds.split(\",\");\n        int a = applicationItemGroupRelationService.batchDelete(groupIdArr, appId);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:查收私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigQuery\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:01\n     **/\n    @RequestMapping(\"/queryPrivateConfig\")\n    public PageInfo<ApplicationConfigDto> queryPrivateConfig(@RequestBody ApplicationConfigQuery applicationConfigQuery)\n    {\n        return this.applicationConfigService.pageQuery(applicationConfigQuery);\n    }\n\n    /**\n     * [简要描述]:新增一条私有配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:06\n     **/\n    @RequestMapping(\"/savePrivateConfig\")\n    public Boolean savePrivateConfig(@RequestBody ApplicationConfigDto applicationConfigDto)\n    {\n        ApplicationConfig config = convertPrivateConf(applicationConfigDto);\n        return this.applicationConfigService.saveApplicationConfig(config);\n    }\n\n    /**\n     * [简要描述]:更新一条私有配置信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:06\n     **/\n    @RequestMapping(\"/updatePrivateConfig\")\n    public Boolean updatePrivateConfig(@RequestBody ApplicationConfigDto applicationConfigDto)\n    {\n        ApplicationConfig config = convertPrivateConf(applicationConfigDto);\n        return this.applicationConfigService.updateApplicationConfig(config);\n    }\n\n    /**\n     * [简要描述]:删除某项私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id : 私有属性主键ID\n     * @return java.lang.Boolean\n     * llxiao  2019/1/8 - 9:20\n     **/\n    @RequestMapping(\"/delPrivateConfig\")\n    public Boolean delPrivateConfig(@RequestParam(\"id\") Long id)\n    {\n        boolean flag = false;\n        if (null != id)\n        {\n            flag = this.applicationConfigService.delPrivateConfig(id);\n        }\n        return flag;\n    }\n\n    private ApplicationConfig convertPrivateConf(ApplicationConfigDto applicationConfigDto)\n    {\n        ApplicationConfig applicationConfig = new ApplicationConfig();\n        applicationConfig.setId(applicationConfigDto.getId());\n        applicationConfig.setApplicationId(applicationConfigDto.getApplicationId());\n        applicationConfig.setItemKey(applicationConfigDto.getItemKey());\n        applicationConfig.setItemValue(applicationConfigDto.getItemValue());\n        applicationConfig.setItemDesc(applicationConfigDto.getItemDesc());\n        applicationConfig.setCreateTime(applicationConfigDto.getCreateTime());\n        applicationConfig.setUpdateTime(applicationConfigDto.getUpdateTime());\n        return applicationConfig;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/AuthApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.service.service.AuthService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]: 鉴权服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 17:56\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/auth\")\n@Slf4j\npublic class AuthApi\n{\n    @Autowired\n    private AuthService authService;\n\n    /**\n     * 根据用户名查找用户\n     *\n     * @param username\n     * @return\n     */\n    @RequestMapping(\"/findByUsername\")\n    public AuthUser findByUsername(@RequestParam(\"username\") String username)\n    {\n        return authService.findByUsername(username);\n    }\n\n    /**\n     * 创建新用户\n     *\n     * @param userDetail\n     */\n    @RequestMapping(\"/insert\")\n    public void insert(@RequestBody AuthUser userDetail)\n    {\n        authService.insert(userDetail);\n    }\n\n    /**\n     * 创建用户角色\n     *\n     * @param userId\n     * @param roleId\n     * @return\n     */\n    @RequestMapping(\"/insertRole\")\n    public int insertRole(@RequestParam(\"userId\") long userId, @RequestParam(\"roleId\") long roleId)\n    {\n        return authService.insertRole(userId, roleId);\n    }\n\n    /**\n     * 根据角色id查找角色\n     *\n     * @param roleId\n     * @return\n     */\n    @RequestMapping(\"/findRoleById\")\n    public Role findRoleById(long roleId)\n    {\n        return authService.findRoleById(roleId);\n    }\n\n    /**\n     * 根据用户id查找该用户角色\n     *\n     * @param userId\n     * @return\n     */\n    @RequestMapping(\"/findRoleByUserId\")\n    public Role findRoleByUserId(long userId)\n    {\n        return authService.findRoleByUserId(userId);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/ClientHostApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\nimport com.xiao.custom.config.service.service.ClientHostService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 15:36\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/clientInfo\")\n@Slf4j\npublic class ClientHostApi\n{\n    @Autowired\n    private ClientHostService clientHostService;\n\n    /**\n     * 分页查询客户端信息\n     *\n     * @param query\n     * @return\n     */\n    @RequestMapping(\"/page\")\n    public PageInfo<ClientHostInfoDto> pageQuery(@RequestBody ClientHostInfoQuery query)\n    {\n        return clientHostService.pageQuery(query);\n    }\n\n    /**\n     * [简要描述]:删除数据<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/3/27 - 15:46\n     **/\n    @RequestMapping(\"/del\")\n    public boolean deleteById(@RequestParam(\"id\") Long id)\n    {\n        if (null != id)\n        {\n            clientHostService.delete(id);\n        }\n        else\n        {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/ConfigItemApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItem;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.service.service.ConfigItemService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 10:44\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/configItem\")\n@Slf4j\npublic class ConfigItemApi\n{\n    @Autowired\n    private ConfigItemService configItemService;\n\n    /**\n     * [简要描述]:分页获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/27 - 10:54\n     **/\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ConfigItemDto> pageConfigItem(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        return configItemService\n                .pageConfigItem(configItemQuery, configItemQuery.getPageNum(), configItemQuery.getPageSize());\n    }\n\n    /**\n     * [简要描述]:新增<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 13:53\n     **/\n    @RequestMapping(value = \"/save\")\n    public Boolean save(@RequestBody ConfigItemDto configItemDto)\n    {\n        if (StringUtils.isBlank(configItemDto.getItemKey()) || StringUtils.isBlank(configItemDto.getItemValue()))\n        {\n            log.info(\"新增配置项失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        configItemDto.setCreateTime(new Date());\n        int a = configItemService.save(ConfigItemDto.convertToEntity(configItemDto));\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 14:06\n     **/\n    @RequestMapping(value = \"/update\")\n    public Boolean update(@RequestBody ConfigItemDto configItemDto)\n    {\n        if (null == configItemDto.getId() || StringUtils.isBlank(configItemDto.getItemKey()) || StringUtils\n                .isBlank(configItemDto.getItemValue()))\n        {\n            log.info(\"修改配置项失败,id:{}、key:{}、value:{}不能为空\", configItemDto.getId(), configItemDto\n                    .getItemKey(), configItemDto.getItemValue());\n            throw new RuntimeException(\"修改配置项失败,参数不能为空\");\n        }\n        ConfigItem configItem = configItemService.getConfigItemById(configItemDto.getId());\n        if (configItem == null)\n        {\n            log.info(\"通过id:\" + configItemDto.getId() + \",获取configItem失败\");\n            throw new RuntimeException(\"获取对象失败\");\n        }\n        configItem.setItemValue(configItemDto.getItemValue());\n        configItem.setItemKey(configItemDto.getItemKey());\n        configItem.setItemDesc(configItemDto.getItemDesc());\n        configItem.setItemType(configItemDto.getItemType());\n        configItem.setUpdateTime(new Date());\n        int a = configItemService.update(configItem);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:删除配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ids :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 14:39\n     **/\n    @RequestMapping(value = \"/batchDelete/{ids}\")\n    public Integer enableOrDisable(@PathVariable(\"ids\") String ids)\n    {\n        if (StringUtils.isBlank(ids))\n        {\n            log.info(\"启用/禁用配置项失败,数据为空\");\n            throw new RuntimeException(\"数据不能为空\");\n        }\n        String[] idArr = ids.split(\",\");\n        int a = configItemService.batchDelete(idArr);\n        return idArr.length - a;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/ConfigItemGroupApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroup;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.service.service.ConfigItemGroupRelationService;\nimport com.xiao.custom.config.service.service.ConfigItemGroupService;\nimport com.xiao.custom.config.service.service.ConfigItemService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 15:31\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/configItemGroup\")\n@Slf4j\npublic class ConfigItemGroupApi\n{\n    @Autowired\n    private ConfigItemGroupService configItemGroupService;\n    @Autowired\n    private ConfigItemService configItemService;\n    @Autowired\n    private ConfigItemGroupRelationService configItemGroupRelationService;\n\n    /**\n     * [简要描述]:分页获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/27 - 15:35\n     **/\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ConfigItemGroupDto> pageConfigItemGroup(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        return configItemGroupService\n                .pageConfigItemGroup(configItemGroupQuery, configItemGroupQuery.getPageNum(), configItemGroupQuery\n                        .getPageSize());\n    }\n\n    /**\n     * [简要描述]:保存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 15:44\n     **/\n    @RequestMapping(value = \"/save\")\n    public Boolean save(@RequestBody ConfigItemGroupDto configItemGroupDto)\n    {\n        if (StringUtils.isBlank(configItemGroupDto.getGroupName()))\n        {\n            log.info(\"新增配置组失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        configItemGroupDto.setCreateTime(new Date());\n        int a = configItemGroupService.save(ConfigItemGroupDto.convertToEntity(configItemGroupDto));\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:获取组信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return com.winner.config.center.pojo.db.dto.ConfigItemGroupDto\n     * jun.liu  2018/12/13 - 9:48\n     **/\n    @RequestMapping(value = \"/select/{id}\")\n    public ConfigItemGroupDto getConfigItemGroupById(@PathVariable(\"id\") Long id)\n    {\n        if (null == id)\n        {\n            log.info(\"获取组失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return ConfigItemGroupDto.convertToDto(configItemGroupService.getConfigItemGroupById(id));\n    }\n\n    /**\n     * [简要描述]:更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 16:08\n     **/\n    @RequestMapping(value = \"/update\")\n    public Boolean update(@RequestBody ConfigItemGroupDto configItemGroupDto)\n    {\n        if (StringUtils.isBlank(configItemGroupDto.getGroupName()) || StringUtils\n                .isBlank(configItemGroupDto.getGroupDesc()))\n        {\n            log.info(\"修改配置组失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        ConfigItemGroup configItemGroup = configItemGroupService.getConfigItemGroupById(configItemGroupDto.getId());\n        if (configItemGroup == null)\n        {\n            log.info(\"通过id:\" + configItemGroupDto.getId() + \",获取对象失败\");\n            throw new RuntimeException(\"获取对象失败\");\n        }\n        configItemGroup.setGroupName(configItemGroupDto.getGroupName());\n        configItemGroup.setGroupDesc(configItemGroupDto.getGroupDesc());\n        configItemGroup.setUpdateTime(new Date());\n        int a = configItemGroupService.update(configItemGroup);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param ids :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/27 - 16:19\n     **/\n    @RequestMapping(value = \"/delete/{ids}\")\n    public Integer delete(@PathVariable(\"ids\") String ids)\n    {\n        if (StringUtils.isBlank(ids))\n        {\n            log.info(\"删除失败,id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        String[] idArr = ids.split(\",\");\n        int a = configItemGroupService.batchDelete(idArr);\n        a = idArr.length - a;\n        //返回0表示全部删除成功，否则返回对应失败的数量。\n        return a;\n    }\n\n    /**\n     * [简要描述]:获取已关联当前group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/27 - 16:38\n     **/\n    @RequestMapping(value = \"/isRefGroup\")\n    public PageInfo<ConfigItemDto> pageRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        if (null == configItemQuery.getGroupId())\n        {\n            log.info(\"获取已关联当前group的配置项失败，groupId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return configItemService\n                .pageRefConfigItemWithGroup(configItemQuery, configItemQuery.getPageNum(), configItemQuery\n                        .getPageSize());\n    }\n\n    /**\n     * [简要描述]:获取未关联当前group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/28 - 10:01\n     **/\n    @RequestMapping(value = \"/notRefGroup\")\n    public PageInfo<ConfigItemDto> pageNotRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        if (null == configItemQuery.getGroupId())\n        {\n            log.info(\"获取未关联当前group的配置项失败，groupId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return configItemService\n                .pageNotRefConfigItemWithGroup(configItemQuery, configItemQuery.getPageNum(), configItemQuery\n                        .getPageSize());\n    }\n\n    /**\n     * [简要描述]:行政配置项和组的绑定关系<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 9:26\n     **/\n    @RequestMapping(value = \"/batchSave/{groupId}/{itemIds}\")\n    public Boolean batchSave(@PathVariable(\"itemIds\") String itemIds, @PathVariable(\"groupId\") Long groupId)\n    {\n        if (StringUtils.isBlank(itemIds) || groupId == null)\n        {\n            log.info(\"新增配置项和组绑定关系失败，itemIds和groupId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        String[] itemIdArr = itemIds.split(\",\");\n        int a = configItemGroupRelationService.batchSave(itemIdArr, groupId);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemIds :\n     * @param groupId :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 15:12\n     **/\n    @RequestMapping(value = \"/batchDelete/{groupId}/{itemIds}\")\n    public Boolean batchDelete(@PathVariable(\"itemIds\") String itemIds, @PathVariable(\"groupId\") Long groupId)\n    {\n        if (StringUtils.isBlank(itemIds) || groupId == null)\n        {\n            log.info(\"删除配置项和组绑定关系失败，itemIds和groupId不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        String[] itemIdArr = itemIds.split(\",\");\n        int a = configItemGroupRelationService.batchDelete(itemIdArr, groupId);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/RegionApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.entity.Region;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\nimport com.xiao.custom.config.service.service.RegionService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n/**\n * [简要描述]:区域管理\n * [详细描述]:区域管理\n *\n * @author jyqiao\n * @version 1.0, 2018年11月27日 上午11:29:12\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/region\")\n@Slf4j\npublic class RegionApi\n{\n    @Autowired\n    private RegionService regionService;\n\n    //分页查询区域\n    @RequestMapping(value = \"/queryRegion\")\n    public PageInfo<RegionDto> queryRegion(@RequestBody RegionQuery regionQuery)\n    {\n        return regionService.pageRegion(regionQuery, regionQuery.getPageNum(), regionQuery.getPageSize());\n    }\n\n    /**\n     * [简要描述]:查询所有的region\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.RegionDto>\n     * mjye  2018/12/21 - 17:00\n     **/\n    @RequestMapping(value = \"/selectRgion\")\n    public List<RegionDto> selectRgion()\n    {\n        return regionService.selectRegion();\n    }\n\n    //删除区域\n    @PostMapping(value = \"/delectRegion/{ids}\")\n    public Boolean delectRegion(@PathVariable(\"ids\") String ids)\n    {\n        if (null == ids)\n        {\n            log.info(\"删除区域信息失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        String[] idArr = ids.split(\",\");\n        int a = regionService.batchDelete(idArr);\n        if (a > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    //更新区域信息\n    @PostMapping(value = \"/updateRegion\")\n    public Boolean updateRegion(@RequestBody RegionDto regionDto)\n    {\n        if (null == regionDto.getId() || StringUtils.isBlank(regionDto.getRegionDesc()) || StringUtils\n                .isBlank(regionDto.getRegionName()) || null == regionDto.getCreateTime())\n        {\n            log.info(\"更改区域信息失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n\n        }\n        int b = regionService.update(regionDto);\n\n        if (b > 0)\n        {\n            return true;\n        }\n        return false;\n\n    }\n\n    //新增区域信息\n    @PostMapping(value = \"/addRegion\")\n    public Boolean addRegion(@RequestBody RegionDto regionDto)\n    {\n        if (StringUtils.isBlank(regionDto.getRegionDesc()) || StringUtils.isBlank(regionDto.getRegionName()))\n        {\n            log.info(\"新增区域信息失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n\n        }\n        int b = regionService.save(regionDto);\n        if (b > 0)\n        {\n            return true;\n        }\n        return false;\n\n    }\n    //根据id查询区域信息\n\n    @RequestMapping(value = \"selectRegionById/{id}\")\n    public RegionDto selectRegionById(@PathVariable Long id)\n    {\n        if (null == id)\n        {\n            log.info(\"获取区域信息失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n\n        return RegionToDto(regionService.selectRegionById(id));\n    }\n\n    //po转dto\n    public RegionDto RegionToDto(Region region)\n    {\n        RegionDto regionDto = new RegionDto();\n        regionDto.setId(region.getId());\n        regionDto.setCreateTime(region.getCreateTime());\n        regionDto.setRegionDesc(region.getRegionDesc());\n        regionDto.setRegionName(region.getRegionName());\n        regionDto.setUpdateTime(region.getUpdateTime());\n\n        return regionDto;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/api/ServerHostConfigApi.java",
    "content": "package com.xiao.custom.config.service.api;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.entity.ServerHostConfig;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\nimport com.xiao.custom.config.service.service.ServerHostConfigService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\n/**\n * [简要描述]:服务管理\n * [详细描述]:服务管理\n *\n * @author jyqiao\n * @version 1.0, 2018年11月27日\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/serverHostConfig\")\n@Slf4j\npublic class ServerHostConfigApi\n{\n\n    @Autowired\n    private ServerHostConfigService serverHostConfigService;\n\n    //分页查询\n    @RequestMapping(value = \"/queryServerHost\")\n    public PageInfo<ServerHostConfigDto> queryServerHost(@RequestBody ServerHostConfigQuery serverHostConfigQuery)\n    {\n\n        return serverHostConfigService\n                .pageServerHostConfig(serverHostConfigQuery, serverHostConfigQuery.getPageNum(), serverHostConfigQuery\n                        .getPageSize());\n    }\n\n    //删除服务管理\n    @RequestMapping(value = \"/delectServerHostConfig/{id}\")\n    public int delectServerHostConfig(@PathVariable(\"id\") Long id)\n    {\n        if (null == id)\n        {\n            log.info(\"删除服务管理失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return serverHostConfigService.delete(id);\n    }\n\n    //更改服务管理\n    @PostMapping(value = \"/updateServerHostConfig\")\n    public Boolean updateServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto)\n    {\n        if (null == serverHostConfigDto.getId() || StringUtils.isBlank(serverHostConfigDto.getServerDesc())\n                || StringUtils.isBlank(serverHostConfigDto.getServerHost()) || null == serverHostConfigDto\n                .getRegionId())\n        {\n            log.info(\"更改服务管理失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n\n        }\n        int b = serverHostConfigService.update(serverHostConfigDto);\n\n        if (b > 0)\n        {\n            return true;\n        }\n        return false;\n    }\n\n    //添加服务管理\n    @PostMapping(value = \"/addServerHostConfig\")\n    public Boolean addServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto)\n    {\n        if (StringUtils.isBlank(serverHostConfigDto.getServerDesc()) || StringUtils\n                .isBlank(serverHostConfigDto.getServerHost()) || null == serverHostConfigDto.getRegionId())\n        {\n            log.info(\"新增服务管理失败,参数不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n\n        }\n        int b = serverHostConfigService.save(serverHostConfigDto);\n        if (b > 0)\n        {\n            return true;\n        }\n        return false;\n\n    }\n\n    @RequestMapping(value = \"/selectServerHostConfigById/{id}\")\n    public ServerHostConfigDto selectServerHostConfigById(@PathVariable(\"id\") Long id)\n    {\n        if (null == id)\n        {\n            log.info(\"获取服务管理失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n\n        return serverHostConfigToDto(serverHostConfigService.selectServerHostConfigById(id));\n\n    }\n\n    //po转dto\n    public ServerHostConfigDto serverHostConfigToDto(ServerHostConfig serverHostConfig)\n    {\n        ServerHostConfigDto serverHostConfigDto = new ServerHostConfigDto();\n        serverHostConfigDto.setId(serverHostConfig.getId());\n        serverHostConfigDto.setRegionId(serverHostConfig.getRegionId());\n        serverHostConfigDto.setCreateTime(serverHostConfig.getCreateTime());\n        serverHostConfigDto.setServerDesc(serverHostConfig.getServerDesc());\n        serverHostConfigDto.setServerHost(serverHostConfig.getServerHost());\n        serverHostConfigDto.setUpdateTime(serverHostConfig.getUpdateTime());\n\n        return serverHostConfigDto;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/feign/RefreshFeign.java",
    "content": "package com.xiao.custom.config.service.feign;\n\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]: 刷新客户端，调用配置中心的API\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/4 11:10\n * @since JDK 1.8\n */\n@FeignClient(value = \"winner-config-server\")\n@RequestMapping(\"/refresh\")\npublic interface RefreshFeign\n{\n    @RequestMapping(\"/client\")\n    boolean refresh(@RequestParam(\"ip\") String ip, @RequestParam(\"port\") int port);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ApplicationItemGroupRelationService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 08:58\n * @since JDK 1.8\n */\npublic interface ApplicationItemGroupRelationService\n{\n    Integer save(ApplicationItemGroupRelation applicationItemGroupRelation);\n\n    Integer update(ApplicationItemGroupRelation applicationItemGroupRelation);\n\n    void delete(Long id);\n\n    /**\n     * [简要描述]:批量绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIdArr :\n     * @param appId      :\n     * @return int\n     * jun.liu  2018/11/28 - 15:38\n     **/\n    int batchSave(String[] groupIdArr, Long appId);\n\n    /**\n     * [简要描述]:删除绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIdArr :\n     * @param appId      :\n     * @return int\n     * jun.liu  2018/11/28 - 15:41\n     **/\n    int batchDelete(String[] groupIdArr, Long appId);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ApplicationService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.entity.Application;\nimport com.xiao.custom.config.pojo.entity.ApplicationConfig;\nimport com.xiao.custom.config.pojo.query.AppQuery;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 16:47\n * @since JDK 1.8\n */\npublic interface ApplicationService\n{\n    /**\n     * [简要描述]:保存<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfig :\n     * @return java.lang.Integer\n     * jun.liu  2018/11/26 - 16:52\n     **/\n    Integer save(Application applicationConfig, String[] groupIdArr);\n\n    Integer update(Application applicationConfig);\n\n    Integer delete(Long id);\n\n    PageInfo<ApplicationDto> pageApplicationConfig(AppQuery appQuery, Integer pageNum, Integer pageSize);\n\n    /**\n     * [简要描述]:通过id获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return com.winner.config.center.pojo.db.entity.ApplicationConfig\n     * jun.liu  2018/11/28 - 14:50\n     **/\n    Application selectApplicationConfigById(Long id);\n\n    /**\n     * [简要描述]:分页查询应用关联的私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param query :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * llxiao  2019/1/7 - 15:27\n     **/\n    PageInfo<ApplicationConfigDto> pageQuery(ApplicationConfigQuery query);\n\n    /**\n     * [简要描述]:保存应用的私有配置信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfig :\n     * @return boolean\n     * llxiao  2019/1/7 - 16:56\n     **/\n    boolean saveApplicationConfig(ApplicationConfig applicationConfig);\n\n    /**\n     * [简要描述]:主键更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfig :\n     * @return boolean\n     * llxiao  2019/1/7 - 16:58\n     **/\n    boolean updateApplicationConfig(ApplicationConfig applicationConfig);\n\n    /**\n     * [简要描述]:删除私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/1/8 - 9:21\n     **/\n    boolean delPrivateConfig(Long id);\n\n    /**\n     * [简要描述]:全部发布配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/1/30 - 10:53\n     **/\n    boolean refresh(Long id);\n\n    /**\n     * [简要描述]:指定客户端按户型配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostInfoIds : 客户端信息\n     * @return boolean\n     * llxiao  2019/3/27 - 14:06\n     **/\n    boolean batchRefresh(Long... hostInfoIds);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/AuthService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\n\n/**\n * [简要描述]: 鉴权服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 17:53\n * @since JDK 1.8\n */\npublic interface AuthService\n{\n    /**\n     * 根据用户名查找用户\n     *\n     * @param username\n     * @return\n     */\n    AuthUser findByUsername(String username);\n\n    /**\n     * 创建新用户\n     *\n     * @param userDetail\n     */\n    void insert(AuthUser userDetail);\n\n    /**\n     * 创建用户角色\n     *\n     * @param userId\n     * @param roleId\n     * @return\n     */\n    int insertRole(long userId, long roleId);\n\n    /**\n     * 根据角色id查找角色\n     *\n     * @param roleId\n     * @return\n     */\n    Role findRoleById(long roleId);\n\n    /**\n     * 根据用户id查找该用户角色\n     *\n     * @param userId\n     * @return\n     */\n    Role findRoleByUserId(long userId);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ClientHostService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\n\n/**\n * [简要描述]: 客户端连接服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 14:13\n * @since JDK 1.8\n */\npublic interface ClientHostService\n{\n    /**\n     * 分页查询客户端信息\n     *\n     * @param query\n     * @return\n     */\n    PageInfo<ClientHostInfoDto> pageQuery(ClientHostInfoQuery query);\n\n    /**\n     * 删除客户端连接信息\n     *\n     * @param id\n     */\n    void delete(long id);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ConfigItemGroupRelationService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:41\n * @since JDK 1.8\n */\npublic interface ConfigItemGroupRelationService\n{\n    Integer save(ConfigItemGroupRelation configItemGroupRelation);\n\n    Integer update(ConfigItemGroupRelation configItemGroupRelation);\n\n    void delete(Long id);\n\n    /**\n     * [简要描述]:批量绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemIdArr :\n     * @param groupId   :\n     * @return int\n     * jun.liu  2018/11/28 - 9:31\n     **/\n    int batchSave(String[] itemIdArr, Long groupId);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param itemIdArr :\n     * @param groupId   :\n     * @return int\n     * jun.liu  2018/11/28 - 15:13\n     **/\n    int batchDelete(String[] itemIdArr, Long groupId);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ConfigItemGroupService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroup;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:51\n * @since JDK 1.8\n */\npublic interface ConfigItemGroupService\n{\n    Integer save(ConfigItemGroup configItemGroup);\n\n    Integer update(ConfigItemGroup configItemGroup);\n\n    Integer delete(Long id);\n\n    PageInfo<ConfigItemGroupDto> pageConfigItemGroup(ConfigItemGroupQuery configItemGroupQuery, Integer pageNum,\n            Integer pageSize);\n\n    /**\n     * [简要描述]:通过id获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return com.winner.config.center.pojo.db.entity.ConfigItemGroup\n     * jun.liu  2018/11/27 - 16:14\n     **/\n    ConfigItemGroup getConfigItemGroupById(Long id);\n\n    /**\n     * [简要描述]:获取已绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @param pageNum              :\n     * @param pageSize             :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:02\n     **/\n    PageInfo<ConfigItemGroupDto> pageRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery, int pageNum,\n            int pageSize);\n\n    /**\n     * [简要描述]:获取未绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @param pageNum              :\n     * @param pageSize             :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:02\n     **/\n    PageInfo<ConfigItemGroupDto> pageNotRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery, int pageNum,\n            int pageSize);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * jun.liu  2018/12/21 - 15:18\n     **/\n    int batchDelete(String[] idArr);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ConfigItemService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItem;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:35\n * @since JDK 1.8\n */\npublic interface ConfigItemService\n{\n    Integer save(ConfigItem configItem);\n\n    Integer update(ConfigItem configItem);\n\n    void delete(Long id);\n\n    PageInfo<ConfigItemDto> pageConfigItem(ConfigItemQuery configItemQuery, Integer pageNum, Integer pageSize);\n\n    /**\n     * [简要描述]:通过id获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return com.winner.config.center.pojo.db.entity.ConfigItem\n     * jun.liu  2018/11/27 - 14:25\n     **/\n    ConfigItem getConfigItemById(Long id);\n\n    /**\n     * [简要描述]:分页获取已关联group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @param pageNum :\n     * @param pageSize :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/27 - 16:44\n     **/\n    PageInfo<ConfigItemDto> pageRefConfigItemWithGroup(ConfigItemQuery configItemQuery, int pageNum, int pageSize);\n\n    /**\n     * [简要描述]:分页获取未关联group的配置项<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemQuery :\n     * @param pageNum :\n     * @param pageSize :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemDto>\n     * jun.liu  2018/11/28 - 10:03\n     **/\n    PageInfo<ConfigItemDto> pageNotRefConfigItemWithGroup(ConfigItemQuery configItemQuery, int pageNum, int pageSize);\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * jun.liu  2018/12/20 - 19:16\n     **/\n    int batchDelete(String[] idArr);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/RegionService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.entity.Region;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\n\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:22\n * @since JDK 1.8\n */\npublic interface RegionService\n{\n    int save(RegionDto regionDto);\n\n    int update(RegionDto regionDto);\n\n    int delete(Long id);\n    Region selectRegionById(Long id);\n\n    PageInfo<RegionDto> pageRegion(RegionQuery regionQuery, Integer pageNum, Integer pageSize);\n\n    List<RegionDto> selectRegion();\n\n    int batchDelete(String[] idArr);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/ServerHostConfigService.java",
    "content": "package com.xiao.custom.config.service.service;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.entity.ServerHostConfig;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:45\n * @since JDK 1.8\n */\npublic interface ServerHostConfigService\n{\n    int save(ServerHostConfigDto serverHostConfigDto);\n\n    int update(ServerHostConfigDto serverHostConfigDto);\n    /**\n     * [简要描述]:通过id获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return \n     * jyqiao\n     **/\n    ServerHostConfig selectServerHostConfigById(Long id);\n    int delete(Long id);\n\n    PageInfo<ServerHostConfigDto> pageServerHostConfig(ServerHostConfigQuery serverHostConfigQuery, Integer pageNum,\n            Integer pageSize);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ApplicationItemGroupRelationServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.xiao.custom.config.pojo.entity.ApplicationItemGroupRelation;\nimport com.xiao.custom.config.pojo.mapper.ApplicationItemGroupRelationMapper;\nimport com.xiao.custom.config.service.service.ApplicationItemGroupRelationService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:03\n * @since JDK 1.8\n */\n@Service\npublic class ApplicationItemGroupRelationServiceImpl implements ApplicationItemGroupRelationService\n{\n    @Autowired\n    private ApplicationItemGroupRelationMapper applicationItemGroupRelationMapper;\n\n    @Override\n    public Integer save(ApplicationItemGroupRelation applicationItemGroupRelation)\n    {\n        return applicationItemGroupRelationMapper.insert(applicationItemGroupRelation);\n    }\n\n    @Override\n    public Integer update(ApplicationItemGroupRelation applicationItemGroupRelation)\n    {\n        return applicationItemGroupRelationMapper.updateByPrimaryKey(applicationItemGroupRelation);\n    }\n\n    @Override\n    public void delete(Long id)\n    {\n        applicationItemGroupRelationMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public int batchSave(String[] groupIdArr, Long appId)\n    {\n        return applicationItemGroupRelationMapper.batchSave(groupIdArr, appId);\n    }\n\n    @Override\n    public int batchDelete(String[] groupIdArr, Long appId)\n    {\n        return applicationItemGroupRelationMapper.batchDelete(groupIdArr, appId);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ApplicationServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.entity.Application;\nimport com.xiao.custom.config.pojo.entity.ApplicationConfig;\nimport com.xiao.custom.config.pojo.entity.ClientHostInfo;\nimport com.xiao.custom.config.pojo.mapper.*;\nimport com.xiao.custom.config.pojo.query.AppQuery;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\nimport com.xiao.custom.config.service.feign.RefreshFeign;\nimport com.xiao.custom.config.service.service.ApplicationService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]: 应用服务\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 16:47\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class ApplicationServiceImpl implements ApplicationService\n{\n    /**\n     * 刷新配置接口常量\n     */\n    private static final String REFRESH_URL = \"/config/refresh\";\n    private static final int SUCCESS = 0;\n    private static final int HTTP_SUCCESS_CODE = 200;\n    private static final int SERVICE_DOWN = 1;\n\n    @Autowired\n    private ApplicationMapper applicationMapper;\n    @Autowired\n    private ApplicationItemGroupRelationMapper applicationItemGroupRelationMapper;\n\n    @Autowired\n    private ApplicationConfigMapper applicationConfigMapper;\n\n    @Autowired\n    private ClientHostInfoMapper clientHostInfoMapper;\n\n    @Autowired\n    private ClientApplicationMapper clientApplicationMapper;\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    @Autowired\n    private RefreshFeign refreshFeign;\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public Integer save(Application applicationConfig, String[] groupIdArr)\n    {\n        int a = applicationMapper.insert(applicationConfig);\n        if (groupIdArr != null && groupIdArr.length > 0 && a > 0)\n        {\n            Long appId = applicationConfig.getId();\n            return applicationItemGroupRelationMapper.batchSave(groupIdArr, appId);\n        }\n        return a;\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public Integer update(Application applicationConfig)\n    {\n        return applicationMapper.updateByPrimaryKey(applicationConfig);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public Integer delete(Long id)\n    {\n        int delFlag = applicationMapper.deleteByPrimaryKey(id);\n        if (delFlag > 0)\n        {\n            //删除关联应用的配置组信息\n            applicationItemGroupRelationMapper.deleteByAppId(id);\n        }\n        return delFlag;\n    }\n\n    @Override\n    public PageInfo<ApplicationDto> pageApplicationConfig(AppQuery appQuery, Integer pageNum, Integer pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        return new PageInfo<>(applicationMapper.pageApplicationConfig(appQuery));\n    }\n\n    @Override\n    public Application selectApplicationConfigById(Long id)\n    {\n        return applicationMapper.selectByPrimaryKey(id);\n    }\n\n    /**\n     * [简要描述]:分页查询应用关联的私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param query :\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * llxiao  2019/1/7 - 15:27\n     **/\n    @Override\n    public PageInfo<ApplicationConfigDto> pageQuery(ApplicationConfigQuery query)\n    {\n        PageHelper.startPage(query.getPageNum(), query.getPageSize());\n        List<ApplicationConfigDto> applicationConfigDtos = new ArrayList<>();\n        if (null != query && null != query.getApplicationId())\n        {\n            applicationConfigDtos = applicationConfigMapper.pageQuery(query);\n        }\n        return new PageInfo<>(applicationConfigDtos);\n    }\n\n    /**\n     * [简要描述]:保存应用的私有配置信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfig :\n     * @return boolean\n     * llxiao  2019/1/7 - 16:56\n     **/\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public boolean saveApplicationConfig(ApplicationConfig applicationConfig)\n    {\n        int flag = 0;\n        if (null != applicationConfig)\n        {\n            flag = this.applicationConfigMapper.insert(applicationConfig);\n        }\n        return flag > 0;\n    }\n\n    /**\n     * [简要描述]:主键更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfig :\n     * @return boolean\n     * llxiao  2019/1/7 - 16:58\n     **/\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public boolean updateApplicationConfig(ApplicationConfig applicationConfig)\n    {\n        int flag = 0;\n        if (null != applicationConfig && null != applicationConfig.getId())\n        {\n            flag = this.applicationConfigMapper.updateByPrimaryKeySelective(applicationConfig);\n        }\n        return flag > 0;\n    }\n\n    /**\n     * [简要描述]:删除私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/1/8 - 9:21\n     **/\n    @Override\n    public boolean delPrivateConfig(Long id)\n    {\n        if (null != id)\n        {\n            return this.applicationConfigMapper.deleteByPrimaryKey(id) > 0;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:发布配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/1/30 - 10:53\n     **/\n    @Override\n    public boolean refresh(Long id)\n    {\n        Application application = this.applicationMapper.selectByPrimaryKey(id);\n        if (null != application)\n        {\n            //应用+环境查找 已连接上的应用\n            List<ClientHostInfo> hostInfos = clientHostInfoMapper\n                    .queryByApplication(application.getApplication(), application.getProfile());\n            int size = 0;\n            if (CollectionUtil.isNotEmpty(hostInfos))\n            {\n                for (ClientHostInfo hostInfo : hostInfos)\n                {\n                    if (refreshFeign.refresh(hostInfo.getNettyIp(), hostInfo.getNettyPort()))\n                    {\n                        size++;\n                    }\n                    //                    if (restRefresh(hostInfo))\n                    //                    {\n                    //                        size++;\n                    //                    }\n                }\n\n                //所有更新服务失败，需要标记应用下线\n                if (size == 0)\n                {\n                    clientApplicationMapper\n                            .updateStatus(application.getApplication(), application.getProfile(), SERVICE_DOWN);\n                }\n\n                return size > 0;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:指定客户端按户型配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param hostInfoIds : 客户端信息\n     * @return boolean\n     * llxiao  2019/3/27 - 14:06\n     **/\n    @Override\n    public boolean batchRefresh(Long... hostInfoIds)\n    {\n        int size = 0;\n        if (null != hostInfoIds)\n        {\n            ClientHostInfo hostInfo;\n            for (Long hostInfoId : hostInfoIds)\n            {\n                hostInfo = this.clientHostInfoMapper.selectByPrimaryKey(hostInfoId);\n                //在线状态\n                if (null != hostInfo && hostInfo.getStatus() == ClientHostInfo.ONLINE)\n                {\n                    if (refreshFeign.refresh(hostInfo.getNettyIp(), hostInfo.getNettyPort()))\n                    {\n                        size++;\n                    }\n                    //                    if (restRefresh(hostInfo))\n                    //                    {\n                    //                        size++;\n                    //                    }\n                }\n            }\n        }\n        return size > 0;\n    }\n\n    //    /**\n    //     * [简要描述]:远程发起刷新请求<br/>\n    //     * [详细描述]:<br/>\n    //     *\n    //     * @param hostInfo :\n    //     * llxiao  2019/1/30 - 11:30\n    //     **/\n    //    private boolean restRefresh(ClientHostInfo hostInfo)\n    //    {\n    //        String url = \"http://\" + hostInfo.getHostIp() + ':' + hostInfo.getHostPort() + REFRESH_URL;\n    //        // 封装参数，千万不要替换为Map与HashMap，否则参数无法传递\n    //        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();\n    //        // 消息头\n    //        HttpHeaders headers = new HttpHeaders();\n    //        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(paramMap, headers);\n    //        boolean flag = true;\n    //        int status = 0;\n    //        try\n    //        {\n    //            ResponseEntity<Integer> result = restTemplate.exchange(url, HttpMethod.POST, httpEntity, Integer.class);\n    //            status = result.getStatusCodeValue();\n    //            if (HTTP_SUCCESS_CODE == status && SUCCESS == result.getBody())\n    //            {\n    //                log.info(\"应用更新成功：应用服务IP:{},应用服务PORT:{}\", hostInfo.getHostIp(), hostInfo.getHostPort());\n    //            }\n    //            else\n    //            {\n    //                log.error(\"应用更新失败，服务端返回状态:{}，返回更新结果：{}\", status, result.getBody());\n    //                flag = false;\n    //            }\n    //        }\n    //        catch (Exception e)\n    //        {\n    //            log.error(\"服务错误!\", e.getMessage());\n    //        }\n    //        if (flag)\n    //        {\n    //            log.error(\"应用发布失败：应用服务IP:{},应用服务PORT:{}\", hostInfo.getHostIp(), hostInfo.getHostPort());\n    //            log.error(\"服务返回HTTP状态：{}\", status);\n    //            //标记服务已经下线\n    //            clientHostInfoMapper.updateStatus(hostInfo.getId(), SERVICE_DOWN);\n    //        }\n    //        return flag;\n    //    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/AuthServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.pojo.mapper.AuthMapper;\nimport com.xiao.custom.config.service.service.AuthService;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\n/**\n * [简要描述]: 鉴权服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 17:54\n * @since JDK 1.8\n */\n@Service\npublic class AuthServiceImpl implements AuthService\n{\n    @Autowired\n    private AuthMapper authMapper;\n\n    /**\n     * 根据用户名查找用户\n     *\n     * @param username\n     * @return\n     */\n    @Override\n    public AuthUser findByUsername(String username)\n    {\n        AuthUser authUser = null;\n        if (StringUtils.isNotBlank(username))\n        {\n            authUser = authMapper.findByUsername(username);\n            Role role = authMapper.findRoleByUserId(authUser.getId());\n            authUser.setRole(role);\n        }\n\n        return authUser;\n    }\n\n    /**\n     * 创建新用户\n     *\n     * @param userDetail\n     */\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void insert(AuthUser userDetail)\n    {\n        if (null != userDetail)\n        {\n            authMapper.insert(userDetail);\n        }\n\n    }\n\n    /**\n     * 创建用户角色\n     *\n     * @param userId\n     * @param roleId\n     * @return\n     */\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public int insertRole(long userId, long roleId)\n    {\n        return authMapper.insertRole(userId, roleId);\n    }\n\n    /**\n     * 根据角色id查找角色\n     *\n     * @param roleId\n     * @return\n     */\n    @Override\n    public Role findRoleById(long roleId)\n    {\n        return authMapper.findRoleById(roleId);\n    }\n\n    /**\n     * 根据用户id查找该用户角色\n     *\n     * @param userId\n     * @return\n     */\n    @Override\n    public Role findRoleByUserId(long userId)\n    {\n        return authMapper.findRoleByUserId(userId);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ClientHostServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.mapper.ClientHostInfoMapper;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\nimport com.xiao.custom.config.service.service.ClientHostService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 15:24\n * @since JDK 1.8\n */\n@Service\npublic class ClientHostServiceImpl implements ClientHostService\n{\n    @Autowired\n    private ClientHostInfoMapper clientHostInfoMapper;\n\n    /**\n     * 分页查询客户端信息\n     *\n     * @param query\n     * @return\n     */\n    @Override\n    public PageInfo<ClientHostInfoDto> pageQuery(ClientHostInfoQuery query)\n    {\n        List<ClientHostInfoDto> clientHostInfoDtos = new ArrayList<>();\n        if (null != query)\n        {\n            PageHelper.startPage(query.getPageNum(), query.getPageSize());\n            clientHostInfoDtos = this.clientHostInfoMapper.pageQuery(query);\n        }\n        return new PageInfo<>(clientHostInfoDtos);\n    }\n\n    /**\n     * 删除客户端连接信息\n     *\n     * @param id\n     */\n    @Override\n    public void delete(long id)\n    {\n        this.clientHostInfoMapper.deleteByPrimaryKey(id);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ConfigItemGroupRelationServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroupRelation;\nimport com.xiao.custom.config.pojo.mapper.ConfigItemGroupRelationMapper;\nimport com.xiao.custom.config.service.service.ConfigItemGroupRelationService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:43\n * @since JDK 1.8\n */\n@Service\npublic class ConfigItemGroupRelationServiceImpl implements ConfigItemGroupRelationService\n{\n    @Autowired\n    private ConfigItemGroupRelationMapper configItemGroupRelationMapper;\n\n    @Override\n    public Integer save(ConfigItemGroupRelation configItemGroupRelation)\n    {\n        return configItemGroupRelationMapper.insert(configItemGroupRelation);\n    }\n\n    @Override\n    public Integer update(ConfigItemGroupRelation configItemGroupRelation)\n    {\n        return configItemGroupRelationMapper.updateByPrimaryKey(configItemGroupRelation);\n    }\n\n    @Override\n    public void delete(Long id)\n    {\n        configItemGroupRelationMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public int batchSave(String[] itemIdArr, Long groupId)\n    {\n        return configItemGroupRelationMapper.batchSave(itemIdArr, groupId);\n    }\n\n    @Override\n    public int batchDelete(String[] itemIdArr, Long groupId)\n    {\n        return configItemGroupRelationMapper.batchDelete(itemIdArr, groupId);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ConfigItemGroupServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport cn.hutool.core.util.ArrayUtil;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItemGroup;\nimport com.xiao.custom.config.pojo.mapper.ApplicationItemGroupRelationMapper;\nimport com.xiao.custom.config.pojo.mapper.ConfigItemGroupMapper;\nimport com.xiao.custom.config.pojo.mapper.ConfigItemGroupRelationMapper;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.service.service.ConfigItemGroupService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:54\n * @since JDK 1.8\n */\n@Service\npublic class ConfigItemGroupServiceImpl implements ConfigItemGroupService\n{\n    @Autowired\n    private ConfigItemGroupMapper configItemGroupMapper;\n    @Autowired\n    private ConfigItemGroupRelationMapper configItemGroupRelationMapper;\n\n    @Autowired\n    private ApplicationItemGroupRelationMapper applicationItemGroupRelationMapper;\n\n    @Override\n    public Integer save(ConfigItemGroup configItemGroup)\n    {\n        return configItemGroupMapper.insert(configItemGroup);\n    }\n\n    @Override\n    public Integer update(ConfigItemGroup configItemGroup)\n    {\n        return configItemGroupMapper.updateByPrimaryKey(configItemGroup);\n    }\n\n    @Override\n    public Integer delete(Long id)\n    {\n        return configItemGroupMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public PageInfo<ConfigItemGroupDto> pageConfigItemGroup(ConfigItemGroupQuery configItemGroupQuery, Integer pageNum,\n            Integer pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemGroupDto> list = configItemGroupMapper.pageConfigItemGroup(configItemGroupQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public ConfigItemGroup getConfigItemGroupById(Long id)\n    {\n        return configItemGroupMapper.selectByPrimaryKey(id);\n    }\n\n    @Override\n    public PageInfo<ConfigItemGroupDto> pageRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery, int pageNum,\n            int pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemGroupDto> list = configItemGroupMapper.pageRefGroupWithApp(configItemGroupQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public PageInfo<ConfigItemGroupDto> pageNotRefGroupWithApp(ConfigItemGroupQuery configItemGroupQuery, int pageNum,\n            int pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemGroupDto> list = configItemGroupMapper.pageNotRefGroupWithApp(configItemGroupQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public int batchDelete(String[] idArr)\n    {\n        List<String> delGroupIds = new ArrayList<>();\n        //删除组之前，已经关联应用的不能进行删除，必须先从应用中解除\n        for (String groupId : idArr)\n        {\n            //删除组之前，已经关联应用的不能进行删除，必须先从应用中解除\n            if (applicationItemGroupRelationMapper.countByGroupId(groupId) > 0)\n            {\n                continue;\n            }\n            else\n            {\n                delGroupIds.add(groupId);\n            }\n        }\n        String[] del = ArrayUtil.toArray(delGroupIds, String.class);\n        // 删除组关联的配置项\n        configItemGroupRelationMapper.batchDeleteByGroupId(del);\n        return configItemGroupMapper.batchDelete(del);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ConfigItemServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.ArrayUtil;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.entity.ConfigItem;\nimport com.xiao.custom.config.pojo.mapper.ConfigItemGroupRelationMapper;\nimport com.xiao.custom.config.pojo.mapper.ConfigItemMapper;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.service.service.ConfigItemService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:38\n * @since JDK 1.8\n */\n@Service\npublic class ConfigItemServiceImpl implements ConfigItemService\n{\n    @Autowired\n    private ConfigItemMapper configItemMapper;\n    @Autowired\n    private ConfigItemGroupRelationMapper configItemGroupRelationMapper;\n\n    @Override\n    public Integer save(ConfigItem configItem)\n    {\n        return configItemMapper.insert(configItem);\n    }\n\n    @Override\n    public Integer update(ConfigItem configItem)\n    {\n        return configItemMapper.updateByPrimaryKey(configItem);\n    }\n\n    @Override\n    public void delete(Long id)\n    {\n        configItemMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public PageInfo<ConfigItemDto> pageConfigItem(ConfigItemQuery configItemQuery, Integer pageNum, Integer pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemDto> list = configItemMapper.pageConfigItem(configItemQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public ConfigItem getConfigItemById(Long id)\n    {\n        return configItemMapper.selectByPrimaryKey(id);\n    }\n\n    @Override\n    public PageInfo<ConfigItemDto> pageRefConfigItemWithGroup(ConfigItemQuery configItemQuery, int pageNum,\n            int pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemDto> list = configItemMapper.pageRefConfigItemWithGroup(configItemQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public PageInfo<ConfigItemDto> pageNotRefConfigItemWithGroup(ConfigItemQuery configItemQuery, int pageNum,\n            int pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ConfigItemDto> list = configItemMapper.pageNotRefConfigItemWithGroup(configItemQuery);\n        return new PageInfo<>(list);\n    }\n\n    @Override\n    public int batchDelete(String[] idArr)\n    {\n        List<String> dels = new ArrayList<>();\n        //已经关联组的配置项，不能进行删除，必须先解除组与配置项的关系才能进行删除\n        for (String itemId : idArr)\n        {\n            if (configItemGroupRelationMapper.countByItemId(itemId) > 0)\n            {\n                continue;\n            }\n            else\n            {\n                dels.add(itemId);\n            }\n        }\n        //        configItemGroupRelationMapper.batchDeleteByItemId(idArr);\n        if (CollectionUtil.isNotEmpty(dels))\n        {\n            return configItemMapper.batchDelete(ArrayUtil.toArray(dels, String.class));\n        }\n        else\n        {\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/RegionServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.entity.Region;\nimport com.xiao.custom.config.pojo.mapper.RegionMapper;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\nimport com.xiao.custom.config.service.service.RegionService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/26 17:22\n * @since JDK 1.8\n */\n@Service\npublic class RegionServiceImpl implements RegionService\n{\n    @Autowired\n    private RegionMapper regionMapper;\n\n    /**\n     * [简要描述]:添加区域信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @return Integer\n     **/\n    @Override\n    @Transactional\n    public int save(RegionDto regionDto)\n    {\n        regionDto.setCreateTime(new Date());\n        Region region = regionDtoconvertRegion(regionDto);\n\n        return regionMapper.insert(region);\n    }\n\n    /**\n     * [简要描述]:更新区域信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @return Integer\n     **/\n    @Override\n    @Transactional\n    public int update(RegionDto regionDto)\n    {\n        Region region = regionDtoconvertRegion(regionDto);\n        return regionMapper.updateByPrimaryKey(region);\n    }\n\n    /**\n     * [简要描述]:根据id删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id:\n     * @return int\n     **/\n    @Override\n    @Transactional\n    public int delete(Long id)\n    {\n        return regionMapper.deleteByPrimaryKey(id);\n    }\n\n    /**\n     * [简要描述]:分页查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @return RegionDto\n     **/\n    @Override\n    public PageInfo<RegionDto> pageRegion(RegionQuery regionQuery, Integer pageNum, Integer pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<RegionDto> list = regionMapper.pageRegion(regionQuery);\n        return new PageInfo<>(list);\n    }\n\n    /**\n     * [简要描述]:查询所有的region\n     * [详细描述]:<br/>\n     *\n     * @return java.util.List<com.winner.config.center.pojo.db.dto.RegionDto>\n     * mjye  2018/12/21 - 16:58\n     **/\n    @Override\n    public List<RegionDto> selectRegion()\n    {\n        return regionMapper.selectRegion();\n    }\n\n    /**\n     * [简要描述]:批量删除\n     * [详细描述]:<br/>\n     *\n     * @param idArr :\n     * @return int\n     * mjye  2018/12/25 - 11:09\n     **/\n    @Override\n    public int batchDelete(String[] idArr)\n    {\n        return regionMapper.batchDelete(idArr);\n    }\n\n    /**\n     * [简要描述]:RegionDto转Region<br/>\n     * [详细描述]:RegionDto转Region<br/>\n     *\n     * @return Region\n     **/\n    public Region regionDtoconvertRegion(RegionDto regionDto)\n    {\n        Region region = new Region();\n        region.setId(regionDto.getId());\n        region.setCreateTime(regionDto.getCreateTime());\n        region.setRegionDesc(regionDto.getRegionDesc());\n        region.setRegionName(regionDto.getRegionName());\n        region.setUpdateTime(new Date());\n\n        return region;\n    }\n\n    /**\n     * [简要描述]:根据id查询区域\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return com.winner.config.center.pojo.db.entity.Region\n     * mjye  2018/12/21 - 16:57\n     **/\n    @Override\n    public Region selectRegionById(Long id)\n    {\n        return regionMapper.selectByPrimaryKey(id);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/java/com/xiao/custom/config/service/service/impl/ServerHostConfigServiceImpl.java",
    "content": "package com.xiao.custom.config.service.service.impl;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.entity.ServerHostConfig;\nimport com.xiao.custom.config.pojo.mapper.ApplicationMapper;\nimport com.xiao.custom.config.pojo.mapper.ServerHostConfigMapper;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\nimport com.xiao.custom.config.service.service.ServerHostConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/11/27 09:48\n * @since JDK 1.8\n */\n@Service\npublic class ServerHostConfigServiceImpl implements ServerHostConfigService\n{\n    @Resource\n    private ServerHostConfigMapper serverHostConfigMapper;\n\n    @Autowired\n    private ApplicationMapper applicationConfigMapper;\n\n    @Override\n    @Transactional\n    public int save(ServerHostConfigDto serverHostConfigDto)\n    {\n        serverHostConfigDto.setCreateTime(new Date());\n        ServerHostConfig serverHostConfig = serverHostConfigDtoconvertserverHostConfig(serverHostConfigDto);\n        return serverHostConfigMapper.insert(serverHostConfig);\n    }\n\n    @Override\n    @Transactional\n    public int update(ServerHostConfigDto serverHostConfigDto)\n    {\n        ServerHostConfig serverHostConfig = serverHostConfigDtoconvertserverHostConfig(serverHostConfigDto);\n        return serverHostConfigMapper.updateByPrimaryKey(serverHostConfig);\n    }\n\n    /**\n     * [简要描述]: -1 标识删除失败，已关联应用不能删除该区域，必须先删除应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return int\n     * llxiao  2019/1/2 - 17:54\n     **/\n    @Override\n    @Transactional\n    public int delete(Long id)\n    {\n        //        if (applicationConfigMapper.countByRegionId(id) > 0)\n        //        {\n        //            return -1;\n        //        }\n        return serverHostConfigMapper.deleteByPrimaryKey(id);\n    }\n\n    @Override\n    public PageInfo<ServerHostConfigDto> pageServerHostConfig(ServerHostConfigQuery serverHostConfigQuery,\n            Integer pageNum, Integer pageSize)\n    {\n        PageHelper.startPage(pageNum, pageSize);\n        List<ServerHostConfigDto> list = serverHostConfigMapper.pageServerHostConfig(serverHostConfigQuery);\n        return new PageInfo<>(list);\n    }\n\n    /**\n     * [简要描述]:serverHostConfigDto转ServerHostConfig<br/>\n     * [详细描述]:serverHostConfigDto转ServerHostConfig<br/>\n     *\n     * @return ServerHostConfig\n     **/\n    public ServerHostConfig serverHostConfigDtoconvertserverHostConfig(ServerHostConfigDto serverHostConfigDto)\n    {\n        ServerHostConfig serverHostConfig = new ServerHostConfig();\n        serverHostConfig.setId(serverHostConfigDto.getId());\n        serverHostConfig.setRegionId(serverHostConfigDto.getRegionId());\n        serverHostConfig.setServerDesc(serverHostConfigDto.getServerDesc());\n        serverHostConfig.setServerHost(serverHostConfigDto.getServerHost());\n        serverHostConfig.setCreateTime(serverHostConfigDto.getCreateTime());\n        serverHostConfig.setUpdateTime(new Date());\n\n        return serverHostConfig;\n    }\n\n    @Override\n    public ServerHostConfig selectServerHostConfigById(Long id)\n    {\n        // TODO Auto-generated method stub\n        return serverHostConfigMapper.selectByPrimaryKey(id);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/resources/application.yml",
    "content": "spring:\n  datasource:\n    url: jdbc:mysql://192.168.206.210:3306/config_center?useSSL=false&useUnicode=true&characterEncoding=UTF-8\n    username: admin\n    password: Admin@123\n    driver-class-name: com.mysql.jdbc.Driver\n    # 使用druid数据源\n    type: com.alibaba.druid.pool.DruidDataSource\n  cloud:\n    #开启重试机制，它默认是关闭的\n    loadbalancer:\n      retry:\n        enable: true\neureka:\n  ## 客户端实例信息配置\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##服务续约重要属性\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    lease-expiration-duration-in-seconds: 90\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    lease-renewal-interval-in-seconds: 30\n    ##端点配置。若配置了context-path:${server.context-path}/info，actuator的监控端点会增加前缀，此时eureka也需要相应增加\n    status-page-url-path: /info\n    health-check-url-path: /health\n  # 客户端配置\n  client:\n    ## 启用客户端 ，默认true\n    enabled: true\n    # 是否在本地缓存注册表信息，默认为true\n    fetch-registry: true\n    # 缓存清单更新时间，默认30秒\n    registry-fetch-interval-seconds: 20\n    # 发布到注册中心，默认true\n    register-with-eureka: true\n    serviceUrl:\n      defaultZone: @register-center-url@\n      #开启健康检查（需要spring-boot-starter-actuator依赖）\n    healthcheck:\n      enable: true\n\nlogging.level.com.netflix.eureka.registry: ERROR"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-service/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 9001\nspring:\n  cloud:\n    config:\n      uri: http://localhost:9000/config/\n      profile: @env@\n      label: master\n      name: config-center-service\n  application:\n    name: config-center-service\n#logging.level.root: debug\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/README.md",
    "content": "1. 客户端使用demo:<br>\n```$xslt\n <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>custom-starter-config</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n```"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-simple</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <!-- spring boot test -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- 开发者工具 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>custom-starter-config</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid</artifactId>\n            <version>RELEASE</version>\n            <scope>compile</scope>\n        </dependency>\n    </dependencies>\n\n    <profiles>\n        <profile>\n            <id>dev</id>\n            <activation>\n                <activeByDefault>true</activeByDefault>\n            </activation>\n            <properties>\n                <env>dev</env>\n            </properties>\n        </profile>\n        <profile>\n            <id>test</id>\n            <properties>\n                <env>test</env>\n            </properties>\n        </profile>\n        <profile>\n            <id>prod</id>\n            <properties>\n                <env>prod</env>\n            </properties>\n        </profile>\n    </profiles>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/src/main/java/com/xiao/custom/config/simple/ConfigClientApplication.java",
    "content": "package com.xiao.custom.config.simple;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/21 17:20\n * @since JDK 1.8\n */\n@SpringBootApplication()\npublic class ConfigClientApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConfigClientApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/src/main/java/com/xiao/custom/config/simple/datasource/DataSourceConfigure.java",
    "content": "package com.xiao.custom.config.simple.datasource;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * [简要描述]: 初始化数据源\n * [详细描述]: RefreshScope标识需要刷新的数据\n *\n * @author llxiao\n * @version 1.0, 2019/1/30 09:09\n * @since JDK 1.8\n */\n//@RefreshScope\n//@Configuration\n@Slf4j\npublic class DataSourceConfigure\n{\n//    @Bean\n//    @RefreshScope// 刷新配置文件\n//    @Primary //Primary可以理解为默认优先选择,同时不可以同时设置多个\n//    @ConfigurationProperties(prefix = \"spring.datasource\") // 数据源的自动配置的前缀\n//    public DataSource dataSource()\n//    {\n//        return DataSourceBuilder.create().build();\n//    }\n\n    //    @Value(\"${spring.datasource.url}\")\n    //    private String dbUrl;\n    //    @Value(\"${spring.datasource.username}\")\n    //    private String username;\n    //    @Value(\"${spring.datasource.password}\")\n    //    private String password;\n    //    @Value(\"${spring.datasource.driverClassName}\")\n    //    private String driverClassName;\n    //    @Value(\"${spring.datasource.initialSize}\")\n    //    private int initialSize;\n    //    @Value(\"${spring.datasource.minIdle}\")\n    //    private int minIdle;\n    //    @Value(\"${spring.datasource.maxActive}\")\n    //    private int maxActive;\n    //    @Value(\"${spring.datasource.maxWait}\")\n    //    private int maxWait;\n    //    @Value(\"${spring.datasource.timeBetweenEvictionRunsMillis}\")\n    //    private int timeBetweenEvictionRunsMillis;\n    //    @Value(\"${spring.datasource.minEvictableIdleTimeMillis}\")\n    //    private int minEvictableIdleTimeMillis;\n    //    @Value(\"${spring.datasource.validationQuery}\")\n    //    private String validationQuery;\n    //    @Value(\"${spring.datasource.testWhileIdle}\")\n    //    private boolean testWhileIdle;\n    //    @Value(\"${spring.datasource.testOnBorrow}\")\n    //    private boolean testOnBorrow;\n    //    @Value(\"${spring.datasource.testOnReturn}\")\n    //    private boolean testOnReturn;\n    //    @Value(\"${spring.datasource.poolPreparedStatements}\")\n    //    private boolean poolPreparedStatements;\n    //    @Value(\"${spring.datasource.maxPoolPreparedStatementPerConnectionSize}\")\n    //    private int maxPoolPreparedStatementPerConnectionSize;\n    //    @Value(\"${spring.datasource.filters}\")\n    //    private String filters;\n    //    @Value(\"${spring.datasource.connectionProperties}\")\n    //    private String connectionProperties;\n    //    @Value(\"${spring.datasource.useGlobalDataSourceStat}\")\n    //    private boolean useGlobalDataSourceStat;\n    //\n    //    @Bean     //声明其为Bean实例\n    //    @Primary  //在同样的DataSource中，首先使用被标注的DataSource\n    //    @RefreshScope\n    //    public DataSource dataSource()\n    //    {\n    //        DruidDataSource datasource = new DruidDataSource();\n    //        datasource.setUrl(this.dbUrl);\n    //        datasource.setUsername(username);\n    //        datasource.setPassword(password);\n    //        datasource.setDriverClassName(driverClassName);\n    //\n    //        //configuration\n    //        datasource.setInitialSize(initialSize);\n    //        datasource.setMinIdle(minIdle);\n    //        datasource.setMaxActive(maxActive);\n    //        datasource.setMaxWait(maxWait);\n    //        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);\n    //        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);\n    //        datasource.setValidationQuery(validationQuery);\n    //        datasource.setTestWhileIdle(testWhileIdle);\n    //        datasource.setTestOnBorrow(testOnBorrow);\n    //        datasource.setTestOnReturn(testOnReturn);\n    //        datasource.setPoolPreparedStatements(poolPreparedStatements);\n    //        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);\n    //        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);\n    //        try\n    //        {\n    //            datasource.setFilters(filters);\n    //        }\n    //        catch (SQLException e)\n    //        {\n    //            log.error(\"druid configuration initialization filter: \" + e);\n    //        }\n    //        datasource.setConnectionProperties(connectionProperties);\n    //        return datasource;\n    //    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/src/main/java/com/xiao/custom/config/simple/demo/ControllerDemo.java",
    "content": "package com.xiao.custom.config.simple.demo;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/21 17:23\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/demo\")\n@RefreshScope\npublic class ControllerDemo\n{\n    @Value(\"${dymaic:test}\")\n    private String dbUrl;\n\n    @RequestMapping(\"/getDbUrl\")\n    public String getDbUrl()\n    {\n        return dbUrl;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 9003\nspring:\n  cloud:\n    config:\n      uri: http://172.16.80.194:9000/config\n      profile: dev\n      label: master\n      name: config-center-simple\n  application:\n    name: config-center-simple\nmanagement:\n  security:\n    enabled: false\n#自定义的netty服务端口，默认8999\nnetty:\n  server:\n    port: 8999"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-simple/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n    <include\n            resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n\n    <!-- logback加载优先于application.yml文件，因此需要从bootstrap.yml文件中读取spring.application.name信息 -->\n    <springProperty scope=\"context\" name=\"springAppName\"\n                    source=\"spring.application.name\"/>\n\n\n    <!-- 日志在工程中的输出位置 -->\n    <property name=\"LOG_FILE\"\n              value=\"${BUILD_FOLDER:-build}/${springAppName}\"/>\n\n    <!-- 控制台的日志输出样式 -->\n    <property name=\"CONSOLE_LOG_PATTERN\"\n              value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- 控制台Appender -->\n    <appender name=\"console\"\n              class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <root level=\"info\">\n        <appender-ref ref=\"console\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/README.md",
    "content": "1. 配置管理平台<br>\n访问地址：http://localhost:9002\n\n2. 新增spring session+ spring security +  jwt简单鉴权<p>\n   实现方案简要说明：<p>\n  >> 1). 后端实现主要参考``com.xiao.custom.config.web.auth.config.WebSecurityConfig``，浏览器交互需要用上session<p>\n  >> 2). 前端实现思路，如果是浏览器正常session交互，如果是ajax请求，需要在请求前加上jwt的token，代码片段：<p>\n   ```$xslt\n            beforeSend: function (xhr) {\n                if ( this.loadArea ){\n                    this.loadArea.$set(this.loadArea,'loading',true)\n                }else{\n                    this.showLoad && App.showLoadding(null, null, xhr);\n                }\n                this.beforeCallback && this.beforeCallback.call(this,xhr);\n                // 设置token 本地获取token  关键部分\n                var token = window.localStorage.getItem('M-Auth-Token');\n                xhr.setRequestHeader('M-Auth-Token', token);\n            },\n   ```\n   >> 3). 使用到的相关的pom配置<p>\n   ```$xslt\n    <!-- jwt + security -->\n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-starter-security</artifactId>\n                <version>1.5.9.RELEASE</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework.security</groupId>\n                <artifactId>spring-security-jwt</artifactId>\n                <version>1.0.9.RELEASE</version>\n            </dependency>\n            <dependency>\n                <groupId>io.jsonwebtoken</groupId>\n                <artifactId>jjwt</artifactId>\n                <version>0.9.0</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework.session</groupId>\n                <artifactId>spring-session</artifactId>\n            </dependency>\n   ```\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-config-web</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <!-- ribbon负载均衡。feign已集成 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-ribbon</artifactId>\n        </dependency>\n        <!-- 熔断器hystrix -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-hystrix</artifactId>\n        </dependency>\n        <!-- 配置中心 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.github.pagehelper</groupId>\n            <artifactId>pagehelper</artifactId>\n            <version>5.1.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>custom-config-pojo</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>SpringCloud-Common</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n        <!-- jwt + security -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-security</artifactId>\n            <version>1.5.9.RELEASE</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.security</groupId>\n            <artifactId>spring-security-jwt</artifactId>\n            <version>1.0.9.RELEASE</version>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt</artifactId>\n            <version>0.9.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.session</groupId>\n            <artifactId>spring-session</artifactId>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <build>\n        <finalName>custom-config-web</finalName>\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>static/**</include>\n                    <include>**/*.xml</include>\n                    <include>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>**/banner.txt</include>\n                    <include>META-INF/**</include>\n                </includes>\n                <excludes>\n                    <exclude>**/*.woff</exclude>\n                    <exclude>**/*.woff2</exclude>\n                    <exclude>**/*.ttf</exclude>\n                    <exclude>**/*.ico</exclude>\n                </excludes>\n            </resource>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>false</filtering>\n                <includes>\n                    <include>**/*.woff</include>\n                    <include>**/*.woff2</include>\n                    <include>**/*.ttf</include>\n                    <include>**/*.ico</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/ConfigCenterWebApplication.java",
    "content": "package com.xiao.custom.config.web;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/27 09:00\n * @since JDK 1.8\n */\n@SpringBootApplication(scanBasePackages = \"com.xiao.custom.config\")\n@EnableEurekaClient\n//开启fegin\n@EnableFeignClients\n// 开启熔断功能\n//@EnableCircuitBreaker\npublic class ConfigCenterWebApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConfigCenterWebApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/AuthContants.java",
    "content": "package com.xiao.custom.config.web.auth;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/9 14:55\n * @since JDK 1.8\n */\npublic interface AuthContants\n{\n    /**\n     * 自定义token头\n     */\n    String TOKEN_HEADER = \"M-Auth-Token\";\n\n    /**\n     * token 开头\n     */\n    String TOKEN_BEARER_START = \"Bearer \";\n\n    /**\n     * reqeust中存储username\n     */\n    String REQUEST_USER_NAME = \"username\";\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/config/HttpSessionConfig.java",
    "content": "package com.xiao.custom.config.web.auth.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.web.savedrequest.HttpSessionRequestCache;\nimport org.springframework.security.web.savedrequest.RequestCache;\nimport org.springframework.session.web.http.CookieHttpSessionStrategy;\nimport org.springframework.session.web.http.DefaultCookieSerializer;\nimport org.springframework.session.web.http.HttpSessionStrategy;\n\n/**\n * 分布式缓存机制\n *\n * @author zhdong\n */\n@Configuration\n//@EnableRedissonHttpSession(maxInactiveIntervalInSeconds = 18000)\npublic class HttpSessionConfig\n{\n    /**\n     * 基于session缓存的策略\n     * 1.如果配置了header\n     * 那么就使用header的策略，一般情况针对app和移动端适用\n     * 2.cookie策略则适应于pc端浏览器\n     *\n     * @return\n     */\n    @Bean\n    public HttpSessionStrategy httpSessionStrategy()\n    {\n        CookieHttpSessionStrategy sessionStrategy = new CookieHttpSessionStrategy();\n        DefaultCookieSerializer serializer = new DefaultCookieSerializer();\n        serializer.setCookiePath(\"/\");\n        sessionStrategy.setCookieSerializer(serializer);\n        return sessionStrategy;\n    }\n\n    @Bean\n    public RequestCache requestCache()\n    {\n        return new HttpSessionRequestCache();\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/config/JwtAuthenticationEntryPoint.java",
    "content": "package com.xiao.custom.config.web.auth.config;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.demo.common.exception.CommonExceptionEnum;\nimport com.xiao.springcloud.demo.common.gloab.response.ErrorResponseData;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.web.AuthenticationEntryPoint;\nimport org.springframework.security.web.DefaultRedirectStrategy;\nimport org.springframework.security.web.RedirectStrategy;\nimport org.springframework.security.web.savedrequest.RequestCache;\nimport org.springframework.security.web.savedrequest.SavedRequest;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.StringUtils;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.Serializable;\n\n/**\n * 登录失败处理\n */\n@Component\n@Slf4j\npublic class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable\n{\n\n    private static final long serialVersionUID = -8970718410437077606L;\n\n    @Autowired\n    private RequestCache requestCache;\n\n    @Value(\"${config.center.loginUrl}\")\n    private String loginUrl;\n\n    @Override\n    public void commence(HttpServletRequest request, HttpServletResponse response,\n            AuthenticationException authException) throws IOException\n    {\n        //验证为未登陆状态会进入此方法，认证错误\n        log.error(\"认证失败：\" + authException.getMessage());\n        log.error(\"请求url: \" + request.getRequestURI());\n        cookiesStrategy(request, response, authException);\n        //        headerStategy(request,response,authException);\n    }\n\n    private void cookiesStrategy(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)\n    {\n        // cookie方式认证直接跳转登录页面\n        String xhr = request.getHeader(\"X-Requested-With\");\n        // 非ajax请求\n        if (StringUtils.isEmpty(xhr))\n        {\n            requestCache.saveRequest(request, response);\n            SavedRequest saveRequest = requestCache.getRequest(request, response);\n\n            RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();\n            // 获取 跳转url\n            String targetUrl = saveRequest.getRedirectUrl();\n            log.info(\"引发跳转的请求是:\" + targetUrl);\n            try\n            {\n                redirectStrategy.sendRedirect(request, response, loginUrl + \"?refUrl=\" + targetUrl);\n            }\n            catch (IOException e1)\n            {\n                log.error(\"JwtAuthenticationTokenFilter,重定向错误\", e1);\n            }\n            return;\n        }\n        else\n        {\n            try\n            {\n                response.setContentType(\"application/json;charset=utf-8\");\n                response.setStatus(HttpStatus.UNAUTHORIZED.value());\n                response.getWriter().print(JSONObject.toJSON(ErrorResponseData\n                        .error(CommonExceptionEnum.NO_LOGIN.getCode(), CommonExceptionEnum.NO_LOGIN.getMessage())));\n            }\n            catch (IOException e1)\n            {\n                log.error(\"EntryPointUnauthorizedHandler返回错误\", e);\n            }\n        }\n    }\n\n    private void headerStategy(HttpServletRequest request, HttpServletResponse response,\n            AuthenticationException authException)\n    {\n        response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n        try\n        {\n            response.setContentType(\"application/json;charset=utf-8\");\n            response.setStatus(HttpStatus.UNAUTHORIZED.value());\n            response.getWriter().print(JSONObject.toJSON(ErrorResponseData\n                    .error(CommonExceptionEnum.NO_LOGIN.getCode(), CommonExceptionEnum.NO_LOGIN.getMessage())));\n        }\n        catch (IOException e1)\n        {\n            log.error(\"EntryPointUnauthorizedHandler返回错误\", e1);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/config/JwtAuthenticationTokenFilter.java",
    "content": "package com.xiao.custom.config.web.auth.config;\n\nimport com.xiao.custom.config.web.auth.AuthContants;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\nimport com.xiao.custom.config.web.auth.util.JwtUtils;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.web.authentication.WebAuthenticationDetailsSource;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nimport javax.annotation.Resource;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * token校验\n */\n@Component\n@Slf4j\npublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter\n{\n\n    @Resource\n    private JwtUtils jwtUtils;\n\n    @Override\n    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)\n            throws ServletException, IOException\n    {\n        String authToken = request.getHeader(AuthContants.TOKEN_HEADER);\n\n        // 以 Bearer 开头的token\n        if (StringUtils.isNotEmpty(authToken) && authToken.startsWith(AuthContants.TOKEN_BEARER_START))\n        {\n            authToken = authToken.substring(AuthContants.TOKEN_BEARER_START.length());\n            accessToken(request, authToken);\n        }\n        chain.doFilter(request, response);\n    }\n\n    private void accessToken(HttpServletRequest request, String authToken)\n    {\n        String username = jwtUtils.getUsernameFromToken(authToken);\n\n        if (jwtUtils.containToken(username, authToken) && username != null\n                && SecurityContextHolder.getContext().getAuthentication() == null)\n        {\n            // 可以考虑做分布式session\n            UserDetail userDetail = jwtUtils.getUserFromToken(authToken);\n            if (jwtUtils.validateToken(authToken, userDetail))\n            {\n                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetail, null, userDetail\n                        .getAuthorities());\n                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));\n                log.info(\"Authenticated userDetail {}, setting security context\", username);\n                SecurityContextHolder.getContext().setAuthentication(authentication);\n            }\n        }\n\n        //存储用户登录名，下一步流程处理\n        request.setAttribute(AuthContants.REQUEST_USER_NAME, username);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/config/RestAccessDeniedHandler.java",
    "content": "package com.xiao.custom.config.web.auth.config;\n\nimport com.xiao.custom.config.web.auth.util.ResultCode;\nimport com.xiao.custom.config.web.auth.util.ResultJson;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.security.access.AccessDeniedException;\nimport org.springframework.security.web.access.AccessDeniedHandler;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\n\n/**\n * 权限不足处理\n * createAt: 2018/9/21\n */\n@Component(\"restAuthenticationAccessDeniedHandler\")\n@Slf4j\npublic class RestAccessDeniedHandler implements AccessDeniedHandler\n{\n    /**\n     * 登陆状态下，权限不足执行该方法\n     *\n     * @param httpServletRequest\n     * @param response\n     * @param e\n     * @exception IOException\n     * @exception ServletException\n     */\n    @Override\n    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, AccessDeniedException e)\n            throws IOException\n    {\n        log.error(\"权限不足：\" + e.getMessage());\n        //浏览器方式\n        webBrowser(response);\n        // API接口方式\n        //        api(response, e);\n    }\n\n    private void api(HttpServletResponse response, AccessDeniedException e) throws IOException\n    {\n        // 接口返回以json格式\n        response.setStatus(200);\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setContentType(\"application/json; charset=utf-8\");\n        PrintWriter printWriter = response.getWriter();\n        String body = ResultJson.failure(ResultCode.FORBIDDEN, e.getMessage()).toString();\n        printWriter.write(body);\n        printWriter.flush();\n    }\n\n    private void webBrowser(HttpServletResponse response) throws IOException\n    {\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n        response.sendError(HttpStatus.FORBIDDEN.value(), \"没有访问权限\");\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/config/WebSecurityConfig.java",
    "content": "package com.xiao.custom.config.web.auth.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.builders.WebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\nimport org.springframework.security.config.http.SessionCreationPolicy;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.crypto.password.PasswordEncoder;\nimport org.springframework.security.web.access.AccessDeniedHandler;\nimport org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\n\nimport javax.annotation.Resource;\n\n/**\n * springoot + Security + jwt登录认证\n * Author: JoeTao\n * createAt: 2018/9/14\n */\n@Configuration\n@EnableWebSecurity\n//@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter\n{\n\n    @Autowired\n    private JwtAuthenticationEntryPoint unauthorizedHandler;\n\n    @Resource(name = \"restAuthenticationAccessDeniedHandler\")\n    private AccessDeniedHandler accessDeniedHandler;\n\n    @Resource(name = \"configUserDetailsService\")\n    private UserDetailsService configUserDetailsService;\n\n    @Autowired\n    private JwtAuthenticationTokenFilter authenticationTokenFilter;\n\n    @Value(\"${config.center.anonymous.urls}\")\n    private String anonymousUrls;\n\n    @Autowired\n    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception\n    {\n        authenticationManagerBuilder\n                // 设置UserDetailsService\n                .userDetailsService(configUserDetailsService)\n                // 使用BCrypt进行密码的hash\n                .passwordEncoder(passwordEncoder());\n    }\n\n    /**\n     * 装载BCrypt密码编码器\n     *\n     * @return\n     */\n    @Bean\n    public PasswordEncoder passwordEncoder()\n    {\n        return new BCryptPasswordEncoder();\n    }\n\n    @Override\n    protected void configure(HttpSecurity httpSecurity) throws Exception\n    {\n        // 基于token 接口间鉴权\n        //        tokenConfigure(httpSecurity);\n\n        // 基于session 适应于浏览器\n        sessionConfig(httpSecurity);\n\n        httpSecurity.authorizeRequests().antMatchers(HttpMethod.OPTIONS, \"/**\").permitAll()\n                //排除某些指定页面\n                .antMatchers(anonymousUrls.split(\",\")).permitAll().anyRequest().authenticated();\n\n        // 禁用缓存\n        httpSecurity.headers().cacheControl();\n        // 添加JWT filter\n        httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);\n        // 设置 鉴权失败和无权的处理\n        httpSecurity.exceptionHandling().authenticationEntryPoint(unauthorizedHandler)\n                .accessDeniedHandler(accessDeniedHandler);\n    }\n\n    private void sessionConfig(HttpSecurity httpSecurity) throws Exception\n    {\n        //默认采用httpsession的方式\n        SessionCreationPolicy sessionPolicy = SessionCreationPolicy.IF_REQUIRED;\n        //屏蔽csrf，否则post无法访问\n        httpSecurity.cors().and().csrf().disable()\n                //session管理策略\n                .sessionManagement().sessionCreationPolicy(sessionPolicy);\n\n    }\n\n    private void tokenConfigure(HttpSecurity httpSecurity) throws Exception\n    {\n        httpSecurity\n                // 由于使用的是JWT，我们这里不需要csrf\n                .csrf().disable()\n                // 基于token，所以不需要session\n                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);\n    }\n\n    @Override\n    public void configure(WebSecurity web)\n    {\n        //忽略鉴权的请求\n        web.ignoring().antMatchers(\"/html/assets/**\").antMatchers(\"/favicon.ico\");\n    }\n\n    @Bean\n    @Override\n    public AuthenticationManager authenticationManagerBean() throws Exception\n    {\n        return super.authenticationManagerBean();\n    }\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/controller/AuthController.java",
    "content": "package com.xiao.custom.config.web.auth.controller;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.web.auth.AuthContants;\nimport com.xiao.custom.config.web.auth.entity.ResponseUserToken;\nimport com.xiao.custom.config.web.auth.entity.User;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\nimport com.xiao.custom.config.web.auth.service.AuthUserService;\nimport com.xiao.custom.config.web.auth.util.ResultCode;\nimport com.xiao.custom.config.web.auth.util.ResultJson;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * @author JoeTao\n * createAt: 2018/9/17\n */\n\n@RestController\n//@Api(description = \"登陆注册及刷新token\")\n@RequestMapping(\"/user/auth\")\npublic class AuthController\n{\n    private static final long ADMIN_TYPE = 1;\n\n    @Autowired\n    private AuthUserService authService;\n\n    @PostMapping(value = \"/login\")\n    //@ApiOperation(value = \"登陆\", notes = \"登陆成功返回token,测试管理员账号:admin,123456;用户账号：les123,admin\")\n    public ResultJson<ResponseUserToken> login(String loginName, String password, HttpServletResponse response)\n    {\n        final ResponseUserToken result = authService.login(loginName, password);\n        response.setHeader(AuthContants.TOKEN_HEADER, AuthContants.TOKEN_BEARER_START + result.getToken());\n        return ResultJson.ok(result);\n    }\n\n    @GetMapping(value = \"/logout\")\n    //@ApiOperation(value = \"登出\", notes = \"退出登陆\")\n    //    @ApiImplicitParams({@ApiImplicitParam(name = \"Authorization\", value = \"Authorization token\", required = true, dataType = \"string\", paramType = \"header\")})\n    public ResultJson logout(HttpServletRequest request, HttpServletResponse response)\n    {\n        String token = request.getHeader(AuthContants.TOKEN_HEADER);\n        if (token == null)\n        {\n            return ResultJson.failure(ResultCode.UNAUTHORIZED);\n        }\n        authService.logout(token);\n\n        //清除session数据\n        Authentication auth = SecurityContextHolder.getContext().getAuthentication();\n        if (auth != null)\n        {\n            new SecurityContextLogoutHandler().logout(request, response, auth);\n        }\n        request.getSession().invalidate();\n        return ResultJson.ok();\n    }\n\n    @GetMapping(value = \"/getInfo\")\n    //@ApiOperation(value = \"根据token获取用户信息\", notes = \"根据token获取用户信息\")\n    //    @ApiImplicitParams({@ApiImplicitParam(name = \"Authorization\", value = \"Authorization token\", required = true, dataType = \"string\", paramType = \"header\")})\n    public ResultJson getUser(HttpServletRequest request)\n    {\n        String username = (String) request.getAttribute(AuthContants.REQUEST_USER_NAME);\n        UserDetail userDetail = authService.getByUsername(username);\n        return ResultJson.ok(userDetail);\n    }\n\n    @PostMapping(value = \"/sign\")\n    //@ApiOperation(value = \"用户注册\")\n    public ResultJson sign(@RequestBody User user)\n    {\n        if (StringUtils.isAnyBlank(user.getName(), user.getPassword()))\n        {\n            return ResultJson.failure(ResultCode.BAD_REQUEST);\n        }\n\n        AuthUser authUser = new AuthUser();\n        authUser.setUsername(user.getName());\n        authUser.setPassword(user.getPassword());\n        Role role = new Role();\n        role.setId(ADMIN_TYPE);\n        authUser.setRole(role);\n        return ResultJson.ok(authService.register(authUser));\n    }\n\n    @GetMapping(value = \"/refresh\")\n    //    @ApiOperation(value = \"刷新token\")\n    public ResultJson refreshAndGetAuthenticationToken(HttpServletRequest request)\n    {\n        String token = request.getHeader(AuthContants.TOKEN_HEADER);\n        ResponseUserToken response = authService.refresh(token);\n        if (response == null)\n        {\n            return ResultJson.failure(ResultCode.BAD_REQUEST, \"token无效\");\n        }\n        else\n        {\n            return ResultJson.ok(response);\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/entity/ResponseUserToken.java",
    "content": "package com.xiao.custom.config.web.auth.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * @author JoeTao\n * createAt: 2018/9/17\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Builder\npublic class ResponseUserToken\n{\n    private String token;\n    private UserDetail userDetail;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/entity/User.java",
    "content": "package com.xiao.custom.config.web.auth.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * @author : JoeTao\n * createAt: 2018/9/17\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class User\n{\n\n    //    @ApiModelProperty(value = \"用户名\", required = true)\n    private String name;\n    //    @ApiModelProperty(value = \"密码\", required = true)\n    private String password;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/entity/UserDetail.java",
    "content": "package com.xiao.custom.config.web.auth.entity;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.authority.SimpleGrantedAuthority;\nimport org.springframework.security.core.userdetails.UserDetails;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @author : JoeTao\n * createAt: 2018/9/14\n */\npublic class UserDetail implements UserDetails\n{\n    private long id;\n    private String username;\n    private String password;\n    private String nickname;\n    private Role role;\n    private Date lastPasswordResetDate;\n\n    public UserDetail(AuthUser user)\n    {\n        this.id = user.getId();\n        this.role = user.getRole();\n        this.username = user.getUsername();\n        this.password = user.getPassword();\n        this.nickname = user.getNickname();\n    }\n\n    public UserDetail(AuthUser user, Role role)\n    {\n        this.id = user.getId();\n        this.role = role;\n        this.username = user.getUsername();\n        this.password = user.getPassword();\n    }\n\n    public UserDetail(long id, String username, Role role,\n            //            Date lastPasswordResetDate,\n            String password)\n    {\n        this.id = id;\n        this.username = username;\n        this.password = password;\n        this.role = role;\n        //        this.lastPasswordResetDate = lastPasswordResetDate;\n    }\n\n    public UserDetail(String username, String password, Role role)\n    {\n        this.username = username;\n        this.password = password;\n        this.role = role;\n    }\n\n    public UserDetail(long id, String username, String password)\n    {\n        this.id = id;\n        this.username = username;\n        this.password = password;\n    }\n\n    //返回分配给用户的角色列表\n    @Override\n    public Collection<? extends GrantedAuthority> getAuthorities()\n    {\n        List<GrantedAuthority> authorities = new ArrayList<>();\n        authorities.add(new SimpleGrantedAuthority(role.getName()));\n        return authorities;\n    }\n\n    public long getId()\n    {\n        return id;\n    }\n\n    @Override\n    public String getPassword()\n    {\n        return password;\n    }\n\n    @Override\n    public String getUsername()\n    {\n        return username;\n    }\n\n    /**\n     * 账户是否未过期\n     */\n    @Override\n    public boolean isAccountNonExpired()\n    {\n        return true;\n    }\n\n    /**\n     * 账户是否未锁定\n     */\n    @Override\n    public boolean isAccountNonLocked()\n    {\n        return true;\n    }\n\n    /**\n     * 密码是否未过期\n     */\n    @Override\n    public boolean isCredentialsNonExpired()\n    {\n        return true;\n    }\n\n    /**\n     * 账户是否激活\n     */\n    @Override\n    public boolean isEnabled()\n    {\n        return true;\n    }\n\n    public Date getLastPasswordResetDate()\n    {\n        if (null != lastPasswordResetDate)\n        {\n            return new Date(lastPasswordResetDate.getTime());\n        }\n        return null;\n    }\n\n    public Role getRole()\n    {\n        return role;\n    }\n\n    public void setRole(Role role)\n    {\n        this.role = role;\n    }\n\n    public void setId(long id)\n    {\n        this.id = id;\n    }\n\n    public void setUsername(String username)\n    {\n        this.username = username;\n    }\n\n    public void setPassword(String password)\n    {\n        this.password = password;\n    }\n\n    public void setLastPasswordResetDate(Date lastPasswordResetDate)\n    {\n        this.lastPasswordResetDate = new Date(lastPasswordResetDate.getTime());\n    }\n\n    public String getNickname()\n    {\n        return nickname;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/exception/CustomException.java",
    "content": "package com.xiao.custom.config.web.auth.exception;\n\nimport com.xiao.custom.config.web.auth.util.ResultJson;\nimport lombok.Getter;\n\n/**\n * @author Joetao\n * Created at 2018/8/24.\n */\n@Getter\npublic class CustomException extends RuntimeException\n{\n    private ResultJson resultJson;\n\n    public CustomException(ResultJson resultJson)\n    {\n        this.resultJson = resultJson;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/exception/DefaultExceptionHandler.java",
    "content": "package com.xiao.custom.config.web.auth.exception;\n\nimport com.xiao.custom.config.web.auth.util.ResultCode;\nimport com.xiao.custom.config.web.auth.util.ResultJson;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.bind.MethodArgumentNotValidException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\n/**\n * @author Joetao\n * 异常处理类\n * controller层异常无法捕获处理，需要自己处理\n * Created at 2018/8/27.\n */\n@RestControllerAdvice\n@Slf4j\npublic class DefaultExceptionHandler\n{\n\n    /**\n     * 处理所有自定义异常\n     *\n     * @param e\n     * @return\n     */\n    @ExceptionHandler(CustomException.class)\n    public ResultJson handleCustomException(CustomException e)\n    {\n        log.error(e.getResultJson().getMsg().toString());\n        return e.getResultJson();\n    }\n\n    /**\n     * 处理参数校验异常\n     *\n     * @param e\n     * @return\n     */\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResultJson handleMethodArgumentNotValidException(MethodArgumentNotValidException e)\n    {\n        log.error(e.getBindingResult().getFieldError().getField() + e.getBindingResult().getFieldError()\n                .getDefaultMessage());\n        return ResultJson.failure(ResultCode.BAD_REQUEST, e.getBindingResult().getFieldError().getDefaultMessage());\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/service/AuthUserService.java",
    "content": "package com.xiao.custom.config.web.auth.service;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.web.auth.entity.ResponseUserToken;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\n\n/**\n * [简要描述]: 登陆验证\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 10:22\n * @since JDK 1.8\n */\npublic interface AuthUserService\n{\n    /**\n     * 注册用户\n     *\n     * @param userDetail\n     * @return\n     */\n    UserDetail register(AuthUser userDetail);\n\n    /**\n     * 登陆\n     *\n     * @param username\n     * @param password\n     * @return\n     */\n    ResponseUserToken login(String username, String password);\n\n    /**\n     * 登出\n     *\n     * @param token\n     */\n    void logout(String token);\n\n    /**\n     * 刷新Token\n     *\n     * @param oldToken\n     * @return\n     */\n    ResponseUserToken refresh(String oldToken);\n\n    /**\n     * 根据Token获取用户信息\n     *\n     * @param token\n     * @return\n     */\n    UserDetail getUserByToken(String token);\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param token :\n     * @return com.winner.config.center.web.auth.entity.UserDetail\n     * llxiao  2019/5/9 - 17:24\n     **/\n    UserDetail getByToken(String token);\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param username :\n     * @return com.winner.config.center.web.auth.entity.UserDetail\n     * llxiao  2019/5/9 - 17:24\n     **/\n    UserDetail getByUsername(String username);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/service/impl/AuthUserServiceImpl.java",
    "content": "package com.xiao.custom.config.web.auth.service.impl;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.web.auth.AuthContants;\nimport com.xiao.custom.config.web.auth.entity.ResponseUserToken;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\nimport com.xiao.custom.config.web.auth.exception.CustomException;\nimport com.xiao.custom.config.web.auth.service.AuthUserService;\nimport com.xiao.custom.config.web.auth.util.JwtUtils;\nimport com.xiao.custom.config.web.auth.util.ResultCode;\nimport com.xiao.custom.config.web.auth.util.ResultJson;\nimport com.xiao.custom.config.web.feign.auth.AuthFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.authentication.BadCredentialsException;\nimport org.springframework.security.authentication.DisabledException;\nimport org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.stereotype.Service;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 用户权限实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 10:27\n * @since JDK 1.8\n */\n@Service\npublic class AuthUserServiceImpl implements AuthUserService\n{\n    @Autowired\n    private AuthenticationManager authenticationManager;\n\n    @Autowired\n    @Qualifier(\"configUserDetailsService\")\n    private UserDetailsService userDetailsService;\n\n    @Autowired\n    private JwtUtils jwtTokenUtil;\n\n    @Autowired\n    private AuthFeign authApi;\n\n    @Override\n    public UserDetail register(AuthUser authUser)\n    {\n        final String username = authUser.getUsername();\n        if (authApi.findByUsername(username) != null)\n        {\n            throw new CustomException(ResultJson.failure(ResultCode.BAD_REQUEST, \"用户已存在\"));\n        }\n        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();\n        final String rawPassword = authUser.getPassword();\n        authUser.setPassword(encoder.encode(rawPassword));\n        authUser.setLastResetTime(new Timestamp(System.currentTimeMillis()));\n        authApi.insert(authUser);\n        long roleId = authUser.getRole().getId();\n        Role role = authApi.findRoleById(roleId);\n        authUser.setRole(role);\n        authApi.insertRole(authUser.getId(), roleId);\n        return new UserDetail(authUser);\n    }\n\n    @Override\n    public ResponseUserToken login(String username, String password)\n    {\n        //用户验证\n        final Authentication authentication = authenticate(username, password);\n        //存储认证信息\n        SecurityContextHolder.getContext().setAuthentication(authentication);\n        //生成token\n        final UserDetail userDetail = (UserDetail) authentication.getPrincipal();\n        final String token = jwtTokenUtil.generateAccessToken(userDetail);\n        //存储token\n        jwtTokenUtil.putToken(username, token);\n        return new ResponseUserToken(token, userDetail);\n\n    }\n\n    @Override\n    public void logout(String token)\n    {\n        token = token.substring(AuthContants.TOKEN_BEARER_START.length());\n        String userName = jwtTokenUtil.getUsernameFromToken(token);\n        jwtTokenUtil.deleteToken(userName);\n    }\n\n    @Override\n    public ResponseUserToken refresh(String oldToken)\n    {\n        String token = oldToken.substring(AuthContants.TOKEN_BEARER_START.length());\n        String username = jwtTokenUtil.getUsernameFromToken(token);\n        UserDetail userDetail = (UserDetail) userDetailsService.loadUserByUsername(username);\n        if (jwtTokenUtil.canTokenBeRefreshed(token, userDetail.getLastPasswordResetDate()))\n        {\n            token = jwtTokenUtil.refreshToken(token);\n            return new ResponseUserToken(token, userDetail);\n        }\n        return null;\n    }\n\n    @Override\n    public UserDetail getUserByToken(String token)\n    {\n        token = token.substring(AuthContants.TOKEN_BEARER_START.length());\n        return jwtTokenUtil.getUserFromToken(token);\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param token :\n     * @return com.winner.config.center.web.auth.entity.UserDetail\n     * llxiao  2019/5/9 - 17:24\n     **/\n    @Override\n    public UserDetail getByToken(String token)\n    {\n        token = token.substring(AuthContants.TOKEN_BEARER_START.length());\n        String username = jwtTokenUtil.getUsernameFromToken(token);\n        return new UserDetail(authApi.findByUsername(username));\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @param username :\n     * @return com.winner.config.center.web.auth.entity.UserDetail\n     * llxiao  2019/5/9 - 17:24\n     **/\n    @Override\n    public UserDetail getByUsername(String username)\n    {\n        return new UserDetail(authApi.findByUsername(username));\n    }\n\n    private Authentication authenticate(String username, String password)\n    {\n        try\n        {\n            //该方法会去调用userDetailsService.loadUserByUsername()去验证用户名和密码，如果正确，则存储该用户名密码到“security 的 context中”\n            return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));\n        }\n        catch (DisabledException | BadCredentialsException e)\n        {\n            throw new CustomException(ResultJson.failure(ResultCode.LOGIN_ERROR, e.getMessage()));\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/service/impl/ConfigUserDetailsServiceImpl.java",
    "content": "package com.xiao.custom.config.web.auth.service.impl;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\nimport com.xiao.custom.config.web.feign.auth.AuthFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: 登陆身份认证\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 10:51\n * @since JDK 1.8\n */\n@Service(\"configUserDetailsService\")\npublic class ConfigUserDetailsServiceImpl implements UserDetailsService\n{\n    @Autowired\n    private AuthFeign authApi;\n\n    /**\n     * Locates the user based on the username. In the actual implementation, the search\n     * may possibly be case sensitive, or case insensitive depending on how the\n     * implementation instance is configured. In this case, the <code>UserDetails</code>\n     * object that comes back may have a username that is of a different case than what\n     * was actually requested..\n     *\n     * @param username the username identifying the user whose data is required.\n     * @return a fully populated user record (never <code>null</code>)\n     * @exception UsernameNotFoundException if the user could not be found or the user has no\n     * GrantedAuthority\n     */\n    @Override\n    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException\n    {\n        AuthUser authUser = authApi.findByUsername(username);\n        if (authUser == null)\n        {\n            throw new UsernameNotFoundException(String.format(\"No userDetail found with username '%s'.\", username));\n        }\n        return new UserDetail(authUser);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/util/JwtUtils.java",
    "content": "package com.xiao.custom.config.web.auth.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.web.auth.entity.UserDetail;\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.CompressionCodecs;\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.stereotype.Component;\n\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author: JoeTao\n * createAt: 2018/9/14\n */\n@Component\n@Slf4j\npublic class JwtUtils\n{\n    public static final String ROLE_REFRESH_TOKEN = \"ROLE_REFRESH_TOKEN\";\n\n    private static final String CLAIM_KEY_USER_ID = \"user_id\";\n    private static final String CLAIM_KEY_AUTHORITIES = \"scope\";\n\n    private Map<String, String> tokenMap = new ConcurrentHashMap<>(32);\n\n    @Value(\"${jwt.secret}\")\n    private String secret;\n\n    @Value(\"${jwt.expiration}\")\n    private Long accessTokenExpiration;\n\n    @Value(\"${jwt.expiration}\")\n    private Long refreshTokenExpiration;\n\n    private final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;\n\n    public UserDetail getUserFromToken(String token)\n    {\n        UserDetail userDetail;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            long userId = getUserIdFromToken(token);\n            String username = claims.getSubject();\n            String roleName = claims.get(CLAIM_KEY_AUTHORITIES).toString();\n            Role role = Role.builder().name(roleName).build();\n            userDetail = new UserDetail(userId, username, role, \"\");\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            userDetail = null;\n        }\n        return userDetail;\n    }\n\n    public long getUserIdFromToken(String token)\n    {\n        long userId;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            userId = Long.parseLong(String.valueOf(claims.get(CLAIM_KEY_USER_ID)));\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            userId = 0;\n        }\n        return userId;\n    }\n\n    public String getUsernameFromToken(String token)\n    {\n        String username;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            username = claims.getSubject();\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            username = null;\n        }\n        return username;\n    }\n\n    public Date getCreatedDateFromToken(String token)\n    {\n        Date created;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            created = claims.getIssuedAt();\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            created = null;\n        }\n        return created;\n    }\n\n    public String generateAccessToken(UserDetail userDetail)\n    {\n        Map<String, Object> claims = generateClaims(userDetail);\n        claims.put(CLAIM_KEY_AUTHORITIES, authoritiesToArray(userDetail.getAuthorities()).get(0));\n        return generateAccessToken(userDetail.getUsername(), claims);\n    }\n\n    public Date getExpirationDateFromToken(String token)\n    {\n        Date expiration;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            expiration = claims.getExpiration();\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            expiration = null;\n        }\n        return expiration;\n    }\n\n    public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset)\n    {\n        final Date created = getCreatedDateFromToken(token);\n        return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset) && (!isTokenExpired(token));\n    }\n\n    public String refreshToken(String token)\n    {\n        String refreshedToken;\n        try\n        {\n            final Claims claims = getClaimsFromToken(token);\n            refreshedToken = generateAccessToken(claims.getSubject(), claims);\n        }\n        catch (Exception e)\n        {\n            log.error(\"Token 获取用户信息错误!\", e);\n            refreshedToken = null;\n        }\n        return refreshedToken;\n    }\n\n    public Boolean validateToken(String token, UserDetails userDetails)\n    {\n        AuthUser userDetail = (AuthUser) userDetails;\n        final long userId = getUserIdFromToken(token);\n        final String username = getUsernameFromToken(token);\n        //        final Date created = getCreatedDateFromToken(token);\n        return (userId == userDetail.getId() && username.equals(userDetail.getUsername()) && !isTokenExpired(token)\n                //                && !isCreatedBeforeLastPasswordReset(created, userDetail.getLastPasswordResetDate())\n        );\n    }\n\n    public String generateRefreshToken(UserDetail userDetail)\n    {\n        Map<String, Object> claims = generateClaims(userDetail);\n        // 只授于更新 token 的权限\n        String roles[] = new String[] { JwtUtils.ROLE_REFRESH_TOKEN };\n        claims.put(CLAIM_KEY_AUTHORITIES, JSONObject.toJSON(roles));\n        return generateRefreshToken(userDetail.getUsername(), claims);\n    }\n\n    public void putToken(String userName, String token)\n    {\n        tokenMap.put(userName, token);\n    }\n\n    public void deleteToken(String userName)\n    {\n        tokenMap.remove(userName);\n    }\n\n    public boolean containToken(String userName, String token)\n    {\n        if (userName != null && tokenMap.containsKey(userName) && tokenMap.get(userName).equals(token))\n        {\n            return true;\n        }\n        return false;\n    }\n\n    private Claims getClaimsFromToken(String token)\n    {\n        Claims claims;\n        try\n        {\n            claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();\n        }\n        catch (Exception e)\n        {\n            claims = null;\n        }\n        return claims;\n    }\n\n    private Date generateExpirationDate(long expiration)\n    {\n        return new Date(System.currentTimeMillis() + expiration * 1000);\n    }\n\n    private Boolean isTokenExpired(String token)\n    {\n        final Date expiration = getExpirationDateFromToken(token);\n        return expiration.before(new Date());\n    }\n\n    private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset)\n    {\n        return (lastPasswordReset != null && created.before(lastPasswordReset));\n    }\n\n    private Map<String, Object> generateClaims(UserDetail userDetail)\n    {\n        Map<String, Object> claims = new HashMap<>(16);\n        claims.put(CLAIM_KEY_USER_ID, userDetail.getId());\n        return claims;\n    }\n\n    private String generateAccessToken(String subject, Map<String, Object> claims)\n    {\n        return generateToken(subject, claims, accessTokenExpiration);\n    }\n\n    private List authoritiesToArray(Collection<? extends GrantedAuthority> authorities)\n    {\n        List<String> list = new ArrayList<>();\n        for (GrantedAuthority ga : authorities)\n        {\n            list.add(ga.getAuthority());\n        }\n        return list;\n    }\n\n    private String generateRefreshToken(String subject, Map<String, Object> claims)\n    {\n        return generateToken(subject, claims, refreshTokenExpiration);\n    }\n\n    private String generateToken(String subject, Map<String, Object> claims, long expiration)\n    {\n        return Jwts.builder().setClaims(claims).setSubject(subject).setId(UUID.randomUUID().toString())\n                .setIssuedAt(new Date()).setExpiration(generateExpirationDate(expiration))\n                .compressWith(CompressionCodecs.DEFLATE).signWith(SIGNATURE_ALGORITHM, secret).compact();\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/util/PageResult.java",
    "content": "package com.xiao.custom.config.web.auth.util;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * 分页结果DO\n *\n * @author Joetao\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Builder\npublic class PageResult<T>\n{\n    private int page;\n    private int rows;\n    private int total;\n    private T data;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/util/ResultCode.java",
    "content": "package com.xiao.custom.config.web.auth.util;\n\n/**\n * @author Joetao\n * 状态码\n * Created by jt on 2018/3/8.\n */\npublic enum ResultCode\n{\n    /*\n    请求返回状态码和说明信息\n     */\n    SUCCESS(200, \"成功\"),\n\n    BAD_REQUEST(400, \"参数或者语法不对\"),\n    UNAUTHORIZED(401, \"认证失败\"),\n    LOGIN_ERROR(401, \"登陆失败，用户名或密码无效\"),\n    FORBIDDEN(403, \"禁止访问\"),\n    NOT_FOUND(404, \"请求的资源不存在\"),\n    OPERATE_ERROR(405, \"操作失败，请求操作的资源不存在\"),\n    TIME_OUT(408, \"请求超时\"),\n\n    SERVER_ERROR(500, \"服务器内部错误\"),\n    ;\n    private int code;\n    private String msg;\n\n    ResultCode(int code, String msg)\n    {\n        this.code = code;\n        this.msg = msg;\n    }\n\n    public int getCode()\n    {\n        return code;\n    }\n\n    public String getMsg()\n    {\n        return msg;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/auth/util/ResultJson.java",
    "content": "package com.xiao.custom.config.web.auth.util;\n\nimport lombok.Data;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.crypto.password.PasswordEncoder;\n\nimport java.io.Serializable;\n\n/**\n * @author Joetao\n * RESTful API 返回类型\n * Created at 2018/3/8.\n */\n@Data\npublic class ResultJson<T> implements Serializable\n{\n\n    private static final long serialVersionUID = 783015033603078674L;\n    private int code;\n    private String msg;\n    private T data;\n\n    public static ResultJson ok()\n    {\n        return ok(\"\");\n    }\n\n    public static ResultJson ok(Object o)\n    {\n        return new ResultJson(ResultCode.SUCCESS, o);\n    }\n\n    public static ResultJson failure(ResultCode code)\n    {\n        return failure(code, \"\");\n    }\n\n    public static ResultJson failure(ResultCode code, Object o)\n    {\n        return new ResultJson(code, o);\n    }\n\n    public ResultJson(ResultCode resultCode)\n    {\n        setResultCode(resultCode);\n    }\n\n    public ResultJson(ResultCode resultCode, T data)\n    {\n        setResultCode(resultCode);\n        this.data = data;\n    }\n\n    public void setResultCode(ResultCode resultCode)\n    {\n        this.code = resultCode.getCode();\n        this.msg = resultCode.getMsg();\n    }\n\n    @Override\n    public String toString()\n    {\n        return \"{\" + \"\\\"code\\\":\" + code + \", \\\"msg\\\":\\\"\" + msg + '\\\"' + \", \\\"data\\\":\\\"\" + data + '\\\"' + '}';\n    }\n\n    public static void main(String[] args)\n    {\n        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();\n        System.out.println(passwordEncoder.encode(\"admin123\"));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/commo/Constants.java",
    "content": "package com.xiao.custom.config.web.commo;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/12/20 14:00\n * @since JDK 1.8\n */\npublic interface Constants\n{\n    String CONFIG_SERVICE = \"config-center-service\";\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/config/AppControllerAdvice.java",
    "content": "package com.xiao.custom.config.web.config;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.netflix.hystrix.exception.HystrixRuntimeException;\nimport com.xiao.custom.config.web.exception.ExceptionEnum;\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.springcloud.demo.common.gloab.interceptor.advice.DefaultControllerAdvice;\nimport com.xiao.springcloud.demo.common.gloab.response.ErrorResponseData;\nimport com.xiao.springcloud.demo.common.gloab.response.ResponseData;\nimport com.xiao.springcloud.demo.common.gloab.response.SuccessResponseData;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.core.MethodParameter;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.server.ServerHttpRequest;\nimport org.springframework.http.server.ServerHttpResponse;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;\n\n/**\n * 全局包裹返回值\n *\n * @author zhdong\n * Date 2018/9/2\n */\n@Slf4j\n@ControllerAdvice\npublic class AppControllerAdvice extends DefaultControllerAdvice implements ResponseBodyAdvice\n{\n\n    /**\n     * 拦截服务调用异常\n     */\n    @ExceptionHandler(HystrixRuntimeException.class)\n    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n    @ResponseBody\n    @Override\n    public ResponseData hystrixRuntimeException(HystrixRuntimeException e)\n    {\n        log.info(\"系统异常:\", e);\n        Throwable cause = e.getCause();\n        //return new ErrorResponseData(e.getCode(), e.getErrorMessage());\n        if (cause instanceof CommonException)\n        {\n            return serviceException((CommonException) cause);\n        }\n        log.info(\"服务远程调用异常:\", e);\n        return ErrorResponseData\n                .error(ExceptionEnum.REQUEST_TIMEOUT.getCode(), ExceptionEnum.REQUEST_TIMEOUT.getMessage());\n    }\n\n    @Override\n    public boolean supports(MethodParameter methodParameter, Class aClass)\n    {\n        return true;\n    }\n\n    /**\n     * 封装返回结果\n     *\n     * @param returnValue\n     * @param methodParameter\n     * @param mediaType\n     * @param aClass\n     * @param serverHttpRequest\n     * @param serverHttpResponse\n     * @return\n     */\n    @Override\n    public Object beforeBodyWrite(Object returnValue, MethodParameter methodParameter, MediaType mediaType,\n            Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse)\n    {\n\n        //如果已经是ResponseData，直接返回\n        if (returnValue instanceof ResponseData)\n        {\n            return returnValue;\n        }\n        else if (returnValue instanceof String)\n        {\n            try\n            {\n                return JSONObject.toJSON(SuccessResponseData.success(returnValue));\n            }\n            catch (Exception e)\n            {\n                log.error(\"返回结果转换json异常\", e);\n                return ErrorResponseData.error(\"返回结果转换json异常\");\n            }\n        }\n        return SuccessResponseData.success(returnValue);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/ClientInfoController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\nimport com.xiao.custom.config.web.feign.client.ClientInfoFeign;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]: 客户端服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 15:55\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/api/config/clientInfo\")\n@Slf4j\npublic class ClientInfoController\n{\n    @Autowired\n    private ClientInfoFeign clientInfoFeign;\n\n    /**\n     * 分页查询客户端信息\n     *\n     * @param query\n     * @return\n     */\n    @RequestMapping(\"/page\")\n    public PageInfo<ClientHostInfoDto> pageQuery(@RequestBody ClientHostInfoQuery query)\n    {\n        return clientInfoFeign.pageQuery(query);\n    }\n\n    /**\n     * [简要描述]:删除数据<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/3/27 - 15:46\n     **/\n    @RequestMapping(\"/del\")\n    public boolean deleteById(Long id)\n    {\n        if (null != id)\n        {\n            return clientInfoFeign.deleteById(id);\n        }\n        else\n        {\n            log.error(\"删除失败，客户端注解ID为空!\");\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/ConfigGroupController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.web.feign.config.ConfigGroupFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/12/21 14:26\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/api/config/configGroup\")\npublic class ConfigGroupController\n{\n    @Autowired\n    private ConfigGroupFeign configGroupFeign;\n\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ConfigItemGroupDto> page(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        return configGroupFeign.page(configItemGroupQuery);\n    }\n\n    @RequestMapping(value = \"/delete/{ids}\")\n    public Integer delete(@PathVariable(\"ids\") String ids)\n    {\n        return configGroupFeign.delete(ids);\n    }\n\n    @RequestMapping(value = \"/save\")\n    public Boolean save(@RequestBody ConfigItemGroupDto configItemGroupDto)\n    {\n        return configGroupFeign.save(configItemGroupDto);\n    }\n\n    @RequestMapping(value = \"/update\")\n    public Boolean update(@RequestBody ConfigItemGroupDto configItemGroupDto)\n    {\n        return configGroupFeign.update(configItemGroupDto);\n    }\n\n    @RequestMapping(value = \"/isRefGroup\")\n    public PageInfo<ConfigItemDto> pageRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        return configGroupFeign.pageRefConfigItemWithGroup(configItemQuery);\n    }\n\n    @RequestMapping(value = \"/batchDelete/{groupId}/{itemIds}\")\n    public Boolean batchDelete(@PathVariable(\"itemIds\") String itemIds, @PathVariable(\"groupId\") Long groupId)\n    {\n        return configGroupFeign.batchDelete(groupId, itemIds);\n    }\n\n    @RequestMapping(value = \"/notRefGroup\")\n    public PageInfo<ConfigItemDto> pageNotRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        return configGroupFeign.pageNotRefConfigItemWithGroup(configItemQuery);\n    }\n\n    @RequestMapping(value = \"/batchSave/{groupId}/{itemIds}\")\n    public Boolean batchSave(@PathVariable(\"itemIds\") String itemIds, @PathVariable(\"groupId\") Long groupId)\n    {\n        return configGroupFeign.batchSave(groupId, itemIds);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/ConfigItemController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.web.feign.config.ConfigItemFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:配置项管理\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/12/20 11:43\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/api/config/configItem\")\npublic class ConfigItemController\n{\n    @Autowired\n    private ConfigItemFeign configItemService;\n\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ConfigItemDto> pageConfigItem(@RequestBody ConfigItemQuery configItemQuery)\n    {\n        return configItemService.pageConfigItem(configItemQuery);\n    }\n\n    @RequestMapping(value = \"/batchDelete/{ids}\")\n    public Integer enableOrDisable(@PathVariable(\"ids\") String ids)\n    {\n        return configItemService.enableOrDisable(ids);\n    }\n\n    @RequestMapping(value = \"/save\")\n    public Boolean save(@RequestBody ConfigItemDto configItemDto)\n    {\n        return configItemService.save(configItemDto);\n    }\n\n    @RequestMapping(value = \"/update\")\n    public Boolean update(@RequestBody ConfigItemDto configItemDto)\n    {\n        return configItemService.update(configItemDto);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/IndexController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author zhdong\n * @version 1.0,  2018/11/21\n * @since JDK 1.8\n */\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * 首页转发\n * @author zhdong\n * Date 2018/8/23\n */\n@Controller\npublic class IndexController\n{\n\n    @Value(\"${omni.channel.admin.page.index:index/index}\")\n    private String indexPage;\n\n    @RequestMapping(value = \"/\")\n    public String index(HttpServletRequest req, HttpServletResponse resp) throws IOException\n    {\n        return indexPage;\n    }\n\n    @RequestMapping(value = \"/index\")\n    public String index2(HttpServletRequest req, HttpServletResponse resp) throws IOException {\n        return indexPage;\n    }\n\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/RegionController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\nimport com.xiao.custom.config.web.feign.region.RegionFeign;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\n/**\n * [简要描述]: 区域Controller\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2018/12/20 15:31\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/region\")\n@Slf4j\npublic class RegionController\n{\n    @Autowired\n    private RegionFeign regionFeign;\n\n    /**\n     * [简要描述]:分页查询区域信息\n     * [详细描述]:<br/>\n     *\n     * @param regionQuery : 分页查询对象\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.web.dto.ConfigItemDto>\n     * mjye  2018/12/20 - 15:52\n     **/\n    @RequestMapping(value = \"/queryRegion\")\n    public PageInfo<RegionDto> pageConfigItem(@RequestBody RegionQuery regionQuery)\n    {\n        return regionFeign.queryRegion(regionQuery);\n    }\n\n    /**\n     * [简要描述]:删除区域\n     * [详细描述]:<br/>\n     *\n     * @return java.lang.Boolean\n     * mjye  2018/12/20 - 17:28\n     **/\n    @RequestMapping(value = \"/delectRegion/{ids}\")\n    public Boolean delectRegion(@PathVariable(\"ids\") String ids)\n    {\n        if (null == ids)\n        {\n            log.info(\"删除区域信息失败，id不能为空\");\n            throw new RuntimeException(\"参数不能为空\");\n        }\n        return regionFeign.delete(ids);\n    }\n\n    //    /**\n    //     * [简要描述]:更新区域信息\n    //     * [详细描述]:<br/>\n    //      * @param regionDto :\n    //     * @return java.lang.Boolean\n    //     * mjye  2018/12/20 - 17:29\n    //     **/\n    //    @PostMapping(value=\"/updateRegion\")\n    //    public  Boolean updateRegion(@RequestBody RegionDto regionDto){\n    //        if(null == regionDto.getId()  ||  StringUtils.isBlank(regionDto.getRegionDesc()) || StringUtils.isBlank(regionDto.getRegionName())\n    //                || null == regionDto.getCreateTime()) {\n    //            log.info(\"更改区域信息失败,参数不能为空\");\n    //            throw new RuntimeException(\"参数不能为空\");\n    //        }\n    //        return  regionFeign.updateRegion(regionDto);\n    //    }\n\n    /**\n     * [简要描述]:新增or修改区域信息\n     * [详细描述]:<br/>\n     *\n     * @param regionDto :\n     * @return java.lang.Boolean\n     * mjye  2018/12/20 - 17:31\n     **/\n    @PostMapping(value = \"/addRegion\")\n    public Boolean addRegion(@RequestBody RegionDto regionDto)\n    {\n        if (null == regionDto.getId())\n        {\n            if (StringUtils.isBlank(regionDto.getRegionDesc()) || StringUtils.isBlank(regionDto.getRegionName()))\n            {\n                log.info(\"新增区域信息失败,参数不能为空\");\n                throw new RuntimeException(\"参数不能为空\");\n            }\n            return regionFeign.addRegion(regionDto);\n        }\n        else\n        {\n            if (StringUtils.isBlank(regionDto.getRegionDesc()) || StringUtils.isBlank(regionDto.getRegionName()))\n            {\n                log.info(\"更改区域信息失败,参数不能为空\");\n                throw new RuntimeException(\"参数不能为空\");\n            }\n            return regionFeign.updateRegion(regionDto);\n        }\n    }\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/ServerHostConfigController.java",
    "content": "package com.xiao.custom.config.web.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\nimport com.xiao.custom.config.web.feign.server.ServerHostConfigFeign;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:服务器管理\n * [详细描述]:\n *\n * @author jyqiao\n * @version 1.0, 2018/12/20\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(value = \"/api/serverHostConfig\")\n@Slf4j\npublic class ServerHostConfigController\n{\n    @Autowired\n    private ServerHostConfigFeign serverHostConfigFeign;\n\n    //查询服务器配置信息\n    @RequestMapping(value = \"/page\")\n    public PageInfo<ServerHostConfigDto> pageConfigItem(@RequestBody ServerHostConfigQuery serverHostConfigQuery)\n    {\n        return serverHostConfigFeign.pageServerHostConfig(serverHostConfigQuery);\n    }\n\n    //更改服务器配置信息\n    @RequestMapping(value = \"/updateServerHostConfig\")\n    public Boolean updateServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto)\n    {\n\n        return serverHostConfigFeign.updateServerHostConfig(serverHostConfigDto);\n    }\n\n    //添加服务器配置信息\n    @RequestMapping(value = \"/addServerHostConfig\")\n    public Boolean addServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto)\n    {\n        return serverHostConfigFeign.addServerHostConfig(serverHostConfigDto);\n    }\n\n    //删除服务器配置信息\n    @RequestMapping(value = \"/delectServerHostConfig/{id}\")\n    public int delectServerHostConfig(@PathVariable(\"id\") String id)\n    {\n        long ids = Long.parseLong(id);\n        return serverHostConfigFeign.delectServerHostConfig(ids);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/app/AppManagerController.java",
    "content": "package com.xiao.custom.config.web.controller.app;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.query.AppQuery;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.web.controller.app.vo.ApplicationVo;\nimport com.xiao.custom.config.web.controller.app.vo.RegionVo;\nimport com.xiao.custom.config.web.feign.app.ApplicationFeign;\nimport com.xiao.custom.config.web.feign.region.RegionFeign;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/20 10:19\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/appManager\")\n@Slf4j\npublic class AppManagerController\n{\n    @Autowired\n    private ApplicationFeign applicationFeign;\n\n    @Autowired\n    private RegionFeign regionFeign;\n\n    @PostMapping(\"/pageQuery\")\n    public PageInfo<ApplicationDto> pageQuery(@RequestBody AppQuery appQuery)\n    {\n        return applicationFeign.pageApplicationConfig(appQuery);\n    }\n\n    @RequestMapping(\"/queryAllRegion\")\n    public List<RegionVo> queryAllRegion()\n    {\n        List<RegionVo> regionVos;\n        List<RegionDto> regionDtos = regionFeign.selectRgion();\n        if (CollectionUtil.isNotEmpty(regionDtos))\n        {\n            regionVos = new ArrayList<>(regionDtos.size());\n            for (RegionDto regionDto : regionDtos)\n            {\n                regionVos.add(convertVo(regionDto));\n            }\n        }\n        else\n        {\n            regionVos = null;\n        }\n        return regionVos;\n    }\n\n    @RequestMapping(\"/save\")\n    public boolean saveApplication(@RequestBody ApplicationVo applicationVo)\n    {\n        return applicationFeign.save(convertDto(applicationVo));\n    }\n\n    @RequestMapping(\"/update\")\n    public Boolean update(@RequestBody ApplicationVo applicationVo)\n    {\n        if (applicationVo.getId() == null)\n        {\n            return false;\n        }\n        else\n        {\n            return applicationFeign.update(convertDto(applicationVo));\n        }\n    }\n\n    //删除应用，以及包括他所属下管理的所有配置\n    @RequestMapping(\"/delete\")\n    public boolean deleteApplication(Long id)\n    {\n        if (null != id)\n        {\n            return applicationFeign.delete(id);\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:发布配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/1/30 - 10:50\n     **/\n    @RequestMapping(\"/refresh\")\n    public boolean refresh(Long id)\n    {\n        if (null != id)\n        {\n            return applicationFeign.refresh(id);\n        }\n        return false;\n    }\n\n    @RequestMapping(\"/queryItemGroup\")\n    public PageInfo<ConfigItemGroupDto> pageRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        if (null == configItemGroupQuery.getAppId())\n        {\n            log.error(\"应用ID不能为空!\");\n            new PageInfo<>();\n        }\n        return this.applicationFeign.pageRefGroupWithApp(configItemGroupQuery);\n    }\n\n    /**\n     * [简要描述]:应用ID和组ID删除对应关系<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appId : 应用ID\n     * @param itemGroupId : 组ID\n     * @return boolean\n     * llxiao  2018/12/25 - 17:38\n     **/\n    @RequestMapping(\"delItemGroup\")\n    public boolean delItemGroup(Long appId, Long itemGroupId)\n    {\n        if (null != appId && null != itemGroupId)\n        {\n            return applicationFeign.batchUnBind(String.valueOf(itemGroupId), appId);\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:获取未绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:31\n     **/\n    @RequestMapping(value = \"/notRefApp\")\n    public PageInfo<ConfigItemGroupDto> pageNotRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery)\n    {\n        if (configItemGroupQuery.getAppId() == null)\n        {\n            return new PageInfo<>();\n        }\n        return this.applicationFeign.pageNotRefGroupWithApp(configItemGroupQuery);\n    }\n\n    /**\n     * [简要描述]:绑定应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIds :\n     * @param appId :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/2 - 14:48\n     **/\n    @RequestMapping(value = \"/batchSaveRef\")\n    public Boolean batchSave(@RequestParam(\"groupIds\") String groupIds, @RequestParam(\"appId\") Long appId)\n    {\n        if (StringUtils.isEmpty(groupIds) || null == appId)\n        {\n            return false;\n        }\n        return this.applicationFeign.batchSave(groupIds, appId);\n    }\n\n    /**\n     * [简要描述]:应用查询关联的私有配置属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * llxiao  2019/1/7 - 15:24\n     **/\n    @RequestMapping(\"/queryPrivateConfig\")\n    public PageInfo<ApplicationConfigDto> pageQuery(@RequestBody ApplicationConfigQuery applicationConfigQuery)\n    {\n        if (null == applicationConfigQuery.getApplicationId())\n        {\n            return new PageInfo<>();\n        }\n        return this.applicationFeign.queryPrivateConfig(applicationConfigQuery);\n    }\n\n    //新增私有配置项\n    @RequestMapping(\"/addPrivateItem\")\n    public Boolean savePrivateConfig(@RequestBody ApplicationConfigDto applicationConfigDto)\n    {\n        if (null == applicationConfigDto.getApplicationId())\n        {\n            return false;\n        }\n        return this.applicationFeign.savePrivateConfig(applicationConfigDto);\n    }\n\n    //修改私有配置项\n    @RequestMapping(\"/updatePrivateItem\")\n    public Boolean updatePrivateConfig(@RequestBody ApplicationConfigDto applicationConfigDto)\n    {\n        if (null == applicationConfigDto.getId())\n        {\n            return false;\n        }\n        return this.applicationFeign.updatePrivateConfig(applicationConfigDto);\n    }\n\n    //删除私有配置项\n    @RequestMapping(\"/delPrivateItem\")\n    public Boolean delPrivateConfig(Long id)\n    {\n        if (null == id)\n        {\n            return false;\n        }\n        return this.applicationFeign.delPrivateConfig(id);\n    }\n\n    private ApplicationDto convertDto(ApplicationVo applicationVo)\n    {\n        ApplicationDto applicationConfigDto = new ApplicationDto();\n        applicationConfigDto.setId(applicationVo.getId());\n        applicationConfigDto.setApplication(applicationVo.getApplication());\n        applicationConfigDto.setApplicationName(applicationVo.getApplicationName());\n        applicationConfigDto.setLabel(applicationVo.getLabel());\n        applicationConfigDto.setProfile(applicationVo.getProfile());\n        applicationConfigDto.setCreateTime(new Date());\n        applicationConfigDto.setUpdateTime(new Date());\n        applicationConfigDto.setRegionId(applicationVo.getRegion());\n        applicationConfigDto.setGroupIds(applicationVo.getConfGroupIds());\n        return applicationConfigDto;\n    }\n\n    private RegionVo convertVo(RegionDto regionDto)\n    {\n        RegionVo regionVo = new RegionVo();\n        regionVo.setLabel(regionDto.getRegionName());\n        regionVo.setValue(regionDto.getId());\n        return regionVo;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/app/vo/ApplicationVo.java",
    "content": "package com.xiao.custom.config.web.controller.app.vo;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/21 20:53\n * @since JDK 1.8\n */\n@Data\npublic class ApplicationVo\n{\n    private Long id;\n    private String application;\n    private String applicationName;\n    private Long region;\n    private String label;\n    private String profile;\n    private String confGroupIds;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/controller/app/vo/RegionVo.java",
    "content": "package com.xiao.custom.config.web.controller.app.vo;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/21 17:11\n * @since JDK 1.8\n */\n@Data\npublic class RegionVo\n{\n    private String label;\n    private Long value;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/dto/ServerHostConfigDto.java",
    "content": "package com.xiao.custom.config.web.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n* Created by Mybatis Generator on 2018/11/23\n*/\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class ServerHostConfigDto\n{\n    //\n    private Long id;\n\n    //IP地址\n    private String serverHost;\n\n    //服务描述\n    private String serverDesc;\n\n    //关联区域\n    private Long regionId;\n    \n    //关联区域名称\n    private String regionName;\n\n    //\n    private Date createTime;\n\n    //\n    private Date updateTime;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/exception/ExceptionEnum.java",
    "content": "package com.xiao.custom.config.web.exception;\n\nimport com.xiao.springcloud.demo.common.exception.AbstractServiceException;\n\n/**\n * @author zhdong\n * Date 2018/9/2\n */\npublic enum ExceptionEnum implements AbstractServiceException\n{\n    REQUEST_TIMEOUT(7500001,\"请求超时\"),\n    PARAM_REQUIRED(7500002,\"参数必填\"),\n    EXCEL_WRITER_IO(7500003,\"写入excel出错\"),\n    EXCEL_READ_IO(750004,\"读取excel出错\"),\n    EXCEL_EXPORT_OVER_MAX(7500005,\"导出超过最大数量\"),\n    NO_LOGIN(7500006,\"未登录\"),\n    EXCEL_DOWN_ERROR(7500007,\"下载excel报错\");\n\n    ExceptionEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n\n    private Integer code;\n\n    private String message;\n\n    @Override\n    public Integer getCode() {\n        return code;\n    }\n\n    @Override\n    public String getMessage() {\n        return message;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/app/ApplicationFeign.java",
    "content": "package com.xiao.custom.config.web.feign.app;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ApplicationConfigDto;\nimport com.xiao.custom.config.pojo.dto.ApplicationDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.query.AppQuery;\nimport com.xiao.custom.config.pojo.query.ApplicationConfigQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/20 10:20\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(\"/application\")\npublic interface ApplicationFeign\n{\n    /**\n     * [简要描述]:分页获取<br/>\n     * [详细描述]:<br/>\n     *\n     * @param appQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ApplicationConfigDto>\n     * jun.liu  2018/11/28 - 10:20\n     **/\n    @RequestMapping(value = \"page\")\n    PageInfo<ApplicationDto> pageApplicationConfig(@RequestBody AppQuery appQuery);\n\n    /**\n     * [简要描述]:新增应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 10:29\n     **/\n    @RequestMapping(value = \"/save\")\n    Boolean save(@RequestBody ApplicationDto applicationConfigDto);\n\n    /**\n     * [简要描述]:删除应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :  主键ID\n     * @return java.lang.Boolean\n     * llxiao  2018/12/24 - 10:24\n     **/\n    @RequestMapping(value = \"/delete/{id}\")\n    Boolean delete(@PathVariable(\"id\") Long id);\n\n    /**\n     * [简要描述]:应用更新配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id : 应用主键ID\n     * @return boolean\n     * llxiao  2019/1/30 - 10:52\n     **/\n    @RequestMapping(\"/refresh\")\n    boolean refresh(@RequestParam(\"id\") Long id);\n\n    /**\n     * [简要描述]:更新配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto : 更新\n     * @return java.lang.Boolean\n     * llxiao  2018/12/24 - 19:22\n     **/\n    @RequestMapping(value = \"/update\")\n    Boolean update(@RequestBody ApplicationDto applicationConfigDto);\n\n    /**\n     * [简要描述]:获取已绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 14:59\n     **/\n    @RequestMapping(value = \"/isRefApp\")\n    PageInfo<ConfigItemGroupDto> pageRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery);\n\n    /**\n     * [简要描述]:删除绑定<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIds :\n     * @param appId :\n     * @return java.lang.Boolean\n     * jun.liu  2018/11/28 - 15:39\n     **/\n    @RequestMapping(value = \"/batchDeleteRef\")\n    Boolean batchUnBind(@RequestParam(\"groupIds\") String groupIds, @RequestParam(\"appId\") Long appId);\n\n    /**\n     * [简要描述]:获取未绑定该应用的配置组<br/>\n     * [详细描述]:<br/>\n     *\n     * @param configItemGroupQuery :\n     * @return com.github.pagehelper.PageInfo<com.winner.config.center.pojo.db.dto.ConfigItemGroupDto>\n     * jun.liu  2018/11/28 - 15:31\n     **/\n    @RequestMapping(value = \"/notRefApp\")\n    PageInfo<ConfigItemGroupDto> pageNotRefGroupWithApp(@RequestBody ConfigItemGroupQuery configItemGroupQuery);\n\n    /**\n     * [简要描述]:绑定应用<br/>\n     * [详细描述]:<br/>\n     *\n     * @param groupIds :\n     * @param appId :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/2 - 14:48\n     **/\n    @RequestMapping(value = \"/batchSaveRef\")\n    Boolean batchSave(@RequestParam(\"groupIds\") String groupIds, @RequestParam(\"appId\") Long appId);\n\n    /**\n     * [简要描述]:查收私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigQuery\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:01\n     **/\n    @RequestMapping(\"/queryPrivateConfig\")\n    PageInfo<ApplicationConfigDto> queryPrivateConfig(ApplicationConfigQuery applicationConfigQuery);\n\n    /**\n     * [简要描述]:新增一条私有配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:06\n     **/\n    @RequestMapping(\"/savePrivateConfig\")\n    Boolean savePrivateConfig(ApplicationConfigDto applicationConfigDto);\n\n    /**\n     * [简要描述]:更新一条私有配置信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param applicationConfigDto :\n     * @return java.lang.Boolean\n     * llxiao  2019/1/7 - 17:06\n     **/\n    @RequestMapping(\"/updatePrivateConfig\")\n    Boolean updatePrivateConfig(ApplicationConfigDto applicationConfigDto);\n\n    /**\n     * [简要描述]:删除某项私有属性<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id : 私有属性主键ID\n     * @return java.lang.Boolean\n     * llxiao  2019/1/8 - 9:20\n     **/\n    @RequestMapping(\"/delPrivateConfig\")\n    Boolean delPrivateConfig(@RequestParam(\"id\") Long id);\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/auth/AuthFeign.java",
    "content": "package com.xiao.custom.config.web.feign.auth;\n\nimport com.xiao.custom.config.pojo.entity.AuthUser;\nimport com.xiao.custom.config.pojo.entity.Role;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]: 鉴权服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/8 17:56\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(value = \"/auth\")\npublic interface AuthFeign\n{\n    /**\n     * 根据用户名查找用户\n     *\n     * @param username\n     * @return\n     */\n    @RequestMapping(\"/findByUsername\")\n    AuthUser findByUsername(@RequestParam(\"username\") String username);\n\n    /**\n     * 创建新用户\n     *\n     * @param userDetail\n     */\n    @RequestMapping(\"/insert\")\n    void insert(@RequestBody AuthUser userDetail);\n\n    /**\n     * 创建用户角色\n     *\n     * @param userId\n     * @param roleId\n     * @return\n     */\n    @RequestMapping(\"/insertRole\")\n    int insertRole(@RequestParam(\"userId\") long userId, @RequestParam(\"roleId\") long roleId);\n\n    /**\n     * 根据角色id查找角色\n     *\n     * @param roleId\n     * @return\n     */\n    @RequestMapping(\"/findRoleById\")\n    Role findRoleById(long roleId);\n\n    /**\n     * 根据用户id查找该用户角色\n     *\n     * @param userId\n     * @return\n     */\n    @RequestMapping(\"/findRoleByUserId\")\n    Role findRoleByUserId(long userId);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/client/ClientInfoFeign.java",
    "content": "package com.xiao.custom.config.web.feign.client;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ClientHostInfoDto;\nimport com.xiao.custom.config.pojo.query.ClientHostInfoQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/3/27 15:52\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(\"/clientInfo\")\npublic interface ClientInfoFeign\n{\n    /**\n     * 分页查询客户端信息\n     *\n     * @param query\n     * @return\n     */\n    @RequestMapping(\"/page\")\n    PageInfo<ClientHostInfoDto> pageQuery(@RequestBody ClientHostInfoQuery query);\n\n    /**\n     * [简要描述]:删除数据<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id :\n     * @return boolean\n     * llxiao  2019/3/27 - 15:46\n     **/\n    @RequestMapping(\"/del\")\n    boolean deleteById(@RequestParam(\"id\") Long id);\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/config/ConfigGroupFeign.java",
    "content": "package com.xiao.custom.config.web.feign.config;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.dto.ConfigItemGroupDto;\nimport com.xiao.custom.config.pojo.query.ConfigItemGroupQuery;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/12/21 14:26\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(value = \"/configItemGroup\")\npublic interface ConfigGroupFeign\n{\n    @RequestMapping(value = \"/page\")\n    PageInfo<ConfigItemGroupDto> page(@RequestBody ConfigItemGroupQuery configItemGroupQuery);\n\n    @RequestMapping(value = \"/delete/{ids}\")\n    Integer delete(@PathVariable(\"ids\") String ids);\n\n    @RequestMapping(value = \"/save\")\n    Boolean save(@RequestBody ConfigItemGroupDto configItemGroupDto);\n\n    @RequestMapping(value = \"/update\")\n    Boolean update(@RequestBody ConfigItemGroupDto configItemGroupDto);\n\n    @RequestMapping(value = \"/isRefGroup\")\n    PageInfo<ConfigItemDto> pageRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery);\n\n    @RequestMapping(value = \"/batchDelete/{groupId}/{itemIds}\")\n    Boolean batchDelete(@PathVariable(\"groupId\") Long groupId, @PathVariable(\"itemIds\") String itemIds);\n\n    @RequestMapping(value = \"/notRefGroup\")\n    PageInfo<ConfigItemDto> pageNotRefConfigItemWithGroup(@RequestBody ConfigItemQuery configItemQuery);\n\n    @RequestMapping(value = \"/batchSave/{groupId}/{itemIds}\")\n    Boolean batchSave(@PathVariable(\"groupId\") Long groupId, @PathVariable(\"itemIds\") String itemIds);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/config/ConfigItemFeign.java",
    "content": "package com.xiao.custom.config.web.feign.config;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ConfigItemDto;\nimport com.xiao.custom.config.pojo.query.ConfigItemQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jun.liu\n * @version 1.0, 2018/12/20 13:58\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(value = \"/configItem\")\npublic interface ConfigItemFeign\n{\n    @RequestMapping(value = \"/page\")\n    PageInfo<ConfigItemDto> pageConfigItem(@RequestBody ConfigItemQuery configItemQuery);\n\n    @RequestMapping(value = \"/batchDelete/{ids}\")\n    Integer enableOrDisable(@PathVariable(\"ids\") String ids);\n\n    @RequestMapping(value = \"/save\")\n    Boolean save(@RequestBody ConfigItemDto configItemDto);\n\n    @RequestMapping(value = \"/update\")\n    Boolean update(@RequestBody ConfigItemDto configItemDto);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/region/RegionFeign.java",
    "content": "package com.xiao.custom.config.web.feign.region;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.RegionDto;\nimport com.xiao.custom.config.pojo.query.RegionQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2018/12/20 15:39\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(value = \"/region\")\npublic interface RegionFeign\n{\n    //分页查询区域\n    @RequestMapping(value = \"/queryRegion\")\n    PageInfo<RegionDto> queryRegion(@RequestBody RegionQuery regionQuery);\n\n    //删除区域\n    @PostMapping(value=\"/delectRegion/{ids}\")\n    Boolean delete(@PathVariable(\"ids\") String ids);\n\n    //更新区域信息\n    @PostMapping(value=\"/updateRegion\")\n    Boolean updateRegion(@RequestBody RegionDto regionDto);\n\n    //新增区域信息\n    @PostMapping(value=\"/addRegion\")\n    Boolean addRegion(@RequestBody RegionDto regionDto);\n\n    //查询所有的 Region\n    @RequestMapping(value = \"/selectRgion\")\n    List<RegionDto> selectRgion();\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/java/com/xiao/custom/config/web/feign/server/ServerHostConfigFeign.java",
    "content": "package com.xiao.custom.config.web.feign.server;\n\nimport com.github.pagehelper.PageInfo;\nimport com.xiao.custom.config.pojo.dto.ServerHostConfigDto;\nimport com.xiao.custom.config.pojo.query.ServerHostConfigQuery;\nimport com.xiao.custom.config.web.commo.Constants;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author jyqiao\n * @version 1.0, 2018/12/20 13:58\n * @since JDK 1.8\n */\n@FeignClient(value = Constants.CONFIG_SERVICE)\n@RequestMapping(value = \"/serverHostConfig\")\npublic interface ServerHostConfigFeign\n{\n    //查询服务器配置信息\n    @RequestMapping(value = \"/queryServerHost\")\n    PageInfo<ServerHostConfigDto> pageServerHostConfig(@RequestBody ServerHostConfigQuery serverHostConfigQuery);\n\n    //添加服务器配置信息\n    @RequestMapping(value = \"/addServerHostConfig\")\n    Boolean addServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto);\n\n    //更改服务器配置信息\n    @RequestMapping(value = \"/updateServerHostConfig\")\n    Boolean updateServerHostConfig(@RequestBody ServerHostConfigDto serverHostConfigDto);\n\n    //删除服务器配置信息\n    @RequestMapping(value = \"/delectServerHostConfig/{id}\")\n    int delectServerHostConfig(@PathVariable(\"id\") Long id);\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/application.properties",
    "content": "##########设置编码############\nspring.http.encoding.force=true\nspring.http.encoding.charset=UTF-8\nspring.http.encoding.enabled=true\nserver.tomcat.uri-encoding=UTF-8\n\nspring.http.multipart.maxFileSize=10MB\nspring.http.multipart.maxRequestSize=10MB\nspring.mvc.view.prefix=/pages/\nspring.mvc.view.suffix=.html\nmessage.service.web.page.index=index/index\n#Fegin 超时配置\nribbon.ReadTimeout=60000\nribbon.ConnectTimeout=60000\nribbon.MaxAutoRetries=0\nribbon.MaxAutoRetriesNextServer=1\n\n######鉴权\n#使用session，对接web前端\nspring.session.store-type=none\nsecurity.basic.enabled=false\n#登录Url\nconfig.center.loginUrl=/login\n##匿名访问Url集\nconfig.center.anonymous.urls=/health,/pages/support/support.html,/login**,/images/**,/plugin/**,/pages/**/*.css,/mock/**,/favicon.ico,/user/auth/login,/error/**,/login\n#加密密钥\njwt.secret=mySecret\n#token有效期一天\njwt.expiration=86400\n\n#hystrix.command.default.execution.timeout.enabled=false\n#feign.hystrix.enabled=false\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/application.yml",
    "content": "eureka:\n  instance:\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    #lease-expiration-duration-in-seconds: 10\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    #lease-renewal-interval-in-seconds: 2\n  client:\n    serviceUrl:\n      defaultZone: http://localhost:9000/eureka/\n    #开启健康检查（需要spring-boot-starter-actuator依赖）\n    #healthcheck:\n      #enable: true\nspring:\n  application:\n    name: config-web\n  cloud:\n    #开启重试机制，它默认是关闭的\n    loadbalancer:\n      retry:\n        enable: true\n# 开启熔断功能\nfeign:\n  #hystrix:\n    #enabled: true\n  compression:\n    #请求GZIP压缩\n    request:\n      enabled: true\n      #支持压缩类型\n      mime-types: text/xml,application/xml,application/json\n      #压缩数据大小的下限\n      min-request-size: 2048\n    #响应gzip压缩\n    response:\n      enabled: true\n# hystrix超时设置,断路器的超时时间需要大于ribbon的超时时间，不然不会触发重试\nhystrix:\n  command.default.execution.isolation.thread.timeoutInMilliseconds: 60000"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 9002\nspring:\n  cloud:\n    config:\n      uri: http://localhost:9000/config/\n      profile: @env@\n      label: master\n      name: config-center-web\n  application:\n    name: config-center-web\n#logging.level.root: debug\nlogging.level.com.netflix.eureka.registry: ERROR"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/mock/index.js",
    "content": "//模拟菜单数据\nMock.mock(/api\\/user\\/menuList/, new MockResult([\n    {\n        \"id\": \"#1\",\n        \"menuId\": \"#1\",\n        \"name\": \"首页\",\n        \"url\": \"#home/home.html\",\n        \"iconCls\": \"iconfont icon-home\",\n        \"componentId\": \"admin-home\"\n    },\n    {\"id\": \"2\", \"menuId\": \"2\", \"name\": \"应用管理\", \"url\": \"#app/app.html\", \"iconCls\": \"iconfont icon-gaiicon-\"},\n    {\n        \"id\": \"3\", \"menuId\": \"3\", \"name\": \"配置管理\", \"iconCls\": \"iconfont icon-peizhi\",\n        children: [\n            {\n                \"id\": \"31\",\n                \"menuId\": \"3-31\",\n                \"name\": \"配置项管理\",\n                \"url\": \"#config/configitem.html\",\n                \"iconCls\": \"el-icon-setting\"\n            }, {\n                \"id\": \"32\",\n                \"menuId\": \"3-32\",\n                \"name\": \"配置组管理\",\n                \"url\": \"#configgroup/configgroup.html\",\n                \"iconCls\": \"el-icon-setting\"\n            }\n        ]\n    },\n    {\"id\": \"4\", \"menuId\": \"4\", \"name\": \"区域管理\", \"url\": \"#region/region.html\", \"iconCls\": \"iconfont icon-quyu\"},\n    {\"id\": \"5\", \"menuId\": \"5\", \"name\": \"服务管理\", \"url\": \"#server/serverlist.html\", \"iconCls\": \"iconfont el-icon-document\"},\n    // {\n    //     \"id\": \"5\", \"menuId\": \"5\", \"name\": \"演示\", \"iconCls\": \"iconfont icon-yanshi\",\n    //     children: [\n    //         {\n    //             \"id\": \"51\",\n    //             \"menuId\": \"5-51\",\n    //             \"name\": \"查询演示\",\n    //             \"url\": \"#template/template.html\",\n    //             \"iconCls\": \"el-icon-search\"\n    //         },\n    //     ]\n    // },\n]));\n\n//应用数据\n(function () {\n    var pager = new App.Pager()\n    delete pager.list;\n    pager[\"list|1-100\"] = [\n        {\n            \"id|1-1000000\": 0,\n            \"name\": \"消息服务\",\n            \"desc\": \"这是应用描述。。。。\",\n            \"person|1\": [Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname(), Mock.Random.cname()],\n            \"creator\": \"toga\",\n            \"createTime\": new Date(),\n            \"envList\": [\n                {\n                    \"profile\": \"dev\",\n                    \"url\": \"http://localhost:7775\"\n                },\n                {\n                    \"profile\": \"test\",\n                    \"url\": \"http://localhost:7775\"\n                }\n            ]\n        }\n    ];\n\n    Mock.mock(/api\\/app\\/query/, new MockResult(pager))\n\n})()\n\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/mock/mock.js",
    "content": "// 配置Ajax请求延时，可用来测试网络延迟大时项目中一些效果\nMock.setup({\n  timeout: 500\n})\n\nMockResult = function(data){\n    this.code = 200\n    this.data = data\n    this.message = '请求成功'\n    this.success = true\n}\n\nMockPageResult = function(data){\n    this.code = 200\n    this.data = new App.Pager(data)\n    this.message = '请求成功'\n    this.success = true\n}\n\nMock.mock(/api\\/mpc\\/shopdec\\/catalog\\/pageSubject.?/,{\"code\":200,\"data\":{\"endRow\":4,\"firstPage\":1,\"hasNextPage\":false,\"hasPreviousPage\":false,\"isFirstPage\":true,\"isLastPage\":true,\"lastPage\":1,\"list\":[{\"createTime\":\"2018-10-30 11:13:26\",\"creator\":\"admin\",\"endTime\":\"2018-11-30 00:00:00\",\"id\":19,\"pageNum\":1,\"pageSize\":10,\"shopId\":\"21\",\"shopName\":\"北京王府井店\",\"sort\":1,\"startTime\":\"2018-10-30 00:00:00\",\"status\":0,\"subjectName\":\"首页\",\"updateTime\":\"2018-11-11 10:31:39\",\"updator\":\"admin\"},{\"createTime\":\"2018-10-30 15:31:21\",\"creator\":\"admin\",\"endTime\":\"2018-11-29 00:00:00\",\"id\":20,\"pageNum\":1,\"pageSize\":10,\"shopId\":\"21\",\"shopName\":\"北京王府井店\",\"sort\":2,\"startTime\":\"2018-10-30 00:00:00\",\"status\":0,\"subjectName\":\"纯粹自然\",\"updateTime\":\"2018-11-07 19:39:05\",\"updator\":\"admin\"},{\"createTime\":\"2018-11-07 19:37:38\",\"creator\":\"admin\",\"endTime\":\"2029-12-31 00:00:00\",\"id\":21,\"pageNum\":1,\"pageSize\":10,\"shopId\":\"21\",\"shopName\":\"北京王府井店\",\"sort\":3,\"startTime\":\"2018-11-07 00:00:00\",\"status\":0,\"subjectName\":\"纯梦空间\",\"updateTime\":\"2018-11-07 19:39:00\",\"updator\":\"admin\"},{\"createTime\":\"2018-11-08 09:18:03\",\"creator\":\"admin\",\"endTime\":\"2018-11-30 00:00:00\",\"id\":22,\"pageNum\":1,\"pageSize\":10,\"shopId\":\"21\",\"shopName\":\"北京王府井店\",\"sort\":4,\"startTime\":\"2018-11-08 00:00:00\",\"status\":0,\"subjectName\":\"智慧药房\",\"updateTime\":\"2018-11-15 10:13:19\",\"updator\":\"admin\"}],\"navigateFirstPage\":1,\"navigateLastPage\":1,\"navigatePages\":8,\"navigatepageNums\":[1],\"nextPage\":0,\"pageNum\":1,\"pageSize\":10,\"pages\":1,\"prePage\":0,\"size\":4,\"startRow\":1,\"total\":4},\"message\":\"请求成功\",\"success\":true})\n\nMock.mock(/api\\/mpc\\/shopdec\\/sowingMap\\/query.?/,{\"code\":200,\"data\":{\"endRow\":4,\"firstPage\":1,\"hasNextPage\":false,\"hasPreviousPage\":false,\"isFirstPage\":true,\"isLastPage\":true,\"lastPage\":1,\"list\":[{\"createTime\":\"2018-11-02 16:08:40\",\"creator\":\"admin\",\"endTime\":\"2018-12-29 00:00:00\",\"id\":13,\"pageNum\":1,\"pageSize\":10,\"picUrl\":\"http://omni-test.oss-cn-shenzhen.aliyuncs.com/omni/others/picture/d3de5103-a0e2-4d76-a64b-7f50303c91f2.jpg\",\"shopCode\":\"10000\",\"shopId\":21,\"shopName\":\"北京王府井店\",\"showType\":0,\"sort\":1,\"startTime\":\"2018-11-02 00:00:00\",\"status\":0,\"subjectId\":19,\"subjectName\":\"首页\",\"updateTime\":\"2018-11-02 16:08:40\",\"updator\":\"admin\"},{\"createTime\":\"2018-11-02 16:07:33\",\"creator\":\"admin\",\"endTime\":\"2018-12-31 00:00:00\",\"id\":12,\"pageNum\":1,\"pageSize\":10,\"picUrl\":\"http://omni-test.oss-cn-shenzhen.aliyuncs.com/omni/others/picture/80a999c4-fd14-41d1-8453-25999564668e.jpg\",\"shopCode\":\"10000\",\"shopId\":21,\"shopName\":\"北京王府井店\",\"showType\":0,\"sort\":1,\"startTime\":\"2018-11-02 00:00:00\",\"status\":0,\"subjectId\":19,\"subjectName\":\"首页\",\"updateTime\":\"2018-11-03 18:05:16\",\"updator\":\"admin\"},{\"createTime\":\"2018-11-02 16:09:04\",\"creator\":\"admin\",\"endTime\":\"2018-12-28 00:00:00\",\"id\":14,\"pageNum\":1,\"pageSize\":10,\"picUrl\":\"http://omni-test.oss-cn-shenzhen.aliyuncs.com/omni/others/picture/741d1f71-aff7-49ae-bbc0-4b078c5096c5.jpg\",\"shopCode\":\"10000\",\"shopId\":21,\"shopName\":\"北京王府井店\",\"showType\":0,\"sort\":3,\"startTime\":\"2018-11-02 00:00:00\",\"status\":0,\"subjectId\":19,\"subjectName\":\"首页\",\"updateTime\":\"2018-11-02 16:09:04\",\"updator\":\"admin\"},{\"createTime\":\"2018-11-02 16:09:36\",\"creator\":\"admin\",\"endTime\":\"2018-12-29 00:00:00\",\"id\":15,\"pageNum\":1,\"pageSize\":10,\"picUrl\":\"http://omni-test.oss-cn-shenzhen.aliyuncs.com/omni/others/picture/98bd454c-ed7a-4eee-9da5-98a303b174bf.jpg\",\"shopCode\":\"10000\",\"shopId\":21,\"shopName\":\"北京王府井店\",\"showType\":0,\"sort\":4,\"startTime\":\"2018-11-02 00:00:00\",\"status\":0,\"subjectId\":20,\"subjectName\":\"纯粹自然\",\"updateTime\":\"2018-11-15 11:36:49\",\"updator\":\"admin\"}],\"navigateFirstPage\":1,\"navigateLastPage\":1,\"navigatePages\":8,\"navigatepageNums\":[1],\"nextPage\":0,\"pageNum\":1,\"pageSize\":10,\"pages\":1,\"prePage\":0,\"size\":4,\"startRow\":1,\"total\":4},\"message\":\"请求成功\",\"success\":true});\n\nMock.mock(contextPath+'api/demo/tempate',function(){\n    var data = {\n        list:[{\n            date: '2016-05-02',\n            name: '王小虎',\n            address: '上海市普陀区金沙江路 1518 弄'\n        }, {\n            date: '2016-05-04',\n            name: '王小虎',\n            address: '上海市普陀区金沙江路 1517 弄'\n        }, {\n            date: '2016-05-01',\n            name: '王小虎',\n            address: '上海市普陀区金沙江路 1519 弄'\n        }, {\n            date: '2016-05-03',\n            name: '王小虎',\n            address: '上海市普陀区金沙江路 1516 弄'\n        }]\n    }\n    return new MockPageResult(data);\n})\n\nMock.mock(contextPath+'api/demo/submit',function() {\n    return new MockResult();\n})\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/add.html",
    "content": "<template>\n    <div>\n        <el-tabs value=\"base\" type=\"border-card\">\n            <el-tab-pane label=\"基本信息\" name=\"base\" :style=\"tabStyle\">\n                <el-form ref=\"appData\" :model=\"appData\" label-width=\"100px\" :rules=\"rules\">\n                    <el-form-item label=\"应用名\" required prop=\"application\">\n                        <el-input v-model=\"appData.application\" style=\"width:400px;\" clearable placeholder=\"请输入应用名\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"标签\">\n                        <el-input v-model=\"appData.label\" style=\"width:400px;\" placeholder=\"默认master\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"选择环境\" required prop=\"profile\">\n                        <el-select v-model=\"appData.profile\" placeholder=\"请选择环境\" style=\"width:230px;\" clearable>\n                            <el-option label=\"开发环境\" value=\"dev\"></el-option>\n                            <el-option label=\"测试环境\" value=\"test\"></el-option>\n                            <el-option label=\"生产环境\" value=\"prod\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                    <el-form-item label=\"选择区域\" required prop=\"region\">\n                        <el-select v-model=\"appData.region\" clearable placeholder=\"请选择区域\" clearable>\n                            <el-option\n                                    v-for=\"region in regions\"\n                                    :key=\"region.value\"\n                                    :label=\"region.label\"\n                                    :value=\"region.value\">\n                            </el-option>\n                        </el-select>\n                    </el-form-item>\n                    <!--<el-form-item label=\"关联配置\">-->\n                        <!--<el-button type=\"primary\" icon=\"el-icon-setting\" size=\"small\" @click=\"relation\">选择配置项组-->\n                        <!--</el-button>-->\n                    <!--</el-form-item>-->\n                    <el-form-item label=\"应用描述\" prop=\"applicationName\" clearable>\n                        <el-input v-model=\"appData.applicationName\" style=\"width:400px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n            </el-tab-pane>\n            <div style=\"padding: 10px;\">\n                <el-button-group>\n                    <el-button ref=\"submit\" type=\"primary\" icon=\"el-icon-check\" size=\"small\" @click=\"submit('appData')\">\n                        保存\n                    </el-button>\n                    <el-button type=\"error\" icon=\"el-icon-close\" size=\"small\" @click=\"App.closeCurrentTagNav()\">取消\n                    </el-button>\n                </el-button-group>\n            </div>\n        </el-tabs>\n\n    </div>\n\n</template>\n<script type=\"text/javascript\" src=\"pages/app/add.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/add.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                appData: {\n                    id:\"\",\n                    application: '',\n                    applicationName: '',\n                    label: 'master',\n                    profile: '',\n                    region: '',\n                    regionName:''\n                },\n                update: false,\n                tabStyle: {},\n                // 区域\n                regions: [],\n                //校验规则\n                rules: {\n                    application: [\n                        {required: true, message: '请输入应用名称', trigger: 'blur'},\n                        {min: 3, max: 128, message: '长度在 3 到 128 个字符', trigger: 'blur'}\n                    ],\n                    profile: [\n                        {required: true, message: '请选择一个环境', trigger: 'change'}\n                    ],\n                    region: [\n                        {required: true, message: '请选择一个区域', trigger: 'change'}\n                    ]\n                }\n            }\n        },\n        activated() {\n            // App.success(\"接收传过来的数据为：\" + JSON.stringify(editData));\n            this.$nextTick(() => {\n                this.$set(this.tabStyle, 'height', (App.MainVueApp.pageHeight - 150) + \"px\")\n                this.$set(this.tabStyle, 'overflow', \"auto\")\n            })\n        },\n        methods: {\n            submit(formName) {\n                console.log(formName);\n                this.$refs[formName].validate((valid) => {\n                    if (valid) {\n                        App.post('/appManager/save').setData(this.appData).callSuccess((res) => {\n                            // console.log(res.success);\n                            if (res.success) {\n                                App.success('保存成功');\n                                App.closeCurrentTagNav()\n                            }\n                            else {\n                                App.error(\"添加应用错误，对应的应用、环境已经存在\");\n                            }\n                        })\n                    } else {\n                        return false;\n                    }\n                });\n\n            },\n            //关联配置项组\n            relation() {\n                // TODO\n            }\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            // console.log('模板编译挂载完成事件');\n            // 加载区域信息\n            App.request(\"/appManager/queryAllRegion\").callSuccess((res) => {\n                // 无区域可用，提示添加区域\n                if (res.data.length == 0) {\n                    //调整添加区域\n                    App.error(\"暂无区域可选择，请先添加区域!!\");\n                    //App.openModule(\"addRegion\",\"添加区域\",\"template/detail.html\");\n                } else {\n                    this.regions = res.data;\n                }\n            })\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated :function() {\n            // console.log('未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/app.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-plus\" @click=\"create\">新增</el-button>\n                    <!--<el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\" @click=\"deleteBatch\">删除</el-button>-->\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"search\"\n                               style=\"margin-left: 25px\">搜索\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n            </div>\n            <br/><br/>\n            <div>\n                <el-form :inline=\"true\" :model=\"searchForm\" ref=\"form\" style=\"width: 100%\" size=\"small\">\n                    <el-form-item label=\"应用名称\">\n                        <el-input size=\"small\" v-model=\"searchForm.application\" placeholder=\"请输入应用名称\"\n                                  style=\"width:230px;\" clearable=\"true\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"所属环境\" style=\"height: 32px;\">\n                        <el-select v-model=\"searchForm.profile\" placeholder=\"请选择环境\" style=\"width:230px;;height: 32px\"\n                                   clearable=\"true\">\n                            <el-option label=\"开发环境\" value=\"dev\" style=\"height: 32px;\"></el-option>\n                            <el-option label=\"测试环境\" value=\"test\" style=\"height: 32px;\"></el-option>\n                            <el-option label=\"生产环境\" value=\"prod\" style=\"height: 32px;\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                    <el-form-item label=\"应用描述\">\n                        <el-input size=\"small\" v-model=\"searchForm.applicationName\" placeholder=\"请输入应用描述信息\"\n                                  style=\"width:230px;\" clearable=\"true\"></el-input>\n                    </el-form-item>\n                    <!--<el-form-item>-->\n                    <!--<el-button ref=\"submit\" size=\"mini\" type=\"primary\" icon=\"el-icon-search\" @click=\"search\">搜索-->\n                    <!--</el-button>-->\n                    <!--</el-form-item>-->\n                </el-form>\n            </div>\n            <div>\n                <el-table ref=\"table\" :data=\"pager.list\" stripe @selection-change=\"selectChange\"\n                          highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\" size=\"mini\">\n                    <el-table-column type=\"index\" min-width=\"50\"></el-table-column>\n                    <el-table-column type=\"selection\" min-width=\"50\"></el-table-column>\n                    <el-table-column property=\"application\" label=\"应用名称\" min-width=\"200\"></el-table-column>\n                    <el-table-column property=\"label\" label=\"标签\" min-width=\"150\"></el-table-column>\n                    <el-table-column property=\"profile\" label=\"所属环境\" min-width=\"150\">\n                        <template slot-scope=\"scope\">\n                            <p v-if=\"scope.row.profile=='dev'\">\n                                开发环境\n                            </p>\n                            <p v-else-if=\"scope.row.profile=='test'\">\n                                测试环境\n                            </p>\n                            <p v-else-if=\"scope.row.profile=='prod'\">\n                                生产环境\n                            </p>\n                            <p v-else>\n                                其他环境\n                            </p>\n                        </template>\n                    </el-table-column>\n                    <el-table-column property=\"regionName\" label=\"所属区域\" min-width=\"150\"></el-table-column>\n                    <el-table-column property=\"createTime\" label=\"创建时间\" min-width=\"150\"></el-table-column>\n                    <el-table-column property=\"updateTime\" label=\"修改时间\" min-width=\"150\"></el-table-column>\n                    <el-table-column property=\"applicationName\" label=\"描述\" min-width=\"200\"></el-table-column>\n                    <el-table-column label=\"操作\" min-width=\"330\" fixed=\"right\">\n                        <template slot-scope=\"scope\">\n                            <el-button-group>\n                                <el-button size=\"mini\" type=\"success\" icon=\"el-icon-setting\"\n                                           @click=\"relation(scope.row)\">管理\n                                </el-button>\n                                <el-button size=\"mini\" type=\"success\" icon=\"el-icon-upload\"\n                                           @click=\"refresh(scope.row)\">发布\n                                </el-button>\n                            </el-button-group>\n                            <el-button-group>\n                                <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\"\n                                           @click=\"edit(scope.row)\">修改\n                                </el-button>\n                                <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\"\n                                           @click=\"del(scope.row)\">删除\n                                </el-button>\n                            </el-button-group>\n                        </template>\n                    </el-table-column>\n                </el-table>\n                <el-pagination background\n                               layout=\"sizes, prev, pager, next, total\"\n                               :total=\"pager.total\"></el-pagination>\n            </div>\n            <!--<el-dialog title=\"删除提示\" :visible.sync=\"deleteModal\"-->\n            <!--width=\"30%\">-->\n            <!--<h2>是否删除该记录！</h2>-->\n            <!--<span slot=\"footer\" class=\"dialog-footer\">-->\n            <!--<el-button @click=\"deleteModal = false\">取 消</el-button>-->\n            <!--<el-button ref=\"delBtn\" type=\"primary\" @click=\"confirmDelete\">确 定</el-button>-->\n            <!--</span>-->\n            <!--</el-dialog>-->\n        </el-card>\n\n    </div>\n    <br/>\n</template>\n<script type=\"text/javascript\" src=\"pages/app/app.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/app.js",
    "content": "(() => {\n    App.moule({\n        data: function () {\n            return {\n                prop: \"我是属性\",\n                tableHeight: 0,\n                deleteModal: false,\n                selectionData: [],\n                searchForm: {\n                    application: '',\n                    profile: '',\n                    applicationName: ''\n                },\n                pager: new App.Pager(),\n            }\n        },\n        methods: {\n            //选中事件\n            selectChange(v) {\n                this.selectionData = v;\n            },\n            search() {\n                //后台接口加载数据\n                this.loadData();\n            },\n            //选择删除事件\n            deleteBatch() {\n                //获取选择记录\n                if (!this.selectionData.length) {\n                    App.error('请选择记录');\n                    return;\n                }\n                // this.deleteModal = true;\n                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var _this = this;\n                    App.request(\"appManager/delete\", {\"id\": _this.selectionData[0].id})\n                        .callSuccess((res) => {\n                            if (res.data) {\n                                App.success('删除成功!');\n                                _this.loadData();\n                            } else {\n                                App.error(\"删除失败!\");\n                            }\n                        });\n                });\n            },\n            confirmDelete() {\n                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var _this = this;\n                    App.request(\"appManager/delete\", {\"id\": _this.selectionData[0].id})\n                        .callSuccess((res) => {\n                            if (res.data) {\n                                App.success('删除成功!');\n                                _this.loadData();\n                            } else {\n                                App.error(\"删除失败!\");\n                            }\n                        });\n                });\n            },\n            edit(row) {\n                //传递数据\n                App.putData(\"editData\", row);\n                App.putData(\"editType\", \"update\");\n                App.openModule(\"edit\", \"信息编辑\", \"app/detail.html\");\n            },\n            //关联数据\n            relation(row) {\n                //传递数据\n                App.putData(\"relationData\", row);\n                App.openModule(\"config\", \"配置管理\", \"app/configgroup.html\");\n            },\n            del(row) {\n                this.$set(this, 'selectionData', [row]);\n                // this.deleteModal = true;\n                this.$confirm('此操作将永久删除该应用, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var _this = this;\n                    App.request(\"appManager/delete\", {\"id\": _this.selectionData[0].id})\n                        .callSuccess((res) => {\n                            if (res.data) {\n                                App.success('删除成功!');\n                                _this.loadData();\n                            } else {\n                                App.error(\"删除失败!\");\n                            }\n                        });\n                });\n            },\n            //发布配置，动态更新\n            refresh(row) {\n                this.$confirm('确定发布配置?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var _this = this;\n                    App.request(\"appManager/refresh\", {\"id\": row.id})\n                        .callSuccess((res) => {\n                            if (res.data) {\n                                App.success('发布成功!');\n                            } else {\n                                App.error(\"发布失败,确认应用在线,有问题请联系管理员!\");\n                            }\n                        });\n                });\n            },\n            create() {\n                //传递数据-新增\n                App.openModule(\"add\", \"新增应用配置\", \"app/add.html\");\n            },\n            loadData: function () {\n                //后台接口加载数据\n                App.request('appManager/pageQuery').post().setData(this.searchForm).callSuccess((res) => {\n                    //兼容manggo 的pager和github的pager\n                    this.pager = new App.Pager(res.data);\n                })\n            },\n            /*重置查询*/\n            resetForm: function () {\n                var that = this;\n                that.searchForm = {};\n                that.tableCurrentPage = 1;\n                that.loadData();\n            },\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            // console.log('模板编译挂载完成事件');\n            //后台接口加载数据\n            this.loadData();\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            // console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            // console.log('组件被激活');\n            this.loadData();\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            // console.log('组件注销');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/configgroup.html",
    "content": "<template>\n\n    <el-tabs v-model=\"activeName\" @tab-click=\"handleClick\">\n        <el-tab-pane label=\"公共配置\" name=\"itemGroup\">\n            <div>\n                <!-- 公共配置 -->\n                <el-card class=\"box-card\">\n                    <div slot=\"header\">\n                        <el-button-group>\n                            <!-- 添加API的页面 -->\n                            <el-button size=\"mini\" type=\"success\" icon=\"el-icon-plus\" @click=\"addConfGroup\"\n                                       style=\"margin-left: 20px\">新增配置组\n                            </el-button>\n                            <!-- 添加API的页面 -->\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-search\" @click=\"findApi\"\n                                       style=\"margin-left: 20px\">搜索\n                            </el-button>\n                        </el-button-group>\n                        <br/><br/>\n                    </div>\n                    <div>\n                        <el-form :model=\"searchForm\" ref=\"searchForm\" size=\"small\" style=\"width: 100%;\" inline>\n                            <el-form-item>\n                                <el-input label=\"配置组名称\" size=\"small\" v-model=\"searchForm.groupName\" placeholder=\"配置组名称\"\n                                          style=\"width:230px;\"></el-input>\n                            </el-form-item>\n                            <el-form-item>\n                                <el-input label=\"配置组描述\" size=\"small\" v-model=\"searchForm.groupDesc\" placeholder=\"配置组描述\"\n                                          style=\"width:230px;\"></el-input>\n                            </el-form-item>\n                        </el-form>\n                    </div>\n                    <el-table size=\"mini\" ref=\"table\" :data=\"pager.list\" stripe @selection-change=\"selectChagne\"\n                              highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                        <el-table-column type=\"index\" width=\"50\"></el-table-column>\n                        <el-table-column type=\"selection\" width=\"55\"></el-table-column>\n                        <el-table-column prop=\"groupName\" label=\"配置项组名称\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"groupDesc\" label=\"配置组描述\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"createTime\" label=\"创建时间\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"updateTime\" label=\"更新时间\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column label=\"操作\" width=\"200\">\n                            <template slot-scope=\"scope\">\n                                <el-button-group>\n                                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-setting\"\n                                               @click=\"configDetail(scope.row)\">查看配置\n                                    </el-button>\n                                    <el-button size=\"mini\" type=\"danger\"\n                                               @click=\"del(scope.row)\">删除关联\n                                    </el-button>\n                                </el-button-group>\n                            </template>\n                        </el-table-column>\n                    </el-table>\n                    <el-pagination background layout=\"sizes, prev, pager, next, total\"\n                                   :total=\"pager.total\"></el-pagination>\n                </el-card>\n                <el-dialog title=\"关联的配置项\" :visible.sync=\"configModel\">\n                    <el-table size=\"mini\" ref=\"configTable\" :data=\"configPager.list\" stripe :height=\"tableHeight-65\">\n                        <el-table-column property=\"itemKey\" label=\"配置项键\" width=\"150\"></el-table-column>\n                        <el-table-column property=\"itemValue\" label=\"配置项值\" width=\"200\"></el-table-column>\n                        <el-table-column property=\"itemDesc\" label=\"描述\"></el-table-column>\n                        <el-table-column property=\"itemType\" label=\"应用类型\">\n                            <!-- 0通用，1开发环境，2测试环境，3生产环境，4其他 -->\n                            <template slot-scope=\"scope\">\n                                <p v-if=\"scope.row.itemType == 0\">\n                                    通用配置\n                                </p>\n                                <p v-if=\"scope.row.itemType == 1\">\n                                    开发配置\n                                </p>\n                                <p v-if=\"scope.row.itemType == 2\">\n                                    测试配置\n                                </p>\n                                <p v-if=\"scope.row.itemType == 3\">\n                                    生产配置\n                                </p>\n                                <p v-if=\"scope.row.itemType == 4\">\n                                    其他\n                                </p>\n                            </template>\n                        </el-table-column>\n                        <el-table-column property=\"updateTime\" label=\"更新时间\"></el-table-column>\n                        <el-table-column label=\"操作\">\n                            <template slot-scope=\"scope\">\n                                <el-button-group>\n                                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\"\n                                               @click=\"updateConfig(scope.row)\">修改\n                                    </el-button>\n                                </el-button-group>\n                            </template>\n                        </el-table-column>\n                    </el-table>\n                </el-dialog>\n            </div>\n        </el-tab-pane>\n        <el-tab-pane label=\"私有配置\" name=\"itemPrivate\">\n            <div>\n                <el-card class=\"box-card\">\n                    <div slot=\"header\">\n                        <el-button-group>\n                            <!-- 添加API的页面 -->\n                            <el-button size=\"mini\" type=\"success\" icon=\"el-icon-plus\" @click=\"addPrivateConf\"\n                                       style=\"margin-left: 20px\">新增配置\n                            </el-button>\n                            <!-- 添加API的页面 -->\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-search\" @click=\"findPrivateConf\"\n                                       style=\"margin-left: 20px\">搜索\n                            </el-button>\n                        </el-button-group>\n                        <br/><br/>\n                    </div>\n                    <div>\n                        <el-form :model=\"priSearchForm\" ref=\"priSearchForm\" size=\"small\" style=\"width: 100%;\" inline>\n                            <el-form-item>\n                                <el-input label=\"配置KEY\" size=\"small\" v-model=\"priSearchForm.itemKey\" placeholder=\"配置KEY\"\n                                          style=\"width:230px;\"></el-input>\n                            </el-form-item>\n                            <el-form-item>\n                                <el-input label=\"配置描述\" size=\"small\" v-model=\"priSearchForm.itemDesc\" placeholder=\"配置描述\"\n                                          style=\"width:230px;\"></el-input>\n                            </el-form-item>\n                        </el-form>\n                    </div>\n                    <el-table size=\"mini\" ref=\"table\" :data=\"privatePager.list\" stripe\n                              @selection-change=\"selPrivateChange\"\n                              highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                        <el-table-column type=\"index\" width=\"50\"></el-table-column>\n                        <el-table-column type=\"selection\" width=\"55\"></el-table-column>\n                        <el-table-column prop=\"itemKey\" label=\"配置项KEY\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"itemValue\" label=\"配置项值\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"itemDesc\" label=\"配置描述\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"createTime\" label=\"创建时间\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column prop=\"updateTime\" label=\"更新时间\" width=\"200\">\n                        </el-table-column>\n                        <el-table-column label=\"操作\" width=\"200\">\n                            <template slot-scope=\"scope\">\n                                <el-button-group>\n                                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-setting\"\n                                               @click=\"editPrivate(scope.row)\">修改\n                                    </el-button>\n                                    <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-setting\"\n                                               @click=\"delPrivate(scope.row)\">删除\n                                    </el-button>\n                                </el-button-group>\n                            </template>\n                        </el-table-column>\n                    </el-table>\n                    <el-pagination background layout=\"sizes, prev, pager, next, total\"\n                                   :total=\"privatePager.total\"></el-pagination>\n                </el-card>\n\n                <el-dialog title=\"新增私有配置\" :visible.sync=\"privateModel\">\n                    <el-form :rules=\"rules\" ref=\"privTabDate\" :model=\"privTabDate\" label-width=\"100px\">\n                        <el-form-item label=\"配置项键\" prop=\"itemKey\">\n                            <el-input v-model=\"privTabDate.itemKey\" style=\"width:400px;\"></el-input>\n                        </el-form-item>\n                        <el-form-item label=\"配置项值\" prop=\"itemValue\">\n                            <el-input v-model=\"privTabDate.itemValue\" style=\"width:400px;\"></el-input>\n                        </el-form-item>\n                        <el-form-item label=\"配置描述\">\n                            <el-input v-model=\"privTabDate.itemDesc\" style=\"width:400px;\"></el-input>\n                        </el-form-item>\n                    </el-form>\n                    <div slot=\"footer\" class=\"dialog-footer\">\n                        <el-button @click=\"privateModel = false\">取 消</el-button>\n                        <el-button type=\"primary\" @click=\"submitPrivate()\">确 定</el-button>\n                    </div>\n                </el-dialog>\n            </div>\n        </el-tab-pane>\n    </el-tabs>\n\n\n</template>\n<script type=\"text/javascript\" src=\"pages/app/configgroup.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/configgroup.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                configModel: false,\n                activeName: 'itemGroup',\n                //配置组中的配置项列表数据\n                configPager: new App.Pager(),\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    groupName: '',\n                    groupDesc: '',\n                    creatTime: '',\n                    updateTime: '',\n                }],\n                pager: new App.Pager(),\n                appId: '',\n                /*查询API对应的form表单*/\n                searchForm: {\n                    appId: '',\n                    groupName: '',\n                    groupDesc: ''\n                },\n\n                /***********私有配置相关************/\n                privateModel: false,\n                privateSelData: [],\n                // 私有配置列表\n                privatePager: new App.Page(),\n                //查询表单\n                priSearchForm: {\n                    applicationId: '',\n                    itemKey: '',\n                    itemDesc: ''\n                },\n                // 新增/修改参数\n                privTabDate: {\n                    id: '',\n                    applicationId: '',\n                    itemKey: '',\n                    itemValue: '',\n                    itemDesc: ''\n                },\n                rules: {\n                    itemKey: [{required: true, message: '请输入配置项键', trigger: \"blur\"}],\n                    itemValue: [{required: true, message: '请输入配置项值', trigger: \"blur\"}]\n                },\n                isUpdate: false\n            }\n        },\n        methods: {\n            /* tab事件*/\n            handleClick(tab, event) {\n                console.log(tab, event);\n            },\n            /*查询API*/\n            findApi() {\n                var that = this;\n                this.searchForm.appId = this.appId;\n                // console.log(that.searchForm);\n                //后台接口加载数据\n                App.request('appManager/queryItemGroup').post().setData(that.searchForm).callSuccess((res) => {\n                    //兼容manggo 的pager和github的pager\n                    that.pager = new App.Pager(res.data);\n                })\n            },\n            //查询该项目组下所有配置\n            configDetail(data) {\n                debugger\n                //配置项列表\n                var that = this;\n                //查询当前组下的所有配置\n                App.request('/api/config/configGroup/isRefGroup').post().setData({\n                    \"groupId\": data.id,\n                    'pageSize': 100\n                }).callSuccess((res) => {\n                    that.configPager = new App.Pager(res.data);\n                    that.configModel = true;\n                })\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            del(datas) {\n                var that = this;\n                if (\n                    !that.selectionData.length && !datas\n                ) {\n                    App.error('请选择记录');\n                    return;\n                }\n                this.$confirm('此操作将永久删除该配置组, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    // var selData = datas ? [datas] : that.selectionData;\n                    // var newData = '';\n                    // selData.forEach(function (t) {\n                    //     newData = newData + t.id + \",\";\n                    // });\n                    // var groupIds = newData.substr(0, newData.length - 1);\n                    var groupId = datas.id;\n                    App.request(\"appManager/delItemGroup\", {\n                        itemGroupId: groupId,\n                        appId: this.appId\n                    }).post().callSuccess(function (resp) {\n                        if (resp) {\n                            App.success('删除成功');\n                        } else {\n                            App.error('删除失败');\n                        }\n                        that.findApi();\n                    });\n                });\n            },\n            open(title, data) {\n                var that = this;\n                that.title = title;\n                if (data != null) {\n                    that.createForm = data;\n                    that.groupId = data.id;\n                } else {\n                    that.createForm = {};\n                }\n                that.dialogFormVisible = true;\n            },\n            addConfGroup() {\n                App.putData(\"appId\", this.appId);\n                App.openModule(\"app/refconfiggroup\", \"添加配置组\", \"app/refconfiggroup.html\")\n            },\n            //修改配置跳转\n            updateConfig(data) {\n                App.putData(\"configItem\", data);\n                App.openModule(\"#config/configitem.html\", \"配置项管理\", \"config/configitem.html\")\n            },\n\n            /*****************************私有配置列表**********************************/\n            //添加私有配置\n            addPrivateConf() {\n                this.isUpdate = false;\n                this.privateModel = true;\n            },\n            //查找私有配置\n            findPrivateConf() {\n                var url = \"appManager/queryPrivateConfig\";\n                this.priSearchForm.applicationId = this.appId;\n                var _this = this;\n                App.post(url).setData(this.priSearchForm).callSuccess((res) => {\n                    console.log(res)\n                    _this.privatePager = new App.Pager(res.data);\n                })\n            },\n            // 修改私有配置\n            editPrivate(row) {\n                var url = \"appManager/updatePrivateItem\";\n                this.privateModel = true;\n                this.privTabDate.id = row.id;\n                this.privTabDate.applicationId = row.applicationId;\n                this.privTabDate.itemDesc = row.itemDesc;\n                this.privTabDate.itemKey = row.itemKey;\n                this.privTabDate.itemValue = row.itemValue;\n                this.isUpdate = true;\n            },\n            //删除某项私有属性\n            delPrivate(row) {\n                if (row) {\n                    var url = \"appManager/delPrivateItem?id=\" + row.id;\n                    var that = this;\n                    this.$confirm('此操作将永久删除该配置项, 是否继续?', '提示', {\n                        confirmButtonText: '确定',\n                        cancelButtonText: '取消',\n                        type: 'warning'\n                    }).then(() => {\n                        App.request(url).callSuccess(function (resp) {\n                            if (resp.data) {\n                                App.success('删除成功!');\n                                that.findPrivateConf();\n                            } else {\n                                App.error(\"删除失败!\")\n                            }\n                        });\n                    });\n                }\n            },\n            selPrivateChange(v) {\n                this.privateSelData = v;\n            },\n            //提交私有配置\n            submitPrivate() {\n                var that = this;\n                this.privTabDate.applicationId = this.appId;\n                this.$refs['privTabDate'].validate((valid) => {\n                    if (valid) {\n                        debugger\n                        var url = \"appManager/addPrivateItem\";\n                        if (that.isUpdate) {\n                            url = \"appManager/updatePrivateItem\";\n                        }\n                        App.post(url).setData(that.privTabDate).callSuccess((res) => {\n                            // console.log(res)\n                            if (res.data) {\n                                if (that.isUpdate) {\n                                    App.success('更新成功')\n                                } else {\n                                    App.success('保存成功')\n                                }\n                                that.cleanPriTab();\n                                that.privateModel = false;\n                                that.findPrivateConf();\n                            } else {\n                                App.error('操作失败')\n                            }\n                            that.isUpdate = false;\n                        })\n                    } else {\n                        return false;\n                    }\n                });\n            },\n            cleanPriTab() {\n                this.privTabDate.id = '';\n                this.privTabDate.applicationId = '';\n                this.privTabDate.itemValue = '';\n                this.privTabDate.itemKey = '';\n                this.privTabDate.itemDesc = '';\n            }\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            // console.log('模板编译挂载完成事件');\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            // console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            // console.log('组件被激活');\n            var appData = App.getData(\"relationData\");\n            this.activeName = 'itemGroup';\n            this.isUpdate = false;\n            if (appData) {\n                this.appId = appData.id;\n                App.removeData(\"relationData\");\n                this.findApi();\n                this.findPrivateConf();\n            }\n            else {\n                App.closeCurrentTagNav();\n            }\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            // console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/detail.html",
    "content": "<template>\n    <div>\n        <el-tabs value=\"base\" type=\"border-card\">\n            <el-tab-pane label=\"基本信息\" name=\"base\" :style=\"tabStyle\">\n                <el-form ref=\"appData\" :model=\"appData\" label-width=\"100px\" :rules=\"rules\">\n                    <el-form-item label=\"应用名\" required prop=\"application\">\n                        <el-input v-model=\"appData.application\" style=\"width:400px;\" clearable placeholder=\"请输入应用名\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"标签\">\n                        <el-input v-model=\"appData.label\" style=\"width:400px;\" placeholder=\"默认master\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"选择环境\" required prop=\"profile\">\n                        <el-select v-model=\"appData.profile\" placeholder=\"请选择环境\" style=\"width:230px;\" clearable>\n                            <el-option label=\"开发环境\" value=\"dev\"></el-option>\n                            <el-option label=\"测试环境\" value=\"test\"></el-option>\n                            <el-option label=\"生产环境\" value=\"prod\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                    <el-form-item label=\"选择区域\" required prop=\"region\">\n                        <el-select v-model=\"appData.region\" clearable placeholder=\"请选择区域\" clearable>\n                            <el-option\n                                    v-for=\"region in regions\"\n                                    :key=\"region.value\"\n                                    :label=\"region.label\"\n                                    :value=\"region.value\">\n                            </el-option>\n                        </el-select>\n                    </el-form-item>\n                    <!--<el-form-item label=\"关联配置\">-->\n                        <!--<el-button type=\"primary\" icon=\"el-icon-setting\" size=\"small\" @click=\"relation\" :disabled=\"true\">选择配置项组-->\n                        <!--</el-button>-->\n                    <!--</el-form-item>-->\n                    <el-form-item label=\"应用描述\" prop=\"applicationName\" clearable>\n                        <el-input v-model=\"appData.applicationName\" style=\"width:400px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n            </el-tab-pane>\n            <div style=\"padding: 10px;\">\n                <el-button-group>\n                    <el-button ref=\"submit\" type=\"primary\" icon=\"el-icon-check\" size=\"small\" @click=\"submit('appData')\">\n                        保存\n                    </el-button>\n                    <el-button type=\"error\" icon=\"el-icon-close\" size=\"small\" @click=\"App.closeCurrentTagNav()\">取消\n                    </el-button>\n                </el-button-group>\n            </div>\n        </el-tabs>\n\n    </div>\n\n</template>\n<script type=\"text/javascript\" src=\"pages/app/detail.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/detail.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                appData: {\n                    id: \"\",\n                    application: '',\n                    applicationName: '',\n                    label: 'master',\n                    profile: '',\n                    region: '',\n                    regionName: ''\n                },\n                update: false,\n                tabStyle: {},\n                // 区域\n                regions: [],\n                //校验规则\n                rules: {\n                    application: [\n                        {required: true, message: '请输入应用名称', trigger: 'blur'},\n                        {min: 3, max: 128, message: '长度在 3 到 128 个字符', trigger: 'blur'}\n                    ],\n                    profile: [\n                        {required: true, message: '请选择一个环境', trigger: 'change'}\n                    ],\n                    region: [\n                        {required: true, message: '请选择一个区域', trigger: 'change'}\n                    ]\n                }\n            }\n        },\n        activated() {\n            //接收数据\n            var editData = App.getData(\"editData\");\n\n            //初始化值\n            this.appData.application = editData.application;\n            this.appData.id = editData.id;\n            this.appData.applicationName = editData.applicationName;\n            this.appData.label = editData.label;\n            this.appData.profile = editData.profile;\n            this.appData.region = editData.regionId;\n            console.log(this.appData)\n\n            // App.success(\"接收传过来的数据为：\" + JSON.stringify(editData));\n            this.$nextTick(() => {\n                this.$set(this.tabStyle, 'height', (App.MainVueApp.pageHeight - 150) + \"px\")\n                this.$set(this.tabStyle, 'overflow', \"auto\")\n            })\n        },\n        methods: {\n            submit(formName) {\n                console.log(formName);\n                debugger\n                console.log(this.appData);\n                this.$refs[formName].validate((valid) => {\n                    if (valid) {\n                        App.post('/appManager/update').setData(this.appData).callSuccess((res) => {\n                            // console.log(res.success);\n                            if (res.success) {\n                                App.success('保存成功');\n                                App.openModule(\"detail\", \"应用管理\", \"app/app.html\");\n                            }\n                            else {\n                                App.error(\"添加应用错误，对应的应用、环境已经存在\");\n                            }\n                        })\n                    } else {\n                        App.success('必填参数错误!');\n                        return false;\n                    }\n                });\n\n            },\n            //关联配置项组\n            relation() {\n                // TODO\n            }\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            // console.log('模板编译挂载完成事件');\n            // 加载区域信息\n            App.request(\"/appManager/queryAllRegion\").callSuccess((res) => {\n                // 无区域可用，提示添加区域\n                if (res.data.length == 0) {\n                    //调整添加区域\n                    App.error(\"暂无区域可选择，请先添加区域!!\");\n                    //App.openModule(\"addRegion\",\"添加区域\",\"template/detail.html\");\n                } else {\n                    debugger\n                    this.regions = res.data;\n                }\n            })\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            // console.log('未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/refconfiggroup.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-setting\" @click=\"batchRef\"\n                               style=\"margin-left: 20px\">批量关联\n                    </el-button>\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-search\" @click=\"findApi\"\n                               style=\"margin-left: 20px\">搜索\n                    </el-button>\n                </el-button-group>\n                <br/><br/>\n            </div>\n            <div>\n                <el-form :model=\"searchForm\" ref=\"searchForm\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item>\n                        <el-input size=\"small\" v-model=\"searchForm.groupName\" placeholder=\"配置组名称\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item>\n                        <el-input size=\"small\" v-model=\"searchForm.groupDesc\" placeholder=\"配置组描述\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n            </div>\n            <el-table size=\"mini\" ref=\"table\" :data=\"pager.list\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                <el-table-column type=\"index\" min-width=\"5%\"></el-table-column>\n                <el-table-column type=\"selection\" min-width=\"5%\"></el-table-column>\n                <el-table-column prop=\"groupName\" label=\"配置项组名称\" min-width=\"20%\">\n                </el-table-column>\n                <el-table-column prop=\"groupDesc\" label=\"配置组描述\" min-width=\"20%\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column label=\"操作\" min-width=\"20%\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-setting\"\n                                       @click=\"configDetail(scope.row)\">查看配置项\n                            </el-button>\n                            <el-button size=\"mini\" type=\"success\"\n                                       @click=\"ref(scope.row)\">添加关联\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination background layout=\"sizes, prev, pager, next, total\" :total=\"pager.total\"></el-pagination>\n        </el-card>\n        <el-dialog title=\"关联的配置项\" :visible.sync=\"configModel\">\n            <el-table size=\"mini\" ref=\"configTable\" :data=\"configPager.list\" stripe :height=\"tableHeight-65\">\n                <el-table-column property=\"itemKey\" label=\"配置项键\" width=\"150\"></el-table-column>\n                <el-table-column property=\"itemValue\" label=\"配置项值\" width=\"200\"></el-table-column>\n                <el-table-column property=\"itemDesc\" label=\"描述\"></el-table-column>\n                <el-table-column property=\"itemType\" label=\"应用类型\" width=\"100\">\n                    <!-- 0通用，1开发环境，2测试环境，3生产环境，4其他 -->\n                    <template slot-scope=\"scope\">\n                        <p v-if=\"scope.row.itemType == 0\">\n                            通用配置\n                        </p>\n                        <p v-if=\"scope.row.itemType == 1\">\n                            开发配置\n                        </p>\n                        <p v-if=\"scope.row.itemType == 2\">\n                            测试配置\n                        </p>\n                        <p v-if=\"scope.row.itemType == 3\">\n                            生产配置\n                        </p>\n                        <p v-if=\"scope.row.itemType == 4\">\n                            其他\n                        </p>\n                    </template>\n                </el-table-column>\n                <el-table-column property=\"updateTime\" label=\"更新时间\"></el-table-column>\n                <el-table-column label=\"操作\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\"\n                                       @click=\"updateConfig(scope.row)\">修改\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n        </el-dialog>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/app/refconfiggroup.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/app/refconfiggroup.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                configModel: false,\n                //配置组中的配置项列表数据\n                configPager: new App.Pager(),\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    groupName: '',\n                    groupDesc: '',\n                    creatTime: '',\n                    updateTime: '',\n                }],\n                pager: new App.Pager(),\n                appId: '',\n                /*查询API对应的form表单*/\n                searchForm: {\n                    appId: '',\n                    groupName: '',\n                    groupDesc: ''\n                },\n\n            }\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                debugger\n                var that = this;\n                this.searchForm.appId = this.appId;\n                //后台接口加载为关联的数据\n                App.request('appManager/notRefApp').post().setData(that.searchForm).callSuccess((res) => {\n                    //兼容manggo 的pager和github的pager\n                    that.pager = new App.Pager(res.data);\n                })\n            },\n            //查询该项目组下所有配置\n            configDetail(data) {\n                //配置项列表\n                var that = this;\n                //查询当前组下的所有配置\n                App.request('/api/config/configGroup/isRefGroup').post().setData({\n                    \"groupId\": data.id,\n                    'pageSize': 100\n                }).callSuccess((res) => {\n                    that.configPager = new App.Pager(res.data);\n                    that.configModel = true;\n                })\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            ref(datas) {\n                debugger\n                var that = this;\n                if (!that.selectionData.length && !datas) {\n                    App.error('请选择记录');\n                    return;\n                }\n                var selData = datas ? [datas] : that.selectionData;\n                var newData = '';\n                selData.forEach(function (t) {\n                    newData = newData + t.id + \",\";\n                });\n                var postData = {};\n                postData.appId = this.appId;\n                postData.groupIds = newData.substr(0, newData.length - 1);\n                console.log(postData);\n                App.request('appManager/batchSaveRef', postData).callSuccess((res) => {\n                    if (res.data) {\n                        App.success('添加成功!');\n                        App.closeCurrentTagNav();\n                        App.putData(\"appId\", this.appId);\n                    }\n                });\n            },\n            open(title, data) {\n                var that = this;\n                that.title = title;\n                if (data != null) {\n                    that.createForm = data;\n                    that.groupId = data.id;\n                } else {\n                    that.createForm = {};\n                }\n                that.dialogFormVisible = true;\n            },\n            //批量关联\n            batchRef() {\n                console.log(\"\");\n                this.ref();\n            },\n            //修改配置跳转\n            updateConfig(data) {\n                App.putData(\"configItem\", data);\n                App.openModule(\"#config/configitem.html\", \"配置项管理\", \"config/configitem.html\")\n            },\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            console.log('模板编译挂载完成事件');\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            debugger\n            console.log('组件被激活');\n            this.appId = App.getData(\"appId\");\n            App.removeData(\"appId\");\n            this.findApi();\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/client/client.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <!-- 查询按钮 -->\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n            </div>\n            <!--查找的输入框-->\n            <div>\n                <br>\n                <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item label=\"客户端IP\">\n                        <el-input size=\"small\" v-model=\"form.hostIp\" placeholder=\"请输IP地址\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"应用\">\n                        <el-input size=\"small\" v-model=\"form.application\" placeholder=\"请输应用信息\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"状态\">\n                        <el-select v-model=\"form.status\" placeholder=\"请选择状态\">\n                            <el-option label=\"在线\" :value=\"0\"></el-option>\n                            <el-option label=\"离线\" :value=\"1\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                </el-form>\n                <br>\n            </div>\n            <!-- 数据列表 -->\n            <div>\n                <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                          highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                    <el-table-column type=\"index\" label=\"序号\" min-width=\"5%\"></el-table-column>\n                    <el-table-column property=\"hostIp\" label=\"客户端IP\" min-width=\"15%\">\n                    </el-table-column>\n                    <el-table-column property=\"hostPort\" label=\"占用端口\" min-width=\"10%\">\n                    </el-table-column>\n                    <el-table-column property=\"application\" label=\"所属应用\" min-width=\"20%\">\n                    </el-table-column>\n                    <el-table-column property=\"itemType\" label=\"状态\" min-width=\"15%\" :formatter=\"statusFormatter\">\n                    </el-table-column>\n                    <el-table-column property=\"createTime\" label=\"创建时间\" min-width=\"15%\">\n                    </el-table-column>\n                    <el-table-column property=\"updateTime\" label=\"更新时间\" min-width=\"15%\">\n                    </el-table-column>\n                    <el-table-column label=\"操作\" min-width=\"20%\">\n                        <template slot-scope=\"scope\">\n                            <el-button-group>\n                                <el-button size=\"mini\" type=\"danger\" @click=\"del(scope.row)\">删除\n                                </el-button>\n                            </el-button-group>\n                        </template>\n                    </el-table-column>\n                </el-table>\n                <!-- 分页 -->\n                <el-pagination\n                        @size-change=\"handleSizeChange\"\n                        @current-change=\"handleCurrentChange\"\n                        :page-sizes=\"[5, 10, 20, 50]\"\n                        layout=\"total, sizes, prev, pager, next, jumper\"\n                        :current-page=\"tableCurrentPage\"\n                        :page-size=\"tablePageSize\"\n                        :total=\"tableTotal\">\n                </el-pagination>\n            </div>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/client/client.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/client/client.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                deleteModal: false,\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    applicationClientId: '',\n                    application: '',\n                    hostIp: '',\n                    hostPort: '',\n                    status: '',\n                    createTime: '',\n                    updateTime: '',\n                }],\n                pager: new App.Pager(),\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n                /*查询API对应的form表单*/\n                form: {\n                    hostIp: '',\n                    application: '',\n                    status: ''\n                }\n            }\n        },\n        methods: {\n            statusFormatter(v) {\n                if (v.status == 0) {\n                    return \"在线\";\n                } else if (v.status == 1) {\n                    return \"离线\";\n                }\n            },\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                App.request(\"/api/config/clientInfo/page\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    // console.log(resp.data.list);\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            deleteBatch() {\n                //获取选择记录\n                if (!this.selectionData.length) {\n                    App.error('请选择记录');\n                    return;\n                }\n                this.deleteModal = true;\n            },\n            confirmDelete() {\n                var _this = this;\n                App.post('/api/server/delect').setData(_this.selectionData)\n                    .setLoadArea(_this.$refs.deleteBtn).callSuccess(() => {\n                    App.success('删除成功！');\n                    _this.deleteModal = false\n                });\n            },\n            del(row) {\n                var that = this;\n                that.$confirm('此操作将永久删除该服务器信息, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var id = row.id;\n                    App.request(\"/api/config/clientInfo/del\", {\"id\": id})\n                        .callSuccess((res) => {\n                            if (res.data) {\n                                App.success('删除成功');\n                            } else {\n                                App.error('删除失败');\n                            }\n                            that.findApi();\n                        });\n                }).catch(() => {\n                    that.$message({\n                        type: 'info',\n                        message: '已取消删除'\n                    });\n                });\n            },\n\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            console.log('组件被激活');\n            this.findApi();\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/config/configitem.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-plus\" @click=\"open('新增配置项')\">新增</el-button>\n                    <!--<el-button size=\"mini\" type=\"danger\" icon=\"el-icon-tickets\" @click=\"del()\">删除-->\n                    <!--</el-button>-->\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n                <br/><br/>\n                <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item label=\"配置项键\">\n                        <el-input size=\"small\" v-model=\"form.itemKey\" placeholder=\"请输入配置键\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"配置描述\">\n                        <el-input size=\"small\" v-model=\"form.itemDesc\" placeholder=\"请输入描述信息\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <!--<el-form-item label=\"使用状态\">-->\n                        <!--<el-select v-model=\"form.status\" placeholder=\"请选择状态\">-->\n                            <!--<el-option label=\"启用\" :value=\"0\"></el-option>-->\n                            <!--<el-option label=\"禁用\" :value=\"1\"></el-option>-->\n                        <!--</el-select>-->\n                    <!--</el-form-item>-->\n                    <el-form-item label=\"应用类型\">\n                        <el-select v-model=\"form.itemType\" placeholder=\"请选择应用类型\">\n                            <el-option label=\"通用\" :value=\"0\"></el-option>\n                            <el-option label=\"开发环境\" :value=\"1\"></el-option>\n                            <el-option label=\"测试环境\" :value=\"2\"></el-option>\n                            <el-option label=\"生产环境\" :value=\"3\"></el-option>\n                            <el-option label=\"其他\" :value=\"4\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                </el-form>\n            </div>\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                <el-table-column type=\"index\" min-width=\"50\"></el-table-column>\n                <el-table-column type=\"selection\" min-width=\"50\"></el-table-column>\n                <el-table-column prop=\"itemKey\" label=\"配置项键\" min-width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"itemValue\" label=\"配置项值\" min-width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"itemDesc\" label=\"描述\" min-width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" min-width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" min-width=\"150\">\n                </el-table-column>\n                <!--<el-table-column prop=\"status\" label=\"状态\" min-width=\"5%\" :formatter=\"fomatterStatus\">-->\n                </el-table-column>\n                <el-table-column prop=\"itemType\" label=\"应用类型\" min-width=\"150\" :formatter=\"fomatterItemType\">\n                </el-table-column>\n                <el-table-column label=\"操作\" fixed=\"right\" min-width=\"150\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" @click=\"open('修改配置项',scope.row)\">编辑\n                            </el-button>\n                            <el-button size=\"mini\" type=\"danger\"\n                                       @click=\"del(scope.row)\">删除\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-size=\"tablePageSize\"\n                    :total=\"tableTotal\">\n            </el-pagination>\n\n            <el-dialog width=\"700px\" :title=\"title\" :visible.sync=\"dialogFormVisible\">\n                <el-form :rules=\"rules\" ref=\"createForm\" :model=\"createForm\" label-width=\"100px\">\n                    <el-form-item label=\"配置项键\" prop=\"itemKey\">\n                        <el-input v-model=\"createForm.itemKey\" style=\"width:400px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"配置项值\" prop=\"itemValue\">\n                        <el-input v-model=\"createForm.itemValue\" style=\"width:400px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"配置描述\">\n                        <el-input v-model=\"createForm.itemDesc\" style=\"width:400px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"应用类型\">\n                        <el-select v-model=\"createForm.itemType\" placeholder=\"请选择应用类型\">\n                            <el-option label=\"通用\" :value=\"0\"></el-option>\n                            <el-option label=\"开发环境\" :value=\"1\"></el-option>\n                            <el-option label=\"测试环境\" :value=\"2\"></el-option>\n                            <el-option label=\"生产环境\" :value=\"3\"></el-option>\n                            <el-option label=\"其他\" :value=\"4\"></el-option>\n                        </el-select>\n                    </el-form-item>\n                </el-form>\n                <div slot=\"footer\" class=\"dialog-footer\">\n                    <el-button @click=\"dialogFormVisible = false\">取 消</el-button>\n                    <el-button type=\"primary\" @click=\"submit('createForm')\">确 定</el-button>\n                </div>\n            </el-dialog>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/config/configitem.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/config/configitem.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    itemKey: '',\n                    itemValue: '',\n                    itemDesc: '',\n                    createTime: '',\n                    updateTime: '',\n                    status: '',\n                    itemType: '',\n                }],\n                dialogFormVisible: false,\n                pager: new App.Pager(),\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n\n                /*查询API对应的form表单*/\n                form: {\n                    itemKey: '',\n                    itemDesc: '',\n                    status: '',\n                    itemType: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                createForm: {\n                    id: '',\n                    itemKey: '',\n                    itemValue: '',\n                    itemDesc: '',\n                    itemType: '',\n                    status: 0,\n                },\n                title: '',\n                rules: {\n                    itemKey: [{required: true, message: '请输入配置项键', trigger: \"blur\"}],\n                    itemValue: [{required: true, message: '请输入配置项值', trigger: \"blur\"}]\n                },\n                itemId: '',\n            }\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                App.request(\"/api/config/configItem/page\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            fomatterStatus(v) {\n                if (v.status == 0) {\n                    return \"启用\";\n                } else if (v.status == 1) {\n                    return \"禁用\";\n                }\n            },\n            fomatterItemType(v) {\n                if (v.itemType == 0) {\n                    return \"通用\";\n                } else if (v.itemType == 1) {\n                    return \"开发环境\";\n                } else if (v.itemType == 2) {\n                    return \"测试环境\";\n                } else if (v.itemType == 3) {\n                    return \"生产环境\";\n                } else if (v.itemType == 4) {\n                    return \"其他\";\n                }\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            del(datas) {\n                var that = this;\n                if (!that.selectionData.length && !datas) {\n                    App.error('请选择记录');\n                    return;\n                }\n                this.$confirm('此操作将永久删除该配置项, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var selData = datas ? [datas] : that.selectionData;\n                    var newData = '';\n                    selData.forEach(function (t) {\n                        newData = newData + t.id + \",\";\n                    });\n                    App.request(\"/api/config/configItem/batchDelete/\" + newData.substr(0, newData.length - 1)).post().setData(newData).callSuccess(function (resp) {\n                        if (resp.data == 0) {\n                            App.success('删除成功!');\n                        } else {\n                            //App.error('部分删除成功，其中' + resp.data + \"条配置项已经关联配置组在使用中不能进行删除，必须删除组!\");\n                            App.error(\"不能删除，请先从配置组中删除该项的使用关系!\")\n                        }\n                        that.findApi();\n                    });\n                });\n            },\n            open(title, data) {\n                var that = this;\n                that.title = title;\n                if (data != null) {\n                    that.createForm = data;\n                    that.itemId = data.id;\n                } else {\n                    that.createForm = {};\n                }\n                that.dialogFormVisible = true;\n            },\n            submit(formName) {\n                var that = this;\n                this.$refs[formName].validate((valid) => {\n                    if (valid) {\n                        var url = '';\n                        if (that.itemId == '' || that.itemId == null) {\n                            url = 'api/config/configItem/save';\n                            that.createForm.status = 0;\n                            if (!that.createForm.itemType) {\n                                that.createForm.itemType = 0;\n                            }\n                        } else {\n                            url = 'api/config/configItem/update';\n                            that.createForm.id = that.itemId;\n                        }\n                        App.post(url).setData(that.createForm).callSuccess((res) => {\n                            console.log(res)\n                            if (!that.createForm.id) {\n                                if (res) {\n                                    App.success('保存成功')\n                                    that.dialogFormVisible = false;\n                                    that.findApi();\n                                } else {\n                                    App.success('保存失败')\n                                }\n                            } else {\n                                if (res) {\n                                    App.success('修改成功')\n                                    that.dialogFormVisible = false;\n                                    that.findApi();\n                                } else {\n                                    App.success('修改失败')\n                                }\n                            }\n                        })\n                    } else {\n                        return false;\n                    }\n                });\n\n            },\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            console.log('模板编译挂载完成事件');\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            console.log('组件被激活');\n            this.findApi();\n\n            var itemData = App.getData(\"configItem\");\n            if (itemData) {\n                App.removeData(\"configItem\");\n                this.open('修改配置项', itemData);\n            }\n\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/configgroup.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-plus\" @click=\"open('新增配置组')\">新增\n                    </el-button>\n                    <!--<el-button size=\"mini\" type=\"danger\" icon=\"el-icon-tickets\" @click=\"del()\">删除-->\n                    <!--</el-button>-->\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n                <br/><br/>\n                <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item label=\"配置组名称\">\n                        <el-input size=\"small\" v-model=\"form.groupName\" placeholder=\"请输入组名称\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"配置组描述\">\n                        <el-input size=\"small\" v-model=\"form.groupDesc\" placeholder=\"请输入描述信息\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <!--<el-form-item>-->\n                    <!--<el-date-picker-->\n                    <!--v-model=\"form.createTime\"-->\n                    <!--type=\"date\"-->\n                    <!--placeholder=\"创建时间\"-->\n                    <!--value-format=\"yyyy-MM-dd\">-->\n                    <!--</el-date-picker>-->\n                    <!--</el-form-item>-->\n                    <!--<el-form-item>-->\n                    <!--<el-date-picker-->\n                    <!--v-model=\"form.updateTime\"-->\n                    <!--type=\"date\"-->\n                    <!--placeholder=\"更新时间\"-->\n                    <!--value-format=\"yyyy-MM-dd\">-->\n                    <!--</el-date-picker>-->\n                    <!--</el-form-item>-->\n                </el-form>\n            </div>\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                <el-table-column type=\"index\" min-width=\"5%\"></el-table-column>\n                <el-table-column type=\"selection\" min-width=\"5%\"></el-table-column>\n                <el-table-column prop=\"groupName\" label=\"配置项组名称\" min-width=\"20%\">\n                </el-table-column>\n                <el-table-column prop=\"groupDesc\" label=\"配置组描述\" min-width=\"20%\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column label=\"操作\" fixed=\"right\" min-width=\"20%\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" @click=\"refItem(scope.row)\">查看关联项\n                            </el-button>\n                            <el-button size=\"mini\" type=\"primary\" @click=\"open('修改配置组',scope.row)\">编辑\n                            </el-button>\n                            <el-button size=\"mini\" type=\"danger\" @click=\"del(scope.row)\">删除\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-size=\"tablePageSize\"\n                    :total=\"tableTotal\">\n            </el-pagination>\n\n            <el-dialog width=\"400px\" :title=\"title\" :visible.sync=\"dialogFormVisible\">\n                <el-form :rules=\"rules\" ref=\"createForm\" :model=\"createForm\">\n                    <el-form-item label=\"配置组名称\" prop=\"groupName\">\n                        <el-input v-model=\"createForm.groupName\" placeholder=\"配置组名称\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"配置组描述\" prop=\"groupDesc\">\n                        <el-input v-model=\"createForm.groupDesc\" placeholder=\"配置组描述\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n                <div slot=\"footer\" class=\"dialog-footer\">\n                    <el-button @click=\"dialogFormVisible = false\">取 消</el-button>\n                    <el-button type=\"primary\" @click=\"create('createForm')\">确 定</el-button>\n                </div>\n            </el-dialog>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/configgroup/configgroup.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/configgroup.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    groupName: '',\n                    groupDesc: '',\n                    creatTime: '',\n                    updateTime: '',\n                }],\n                pager: new App.Pager(),\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n\n                dialogFormVisible: false,\n                /*查询API对应的form表单*/\n                form: {\n                    groupName: '',\n                    createTime: '',\n                    updateTime: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                createForm: {\n                    id: '',\n                    groupName: '',\n                    groupDesc: '',\n                },\n                title: '',\n                rules: {\n                    groupName: [{required: true, message: '请输入配置组名称', trigger: \"blur\"}],\n                    groupDesc: [{required: true, message: '请输入配置组描述', trigger: \"blur\"}]\n                },\n                groupId: '',\n            }\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                App.request(\"/api/config/configGroup/page\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            del(datas) {\n                var that = this;\n                if (\n                    !that.selectionData.length && !datas\n                ) {\n                    App.error('请选择记录');\n                    return;\n                }\n                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var selData = datas ? [datas] : that.selectionData;\n                    var newData = '';\n                    selData.forEach(function (t) {\n                        newData = newData + t.id + \",\";\n                    });\n                    App.request(\"/api/config/configGroup/delete/\" + newData.substr(0, newData.length - 1)).post().callSuccess(function (resp) {\n                        if (resp.data == 0) {\n                            App.success('全部删除成功!');\n                        } else {\n                            App.error('部分删除成功，其中' + resp.data + '条已关联应用，不能进行删除，必须先解除应用关联!');\n                        }\n                        that.findApi();\n                    });\n                });\n            },\n            create(formName) {\n                var that = this;\n                that.$refs[formName].validate((valid) => {\n                    if (valid) {\n                        var url = '';\n                        if (that.groupId == '' || that.groupId == null) {\n                            url = 'api/config/configGroup/save';\n                        } else {\n                            url = 'api/config/configGroup/update';\n                            that.createForm.id = that.groupId;\n                        }\n                        App.post(url).setData(that.createForm).callSuccess((res) => {\n                            console.log(res);\n                            if (!that.createForm.id) {\n                                if (res) {\n                                    App.success('保存成功');\n                                    that.dialogFormVisible = false;\n                                    that.findApi();\n                                } else {\n                                    App.error('保存失败');\n                                }\n                            } else {\n                                if (res) {\n                                    App.success('修改成功');\n                                    that.dialogFormVisible = false;\n                                    that.findApi();\n                                } else {\n                                    App.error('修改失败');\n                                }\n                            }\n                        })\n                    } else {\n                        return false;\n                    }\n                });\n            }\n            ,\n            open(title, data) {\n                var that = this;\n                that.title = title;\n                if (data != null) {\n                    that.createForm = data;\n                    that.groupId = data.id;\n                } else {\n                    that.createForm = {};\n                }\n                that.dialogFormVisible = true;\n            },\n            refItem(group) {\n                App.putData(\"editType\", group.id);\n                App.openModule(\"detail\", \"已关联配置项\", \"configgroup/detail.html\");\n            }\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted: function () {\n            console.log('模板编译挂载完成事件');\n        },\n        /* 组件更新完成事件 */\n        updated: function () {\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            console.log('组件被激活');\n            this.findApi();\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated: function () {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/detail.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\" @click=\"refItem\">关联配置</el-button>\n                    <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-tickets\" @click=\"del()\">删除</el-button>\n                </el-button-group>\n                <br><br>\n                <div>\n                <span style=\"float: left\">\n                <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item>\n                        <el-input size=\"small\" v-model=\"form.itemKey\" placeholder=\"配置项键\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n                </span>\n                    <span style=\"float: left\">\n                <el-button-group>\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"small\" type=\"primary\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"small\" type=\"primary\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n                </span>\n                </div>\n                <br><br>\n            </div>\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-40\">\n                <el-table-column type=\"index\" width=\"50\"></el-table-column>\n                <el-table-column type=\"selection\" width=\"55\"></el-table-column>\n                <el-table-column prop=\"itemKey\" label=\"配置项键\" width=\"180\">\n                </el-table-column>\n                <el-table-column prop=\"itemValue\" label=\"配置项值\" width=\"200\">\n                </el-table-column>\n                <el-table-column prop=\"itemDesc\" label=\"描述\" width=\"180\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"status\" label=\"状态\" width=\"50\" :formatter=\"fomatterStatus\">\n                </el-table-column>\n                <el-table-column prop=\"itemType\" label=\"应用类型\" width=\"80\" :formatter=\"fomatterItemType\">\n                </el-table-column>\n                <el-table-column label=\"操作\" fixed=\"right\" width=\"150\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"danger\"\n                                       @click=\"del(scope.row)\">删除关联\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-size=\"tablePageSize\"\n                    :total=\"tableTotal\">\n            </el-pagination>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/configgroup/detail.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/detail.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                tableData: [{\n                    id: '',\n                    itemKey: '',\n                    itemValue: '',\n                    itemDesc: '',\n                    createTime: '',\n                    updateTime: '',\n                    status: '',\n                    itemType: '',\n                }],\n                form: {\n                    groupId: '',\n                    itemKey: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                notform: {\n                    groupId: '',\n                    itemKey: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n                groupId:\n                    '',\n            }\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        activated() {\n            var that = this;\n            //接收数据\n            var editData = App.getData('editType');\n            that.groupId = editData;\n            this.findApi();\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                that.form.groupId = that.groupId;\n                App.request(\"/api/config/configGroup/isRefGroup\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            fomatterStatus(v) {\n                if (v.status == 0) {\n                    return \"启用\";\n                } else if (v.status == 1) {\n                    return \"禁用\";\n                }\n            },\n            fomatterItemType(v) {\n                if (v.itemType == 0) {\n                    return \"通用\";\n                } else if (v.itemType == 1) {\n                    return \"开发环境\";\n                } else if (v.itemType == 2) {\n                    return \"测试环境\";\n                } else if (v.itemType == 3) {\n                    return \"生产环境\";\n                } else if (v.itemType == 4) {\n                    return \"其他\";\n                }\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            del(datas) {\n                var that = this;\n                if (\n                    !that.selectionData.length && !datas\n                ) {\n                    App.error('请选择记录');\n                    return;\n                }\n                this.$confirm('此操作将删除关联关系, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var selData = datas ? [datas] : that.selectionData;\n                    var newData = '';\n                    selData.forEach(function (t) {\n                        newData = newData + t.id + \",\";\n                    });\n                    App.request(\"/api/config/configGroup/batchDelete/\" + that.groupId + \"/\" + newData.substr(0, newData.length - 1)).post().callSuccess(function (resp) {\n                        if (resp) {\n                            App.success('删除成功');\n                        } else {\n                            App.error('删除失败');\n                        }\n                        that.findApi();\n                    });\n                });\n            },\n            refItem() {\n                App.putData(\"editType\", this.groupId);\n                App.openModule(\"detail\", \"未关联配置项\", \"configgroup/refdetail.html\");\n            }\n        },\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/refdetail.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\" @click=\"refItem()\">添加关联</el-button>\n                </el-button-group>\n                <br><br>\n                <div>\n                <span style=\"float: left\">\n                <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                    <el-form-item>\n                        <el-input size=\"small\" v-model=\"form.itemKey\" placeholder=\"配置项键\"\n                                  style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                </el-form>\n                </span>\n                    <span style=\"float: left\">\n                <el-button-group>\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"small\" type=\"primary\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"small\" type=\"primary\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n                </span>\n                </div>\n                <br><br>\n            </div>\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-40\">\n                <el-table-column type=\"index\" width=\"50\"></el-table-column>\n                <el-table-column type=\"selection\" width=\"55\"></el-table-column>\n                <el-table-column prop=\"itemKey\" label=\"配置项键\" width=\"180\">\n                </el-table-column>\n                <el-table-column prop=\"itemValue\" label=\"配置项值\" width=\"200\">\n                </el-table-column>\n                <el-table-column prop=\"itemDesc\" label=\"描述\" width=\"180\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" width=\"150\">\n                </el-table-column>\n                <el-table-column prop=\"status\" label=\"状态\" width=\"50\" :formatter=\"fomatterStatus\">\n                </el-table-column>\n                <el-table-column prop=\"itemType\" label=\"应用类型\" width=\"80\" :formatter=\"fomatterItemType\">\n                </el-table-column>\n                <el-table-column label=\"操作\" fixed=\"right\" width=\"150\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\"\n                                       @click=\"refItem(scope.row)\">关联配置\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-size=\"tablePageSize\"\n                    :total=\"tableTotal\">\n            </el-pagination>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/configgroup/refdetail.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/configgroup/refdetail.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                tableHeight: 0,\n                selectionData: [],\n                tableData: [{\n                    id: '',\n                    itemKey: '',\n                    itemValue: '',\n                    itemDesc: '',\n                    createTime: '',\n                    updateTime: '',\n                    status: '',\n                    itemType: '',\n                }],\n                form: {\n                    groupId: '',\n                    itemKey: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                notform: {\n                    groupId: '',\n                    itemKey: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n                groupId:\n                    '',\n            }\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        activated() {\n            var that = this;\n            //接收数据\n            var editData = App.getData('editType');\n            that.groupId = editData;\n            this.findApi();\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                that.form.groupId = that.groupId;\n                App.request(\"/api/config/configGroup/notRefGroup\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            fomatterStatus(v) {\n                if (v.status == 0) {\n                    return \"启用\";\n                } else if (v.status == 1) {\n                    return \"禁用\";\n                }\n            },\n            fomatterItemType(v) {\n                if (v.itemType == 0) {\n                    return \"通用\";\n                } else if (v.itemType == 1) {\n                    return \"开发环境\";\n                } else if (v.itemType == 2) {\n                    return \"测试环境\";\n                } else if (v.itemType == 3) {\n                    return \"生产环境\";\n                } else if (v.itemType == 4) {\n                    return \"其他\";\n                }\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            refItem(datas) {\n                var that = this;\n                if (\n                    !that.selectionData.length && !datas\n                ) {\n                    App.error('请选择记录');\n                    return;\n                }\n                var selData = datas ? [datas] : that.selectionData;\n                var newData = '';\n                selData.forEach(function (t) {\n                    newData = newData + t.id + \",\";\n                });\n                App.request(\"/api/config/configGroup/batchSave/\" + that.groupId + \"/\" + newData.substr(0, newData.length - 1)).post().callSuccess(function (resp) {\n                    if (resp) {\n                        App.success('添加成功');\n                    } else {\n                        App.error('添加失败');\n                    }\n                    that.findApi();\n                });\n            }\n        },\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/error/401.html",
    "content": "<meta charset=\"utf-8\">\n<div>\n    Oh~~您没有浏览这个页面的权限\n</div>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/error/404.html",
    "content": "<meta charset=\"utf-8\">\n<div>\n    Oh~~您访问的页面不存在~\n</div>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/error/500.html",
    "content": "<meta charset=\"utf-8\">\n<div>\n    Oh~~系统错误，请联系管理员~\n</div>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/home/home.html",
    "content": "<template>\n    <div>\n        <h2>这是一个配置管理平台</h2>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/home/home.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/home/home.js",
    "content": "(()=>{\n\n    App.moule({\n        data :function() {\n            return {\n                prop: \"我是属性\",\n                dialogVisible: false\n            }\n        },\n        methods:{\n            onClick(){\n                 App.openModule(\"api_ut\",'API单元测试','#api_ut/api_ut.html');\n            },\n            handleClose(done) {\n                this.$confirm('确认关闭？')\n                    .then(_ => {\n                        done();\n                    })\n                    .catch(_ => {});\n            },\n            onSubmit(){\n                alert(\"aa\")\n                this.dialogVisible=false;\n            }\n        },\n        /* 组件创建完成事件  */\n        created :function(){\n            console.log('组件创建完成事件');\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted :function(){\n            console.log('模板编译挂载完成事件');\n        },\n        /* 组件更新完成事件 */\n        updated:function(){\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated :function(){\n            console.log('组件被激活');\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated :function() {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/index/compents.js",
    "content": "App.register({\n    template:'#tags-nav',\n    data :function() {\n        return {\n            tagBodyLeft: 0,\n            rightOffset: 45,\n            outerPadding: 4,\n            light:2\n        }\n    },\n    name: 'TagsNav',\n    props: ['list','value'],\n    methods: {\n        handleMouseScroll :function(e) {\n            let type = e.type;\n            let delta = 0;\n            if (type === 'DOMMouseScroll' || type === 'mousewheel') {\n                delta = (e.wheelDelta) ? e.wheelDelta : -(e.detail || 0) * 40\n            }\n            this.handleScroll(delta)\n        },\n        handleScroll :function(offset) {\n            const outerWidth = this.$refs.scrollOuter.offsetWidth\n            const bodyWidth = this.$refs.scrollBody.offsetWidth\n            if (offset > 0) {\n                this.tagBodyLeft = Math.min(0, this.tagBodyLeft + offset)\n            } else {\n                if (outerWidth < bodyWidth) {\n                    if (this.tagBodyLeft < -(bodyWidth - outerWidth)) {\n                        this.tagBodyLeft = this.tagBodyLeft\n                    } else {\n                        this.tagBodyLeft = Math.max(this.tagBodyLeft + offset, outerWidth - bodyWidth)\n                    }\n                } else {\n                    this.tagBodyLeft = 0\n                }\n            }\n        },\n        handleClose :function(e,menuId) {\n            console.log(menuId)\n            this.$emit('on-close', 'single',menuId);\n        },\n        handleClick :function(item,e) {\n            if ( e.target.tagName ==  'I'){\n                this.handleClose(e,item.menuId);\n            }else{\n                this.value = item.menuId\n                this.$emit('input', item)\n            }\n        },\n        handleTagsOption :function(type){\n            this.$emit('on-close', type);\n        },\n        moveToHome:function(){\n            this.tagBodyLeft = 0;\n        },\n        moveToView :function(tag) {\n\n            let outerWidth = $(this.$refs.scrollOuter).outerWidth();\n            let bodyWidth = $(this.$refs.scrollBody).outerWidth();\n            var tagPos = $(tag).position();\n            var tagleft = $(tag).position().left + $(tag).outerWidth() + 10;\n            var visableLeft = tagleft + this.tagBodyLeft;\n            var marginLeft = outerWidth-tagleft;\n            if ( tagleft < outerWidth ){\n                this.tagBodyLeft = 0;\n                return;\n            }\n            //判断是否在可视范围内\n            if ( visableLeft < outerWidth && visableLeft > 0 ){\n                //不移动\n            }else{\n                if ( marginLeft < 0 ){\n                    this.tagBodyLeft = marginLeft;\n                }else{\n                    this.tagBodyLeft = 0;\n                }\n            }\n        }\n    }\n});\n\nVue.component('ue',{\n    template:'<div style=\"width:100%;\"><script :id=\"\\'UEDITOR_\\'+eid\" type=\"text/plain\" style=\"width:1024px;height:400px;\" ></script>  </div>',\n    data () {\n        return {\n            editor: null\n        }\n    },\n    props: {\n        eid:{\n            type: String,\n        },\n        content: {\n            type: String,\n            default:\"\"\n        },\n        config: {\n            type: Object,\n            default: {\n                initialFrameWidth:1000,\n                initialFrameHeight:500\n            }\n        }\n    },\n    mounted() {\n        const _this = this;\n        this.editor = UE.getEditor('UEDITOR_'+this.eid, this.config); // 初始化UE\n        this.editor.addListener(\"ready\", function () {\n            _this.editor.setContent(_this.content); // 确保UE加载完成后，放入内容。\n        });\n    },\n    methods: {\n        getUEContent() { // 获取内容方法\n            return this.editor.getContent()\n        }\n    },\n    destroyed() {\n        this.editor.destroy();\n    }\n})\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/index/index.css",
    "content": "html,body{\n    height:100%;margin: 0px;\n}\n#app {\n    width: 100%;\n    height: 100%;\n    font:12px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif\n}\n.main{\n    height: 100vh;\n    min-width: 800px;\n    min-height: 600px;\n    overflow: hidden;\n}\n.main section{\n    height: 100%;\n}\n.main aside{\n    overflow: visible;\n    height: 100%;\n}\n.el-menu{\n    height: 100%;\n    border-right: none;\n}\n.el-main{\n    padding:10px;\n}\n/*********** tags-nav begin ***********/\n.tag-nav-wrapper {\n    padding: 0;\n    height: 40px;\n    overflow: hidden;\n    background: #b8babe14;\n}\n.tags-nav {\n    position: relative;\n    /*border-top: 1px solid #F0F0F0;*/\n    /*border-bottom: 1px solid #F0F0F0;*/\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    width: 100%;\n    height: 100%;\n}\n.tags-nav .ivu-tag{\n    height: 40px;\n    line-height: 40px;\n    margin: 0px;\n    padding: 0 8px;\n    border-radius: 0px;\n}\n.tags-nav .close-con {\n    position: absolute;\n    right: 0;\n    top: 0;\n    height: 100%;\n    width: 50px;\n    background: #fff;\n    text-align: center;\n    z-index: 10;\n}\n.tags-nav .btn-con.left-btn {\n    left: 0px;\n}\n.tags-nav .btn-con {\n    position: absolute;\n    top: 0px;\n    height: 100%;\n    background: #fff;\n    padding-top: 3px;\n    z-index: 10;\n}\n.tags-nav .btn-con button {\n    padding: 6px 4px;\n    line-height: 14px;\n    text-align: center;\n}\n.tags-nav .btn-con.right-btn {\n    right: 32px;\n    border-right: 1px solid #F0F0F0;\n}\n.tags-nav .btn-con {\n    position: absolute;\n    top: 0px;\n    height: 100%;\n    background: #fff;\n    padding-top: 3px;\n    z-index: 10;\n}\n.tags-nav .scroll-outer {\n    position: absolute;\n    left: 0px;\n    right: 0px;\n    top: 0;\n    bottom: 0;\n    border-bottom: solid 1px #e6e6e6;\n}\n.tags-nav .scroll-outer .scroll-body {\n    height: calc(100% - 1px);\n    display: inline-block;\n    padding: 1px 4px 0;\n    position: absolute;\n    overflow: visible;\n    white-space: nowrap;\n    -webkit-transition: left .3s ease;\n    transition: left .3s ease;\n}\n.main .content-wrapper {\n    height: calc(100% - 80px);\n    overflow: auto;\n}\nbody .ivu-select-selection>div{\n    display: flex;\n    width: 100%;\n    overflow: hidden;\n}\n.ivu-transfer-list-header-count{\n    visibility: hidden;\n}\n/*********** tags-nav end ***********/\n\n/* main begin*/\n.left-sider{\n    background: #141821;\n}\n.left-sider .ivu-layout-sider-trigger{\n    background: #141821;\n}\n.main .logo-con {\n    height: 64px;\n    padding: 10px;\n}\n.main .left-sider .ivu-layout-sider-children\n{\n    overflow-y: scroll;\n    margin-right: -20px;\n    height:92%;\n}\n/* main end*/\n.loading-spin-container{\n    display: inline-block;\n    position: fixed;\n    border: 1px solid #eee;\n    z-index: 1000;\n}\n\n.side-menu-wrapper {\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n.side-menu-wrapper .menu-collapsed {\n    padding-top: 10px;\n}\n.side-menu-wrapper .menu-collapsed .ivu-dropdown {\n    width: 100%;\n}\n.side-menu-wrapper .menu-collapsed .ivu-dropdown .ivu-dropdown-rel a {\n    width: 100%;\n}\n.side-menu-wrapper .menu-collapsed .ivu-tooltip {\n    width: 100%;\n}\n.side-menu-wrapper .menu-collapsed .ivu-tooltip .ivu-tooltip-rel {\n    width: 100%;\n}\n.side-menu-wrapper .menu-collapsed .ivu-tooltip .ivu-tooltip-popper .ivu-tooltip-content .ivu-tooltip-arrow {\n    border-right-color: #fff;\n}\n.side-menu-wrapper .menu-collapsed .ivu-tooltip .ivu-tooltip-popper .ivu-tooltip-content .ivu-tooltip-inner {\n    background: #fff;\n    color: #495060;\n}\n.side-menu-wrapper a.drop-menu-a {\n    display: inline-block;\n    padding: 10px 15px;\n    width: 100%;\n    text-align: center;\n    color: #495060;\n}\n.menu-title {\n    padding-left:6px;\n}\n.sub-drop-menu-a{\n    color: #515a6e;\n}\n.layout-con{\n    height: 100%;\n    width: 100%;\n}\n.menu-item span{\n    display: inline-block;\n    overflow: hidden;\n    width: 110px;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    vertical-align: bottom;\n    transition: width .2s ease .2s;\n}\n.menu-item i{\n    transform: translateX(0px);\n    transition: font-size .2s ease, transform .2s ease;\n    vertical-align: middle;\n    font-size: 16px;\n}\n.collapsed-menu span{\n    width: 0px;\n    transition: width .2s ease;\n}\n.collapsed-menu i{\n    transform: translateX(5px);\n    transition: font-size .2s ease .2s, transform .2s ease .2s;\n    vertical-align: middle;\n    font-size: 22px;\n}\n/*消失时间持续3s\n.fade-enter-active{\n  transition: all 0s;\n}*/\n\n/*显示时间持续1.5s\n.fade-leave-active{\n   transition: all 0.5s;\n}*/\n\n/* 主题 */\n.ivu-menu-dark {\n    background: #141821;\n}\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item{\n    display: flex;\n}\n.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu {\n    color: rgba(255,255,255,.7)\n}\n.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu:hover {\n    color: #fff\n}\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-group-title {\n    color: rgba(255,255,255,.36)\n}\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title {\n    color: rgba(255,255,255,.7)\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu):hover {\n    background: #141821\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title:hover {\n    color: #fff;\n    background: #141821\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu) {\n    /*color: #2d8cf0*/\n    border-right: none;\n    color: #fff;\n    background: #2d8cf0!important;\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item:hover {\n    color: #fff;\n    background: 0 0!important\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active:hover {\n    border-right: none;\n    color: #fff;\n    background: #2d8cf0!important\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-child-item-active>.ivu-menu-submenu-title {\n    color: #fff\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened {\n    background: #001529\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-title {\n    background: #001529\n}\n\n.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-has-parent-submenu .ivu-menu-submenu-title {\n    background: 0 0\n}\n\n.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item-active, .ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item:hover, .ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu-active, .ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu:hover {\n    color: #2d8cf0!important;\n}\n\n.menu-title{\n    font-size:12px!important;\n}\n.ivu-form-item {\n    margin-bottom: 15px;\n    tical-align: top;\n    zoom: 1;\n}\n.common-upload-list{\n    display: inline-block;\n    width: 60px;\n    height: 60px;\n    text-align: center;\n    line-height: 60px;\n    border: 1px solid transparent;\n    border-radius: 4px;\n    overflow: hidden;\n    background: #fff;\n    position: relative;\n    box-shadow: 0 1px 1px rgba(0,0,0,.2);\n    margin-right: 4px;\n}\n.common-upload-list img{\n    width: 100%;\n    height: 100%;\n}\n.common-upload-list-cover{\n    display: none;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    background: rgba(0,0,0,.6);\n}\n.common-upload-list:hover .common-upload-list-cover{\n    display: block;\n}\n.common-upload-list-cover i{\n    color: #fff;\n    font-size: 20px;\n    cursor: pointer;\n    margin: 0 2px;\n}\n/* 自定义布局组件样式 */\n.channel-card{\n    background: #ededee;\n    padding: 10px 0px 0px 10px;\n}\n.channel-card .ivu-card-head{\n    border:none;\n    padding:10px 10px;\n    padding-bottom:0px;\n}\n.channel-card .ivu-divider-horizontal{\n    margin:15px 0px;\n}\n.channel-divider{\n    height: 1px;\n}\n.channel-card .ivu-form-item{\n    margin-bottom: 15px;\n}\n.query-form .ivu-form-item{\n    margin-bottom: 10px!important;\n}\n.channel-card .ivu-card-body{\n    padding:10px;\n    padding-bottom:5px;\n}\n.channel-card .ivu-table td, .ivu-table th{\n    height:40px;\n}\n.channel-card .zhankai-icon{\n    transform:rotate(90deg);\n    -ms-transform:rotate(90deg); \t/* IE 9 */\n    -moz-transform:rotate(90deg); \t/* Firefox */\n    -webkit-transform:rotate(90deg); /* Safari 和 Chrome */\n    -o-transform:rotate(90deg); \t/* Opera */\n}\n.channel-card .ivu-page{\n    padding-top:10px;\n    text-align: right;\n}\n.ivu-modal-body form .ivu-form-item{\n    margin-bottom:20px;\n}\n.ivu-tooltip-inner{\n    word-break: break-all;\n}\n.nav-tag-body{\n    display: flex;\n}\n.nav-tag{\n    height: 30px;\n    padding:0px 10px;\n    min-width: 150px;\n    max-width:250px;\n}\n.nav-tag-body .nav-tag:first-child{\n    border-left: 10px solid #444450!important;\n}\n.nav-tag-body .nav-tag:nth-child(even){\n    border-left: 10px solid #141821;\n    border-right: 10px solid #141821;\n    border-bottom: 30px solid #444450;\n}\n.nav-tag-body .nav-tag:nth-child(odd){\n    /*border-left: 10px solid rgb(245, 247, 249);*/\n    /*border-right: 10px solid #444450;*/\n    /*border-bottom: 30px solid rgb(245, 247, 249);*/\n    border-left: 10px solid #141821;\n    border-right: 10px solid #141821;\n    border-bottom: 30px solid #444450;\n}\n\n.nav-tag-start{\n    width: 16px;\n    height: 30px;\n}\n.nav-tag-start>div:first-child{\n    height: 15px;\n    border-left: 8px solid #2c2b36;\n    border-right: 8px solid #545c64;\n    border-top: 15px solid #2c2b36;\n}\n.nav-tag-start>div:last-child{\n    height: 15px;\n    border-left: 8px solid #2c2b36;\n    border-right: 8px solid #545c64;\n    border-bottom: 15px solid #545c64;\n}\n\n.nav-tag-light-s{\n    width: 16px;\n    height: 30px;\n}\n.nav-tag-light-s>div:first-child{\n    height: 15px;\n    border-left: 8px solid #2c2b36;\n    border-right: 8px solid #ededee;\n    border-top: 15px solid #2c2b36;\n}\n.nav-tag-light-s>div:last-child{\n    height: 15px;\n    border-left: 8px solid #2c2b36;\n    border-right: 8px solid #ededee;\n    border-bottom: 15px solid #ededee;\n}\n\n.nav-tag-light-e{\n    width: 15px;\n    height: 30px;\n}\n.nav-tag-light-e>div:first-child{\n    height: 15px;\n    border-left: 8px solid #ededee;\n    border-right: 8px solid #2c2b36;\n    border-top: 15px solid #2c2b36;\n}\n.nav-tag-light-e>div:last-child{\n    height: 15px;\n    border-left: 8px solid #ededee;\n    border-right: 8px solid #2c2b36;\n    border-bottom: 15px solid #ededee;\n}\n\n.nav-tag-light-r{\n    width: 15px;\n    height: 30px;\n}\n.nav-tag-light-r>div:first-child{\n    height: 15px;\n    border-left: 8px solid #ededee;\n    border-right: 8px solid rgb(68, 68, 80);\n    border-top: 15px solid #2c2b36;\n}\n.nav-tag-light-r>div:last-child{\n    height: 15px;\n    border-left: 8px solid #ededee;\n    border-right: 8px solid rgb(68, 68, 80);\n    border-bottom: 15px solid #ededee;\n}\n\n.nav-tag-light-l{\n    width: 16px;\n    height: 30px;\n}\n.nav-tag-light-l>div:first-child{\n    height: 15px;\n    border-left: 8px solid rgb(68, 68, 80);\n    border-right: 8px solid #ededee;\n    border-top: 15px solid #2c2b36;\n}\n\n.nav-tag-light-l>div:last-child{\n    height: 15px;\n    border-left: 8px solid rgb(68, 68, 80);\n    border-right: 8px solid #ededee;\n    border-bottom: 15px solid #ededee;\n}\n\n.nav-tag-span{\n    width: 16px;\n    height: 30px;\n}\n.nav-tag-span>div:first-child{\n    height: 15px;border-left: 8px solid #545c64;\n    border-right: 8px solid #545c64;border-top: 15px solid #2c2b36;\n}\n.nav-tag-span>div:last-child{\n    height: 15px;border-left: 10px solid #545c64;\n    border-right: 10px solid #545c64;border-bottom: 15px solid #545c64;\n}\n.nav-tag-end{\n    width: 16px;\n    height: 30px;\n}\n.nav-tag-end>div:first-child{\n    height: 15px;border-left: 8px solid #545c64;\n    border-right: 8px solid #2c2b36;border-top: 15px solid #2c2b36;\n}\n.nav-tag-end>div:last-child{\n    height: 15px;border-left: 8px solid #545c64;\n    border-right: 8px solid #2c2b36;border-bottom: 15px solid #545c64;\n}\n\n.nav-light{\n    background: #ededee;\n    padding: 0px 10px;\n    min-width: 100px;\n    position: relative;\n    color: rgb(113, 114, 116);\n}\n.nav-normal{\n    padding: 0px 10px;\n    min-width: 100px;\n    cursor: pointer;\n    position: relative;\n    background: #545c64;\n    min-width: 100px;\n    color:rgb(198, 202, 209);\n}\n.nav-light,.nav-normal span{\n    height: 30px;line-height: 30px;\n}\n.el-form-item__content .edui-default{\n    line-height:normal;\n}\n.close-menu{\n    position: absolute;\n    color: white;\n    bottom: 0px;\n    cursor: pointer;\n    left: 50%;\n    margin-left:-8px;\n}\n.main-aside{\n    position: relative;\n    background: #383e4b;\n    transition:width 0.5s;\n}\n.main-aside>div{\n    position: relative;\n}\n/*el-main .el-tag--info{*/\n    /*color:#a1a1a1!important;*/\n/*}*/\n/*el-main .el-tag{*/\n    /*color: rgb(255, 208, 75);*/\n/*}*/"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/index/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n    <meta name=\"viewport\" content=\"maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0\"/>\n    <title>用户中心</title>\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\"/>\n    <link rel=\"bookmark\" href=\"/favicon.ico\"/>\n    <script type=\"text/javascript\" src=\"plugin/babel/polyfill.min.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/common/env.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/jquery/3.3.1/jquery.min.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/common/common.js\" ></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/element/styles/index.css\" />\n    <script type=\"text/javascript\" src=\"plugin/iview/js/vue.min.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/element/js/index.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/jquery/jquery.history.js\" ></script>\n    <script type=\"text/javascript\" src=\"plugin/mock/mock-min.js\"></script>\n    <script type=\"text/javascript\" src=\"mock/mock.js\"></script>\n    <script type=\"text/javascript\" src=\"mock/index.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"pages/index/index.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/element/styles/fonts/iconfont.css\" />\n    <!-- UE -->\n    <!--<script type=\"text/javascript\" src=\"plugin/ueditor/UE/ueditor.config.js\" ></script>-->\n    <!--<script type=\"text/javascript\" src=\"plugin/ueditor/UE/ueditor.all.js\" ></script>-->\n    <!--<script type=\"text/javascript\" src=\"plugin/ueditor/UE/lang/zh-cn/zh-cn.js\" ></script>-->\n    <!--<script type=\"text/javascript\" src=\"plugin/ueditor/UE/ueditor.parse.min.js\" ></script>-->\n\n    <!-- NED -->\n    <!--<script type=\"text/javascript\" charset=\"utf-8\" src=\"plugin/neditor/neditor.config.js\"></script>-->\n    <!--<script type=\"text/javascript\" charset=\"utf-8\" src=\"plugin/neditor/neditor.all.js\"> </script>-->\n    <!--<script type=\"text/javascript\" charset=\"utf-8\" src=\"plugin/neditor/neditor.service.js\"></script>-->\n    <!--&lt;!&ndash;建议手动加在语言，避免在ie下有时因为加载语言失败导致编辑器加载失败&ndash;&gt;-->\n    <!--&lt;!&ndash;这里加载的语言文件会覆盖你在配置项目里添加的语言类型，比如你在配置项目里配置的是英文，这里加载的中文，那最后就是中文&ndash;&gt;-->\n    <!--<script type=\"text/javascript\" charset=\"utf-8\" src=\"plugin/neditor/i18n/zh-cn/zh-cn.js\"></script>-->\n    <!-- NED -->\n\n</head>\n\n<body >\n    <div id=\"app\" class=\"main\" >\n        <el-container >\n            <el-aside :width=\"menuWidth+'px'\" class=\"main-aside\" >\n                <el-scrollbar :wrap-style=\"wrapStyle\" view-class=\"view-box\" :native=\"false\" >\n                    <el-menu :default-active=\"activeName\" :default-openeds=\"openedNames\" @select=\"menuSelect\"\n                             background-color=\"#383e4b\" :collapse-transition=\"false\"\n                             text-color=\"#fff\" ref=\"elMenu\"\n                             active-text-color=\"#ffd04b\" :collapse=\"collapsed\" >\n                        <template v-for=\"item in menuList\" >\n                            <el-submenu :index=\"item.menuId\" v-if=\"item.children && item.children.length\" >\n                                <template slot=\"title\">\n                                    <i v-if=\"item.iconCls\" :class=\"item.iconCls\"></i>\n                                    <span slot=\"title\" v-text=\"item.name\" ></span>\n                                </template>\n                                <el-menu-item :index=\"sub.menuId\" v-for=\"sub in item.children\">\n                                    <i v-if=\"sub.iconCls\" :class=\"sub.iconCls\"></i>\n                                    <span slot=\"title\" :title=\"sub.name\" v-text=\"sub.name\" ></span>\n                                </el-menu-item>\n                            </el-submenu>\n                            <el-menu-item v-else :index=\"item.menuId\" >\n                                <i v-if=\"item.iconCls\" :class=\"item.iconCls\"></i>\n                                <span slot=\"title\" :title=\"item.name\" v-text=\"item.name\" ></span>\n                            </el-menu-item>\n                        </template>\n                    </el-menu>\n                </el-scrollbar>\n                <div class=\"close-menu\" @click=\"closeMenu\" >\n                   <div>\n                       <i class=\"el-icon-d-arrow-left\" v-if=\"!collapsed\" ></i>\n                       <i class=\"el-icon-d-arrow-right\" v-if=\"collapsed\" ></i>\n                   </div>\n                </div>\n            </el-aside>\n            <el-main style=\"padding:0px;margin:0px;\">\n                <el-container>\n                    <el-header style=\"padding:0px;height: 40px;width: 100%\">\n                        <div class=\"tag-nav-wrapper\" >\n                            <tags-nav ref=\"tagsNav\" :value=\"activeName\"  :list=\"tagNavList\" @close=\"closeNav\" @click=\"handTags\" />\n                        </div>\n                    </el-header>\n                    <el-scrollbar :wrap-style=\"'height:'+(pageHeight-40)+'px;'\"  view-class=\"view-box\" :native=\"false\" >\n                        <el-main>\n                            <transition name=\"fade\" mode=\"out-in\" appear>\n                                <keep-alive :include=\"cacheList\" >\n                                    <component ref=\"moduleComp\" :is=\"componentId\"  ></component>\n                                </keep-alive>\n                            </transition>\n                        </el-main>\n                    </el-scrollbar>\n                </el-container>\n            </el-main>\n        </el-container>\n    </div>\n\n    <!-- 组件注册装置 -->\n    <div id=\"componentRegister\" style=\"display: none;\" ></div>\n\n    <script type=\"text/x-template\" id=\"tags-nav\">\n        <div class=\"tags-nav\">\n            <div class=\"scroll-outer\" ref=\"scrollOuter\" @DOMMouseScroll=\"handleMouseScroll\" @mousewheel=\"handleMouseScroll\">\n                <div ref=\"scrollBody\" class=\"scroll-body\" :style=\"{left: tagBodyLeft + 'px',padding:'0px'}\">\n                    <div class=\"nav-tag-body\" >\n                        <el-tag style=\"margin:3px 1px;cursor: pointer;\"\n                                v-for=\"item in list\"\n                                :key=\"item.name\"\n                                :closable=\"item.menuId != '#1'\"\n                                :name=\"item.menuId \"\n                                @click.native=\"$emit('click',item)\" @close=\"$emit('close',item)\"\n                                :type=\"value == item.menuId ? '':'info' \" >\n                            <i v-if=\"item.iconCls\" :class=\"item.iconCls\"></i>\n                            {{item.name}}\n                        </el-tag>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <!-- 页面脚本 -->\n    <script type=\"text/javascript\" src=\"pages/index/compents.js\"></script>\n    <script type=\"text/javascript\" src=\"pages/index/index.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/index/index.js",
    "content": "/**\n * 系统架构\n * @author zhdong\n * @date 2018/8/26\n */\n/*********全局混入*********/\nVue.mixin({\n    created(){\n        this.$getPath = function(url){\n            return App.getPath(url);\n        }\n    }\n});\n\nApp.start({\n    el: '#app',\n    data: function() {\n        return {\n            activeName:'',\n            cacheList:[],\n            homeData:{\"id\":\"#1\",\"menuId\":\"#1\",\"name\":\"首页\",\"url\":\"#home/home.html\",\"iconCls\":\"iconfont icon-home\",\"componentId\":\"admin-home\"},\n            tagNavList:[{\"id\":\"#1\",\"menuId\":\"#1\",\"name\":\"首页\",\"url\":\"#home/home.html\",\"iconCls\":\"iconfont icon-home\",\"componentId\":\"admin-home\"}],\n            menuList:[],\n            componentId:'',\n            mappingObject:{},\n            openedNames:[],\n            pageHeight:0,\n            wrapStyle:{},\n            collapsed:true,\n            menuWidth:200,\n        }\n    },\n    created(){\n        this.pageHeight = $(document).height()\n        this.wrapStyle = \"height:\"+this.pageHeight+\"px;\";//\"height:\"+this.pageHeight+\"px;\";\n        //加载本地缓存\n        var collapsed = window.localStorage.getItem(\"collapsed\");\n        this.collapsed = eval(collapsed);\n        //显示\n        if ( !this.collapsed ){\n            this.menuWidth = 200;\n        }else{\n            this.menuWidth = 55;\n        }\n    },\n    mounted(){\n        var that = this;\n        this.$nextTick(()=>{\n            App.request('api/user/menuList').callSuccess((res)=>{\n                this.menuList = res.data;\n\n                this.menuList.forEach((item)=>{\n                    if ( item.children && item.children.length ){\n                        item.children.forEach((sub)=>{\n                            this.mappingObject[sub.menuId] = sub.url;\n                        })\n                    }else{\n                        this.mappingObject[item.menuId] = item.url;\n                    }\n                })\n                $.history.init(function(hash){\n                    that.initHash(hash);\n                });\n            });\n        })\n\n    },\n    methods:{\n        closeMenu(){\n            this.collapsed = !this.collapsed\n            //显示\n            if ( !this.collapsed ){\n                this.menuWidth = 200;\n            }else{\n                this.menuWidth = 65;\n            }\n            window.localStorage.setItem(\"collapsed\",this.collapsed)\n        },\n        initHash (hash) {\n\n            var that = this;\n            var currentHash = that.mappingObject[that.activeName];\n            currentHash = currentHash ? currentHash.substring(1) : \"\";\n            if (hash != \"\" && hash == currentHash){\n                return;\n            }\n\n            var findMenuId;\n            //默认首页\n            if ( !hash || \"#\"+hash == that.homeData.url ){\n                hash = that.homeData.url.substring(1);\n                findMenuId = that.homeData.menuId;\n            }else{\n                $.each(that.mappingObject,function(r){\n                    if (this == \"#\"+hash ){\n                        findMenuId = r;\n                    }\n                })\n                //从tabnav里面找\n                $.each(that.tagNavList,function(){\n                    if (this.url == \"#\"+hash ){\n                        findMenuId = this.menuId;\n                    }\n                });\n            }\n            //如果找到菜单，没找到菜单打开临时页面\n            if ( findMenuId ){\n                that.activeName = findMenuId;\n            }else{\n                //that.loadModule(hash,new NavObject(\"#2\",hash));\n                that.activeName =\"#1\"\n            }\n        },\n//添加页面子模块导航\n        addSubPageTag :function(tabNav){\n            var exists = false;\n            var that = this;\n            var menuIndex = -1;\n            $.each(this.tagNavList,function(idx){\n                if ( this.menuId == tabNav.menuId ){\n                    exists = this;\n                    //跳出循环\n                    return false;\n                }\n                //当前菜单的下标\n                if ( that.activeName == this.menuId){\n                    menuIndex = idx;\n                }\n            })\n            //插入到当前菜单tag的后面\n            if ( !exists ){\n                var arySize = this.tagNavList.length;\n                //如果是最后的位置，直接追加\n                if ( menuIndex == arySize - 1){\n                    this.tagNavList.push(tabNav);\n                }else{\n                    let startList = this.tagNavList.slice(0,menuIndex+1);\n                    let endList = this.tagNavList.slice(menuIndex+1,arySize);\n                    let newAry = startList.concat(tabNav).concat(endList);\n                    this.tagNavList = newAry;\n                }\n                this.activeName = tabNav.menuId;\n            }else{\n                var componentId = this.convertToComp(exists.url.substring(1));;\n                if ( componentId ){\n                    this.$delete(this.cacheList,this.cacheList.indexOf(componentId))\n                }\n                exists.name = tabNav.name;\n                this.$nextTick(()=>{\n                    this.activeName = tabNav.menuId;\n                })\n            }\n        },\n        //加载模块页面\n        loadModule :function(url_,menuObj){\n            var that = this;\n            var cmpId = this.convertToComp(url_);\n\n            //判断组件是否存在\n            if ( cmpId ){\n                var comp = Vue.component(cmpId);\n                if ( comp ){\n                    //不存在则缓存\n                    if ( this.cacheList.indexOf(cmpId) == -1 ){\n                        this.cacheList.push(cmpId);\n                    }\n                    that.$nextTick(function(){\n                        that.componentId = comp;\n                    })\n                    return;\n                }\n            }\n            //加载前清掉组件\n            that.componentId = '';\n            App.request({\n                dataType:\"text\",\n                url:pageContextPath + url_,\n                success:function(res){\n                    var tmp = $('<div></div>').html(res).appendTo('#componentRegister');\n                    var template = $('template:eq(0)', tmp);\n                    if (template[0]) {\n                        App.currentMoule.template = template.html();\n                        Vue.component(cmpId, App.currentMoule);\n                        that.cacheList.push(cmpId)//组件缓存\n                        menuObj.componentId = cmpId;\n                        that.$nextTick(function(){\n                            that.componentId = cmpId;\n                            //5s后移除减轻页面压力\n                            setTimeout(function(){\n                                template.remove();\n                            },5000)\n                        })\n                    }\n                }\n            }).hideLoad();\n        },\n        convertToComp(url){\n\n            if ( !url ) return \"\";\n\n            if ( url.indexOf('?') != -1 ){\n               url = url.substring(0,url.indexOf('?'));\n            }\n            url = url.substring(0,url.indexOf('.'));\n            url = url.replace(/\\//,'-')\n            return url;\n        },\n        //添加页面导航\n        addPageTag :function(menuId,url_){\n            if ( typeof menuId !== 'string' ){\n                return [];\n            }\n\n            var exists = false;\n            var menuObj;\n            //优先从临时导航中查找\n            $.each(this.tagNavList,function(){\n                if ( this.menuId == menuId ){\n                    exists = true;\n                    menuObj = this;\n                    //跳出循环\n                    return false;\n                }\n            })\n            menuObj = menuObj || this.findMenuByMenuId(menuId)\n\n            //设置标题\n            document.title = menuObj.name == '首页' ? '配置中心管理系统':menuObj.name;\n\n            if ( !exists ){\n                this.tagNavList.push(menuObj);\n            }\n            this.loadModule(url_,menuObj);\n        },\n        //根据菜单id找到菜单\n        findMenuByMenuId :function(menuId){\n            var that = this;\n\n            if ( typeof menuId !== 'string' ){\n                return [];\n            }\n            if ( menuId == this.homeData.menuId){\n                return this.homeData;\n            }\n            var findData;\n            $.each(this.menuList,function(){\n                var item = this;\n                if ( item.menuId == menuId ){\n                    findData = item;\n                    return false;\n                }\n                //检查子项是否存在\n                if ( item.children && item.children.length ){\n                    $.each(item.children,function(){\n                        var sub = this;\n                        if ( sub.menuId == menuId ){\n                            findData = sub;\n                            return false;\n                        }\n                    })\n                    //跳出外部循环\n                    if ( findData ){\n                        return false;\n                    }\n                }\n            })\n\n            return findData;\n        },\n        closeCurrentTagNav :function(item){\n            if ( !this.activeName || this.activeName == this.homeData.menuId ){\n                return;\n            }\n\n            this.closeNav({menuId:this.activeName});\n        },\n        closeNav(item){\n            var that = this;\n            var menuId = item.menuId;\n            var find = -1;\n            $.each(this.tagNavList,function(i_){\n                if ( this.menuId == menuId){\n                    find = i_;\n                    return false;\n                }\n            })\n\n            if ( find != -1){\n                let isCur = that.tagNavList[find].menuId == that.activeName;\n                Vue.delete(that.tagNavList,find);\n                //如果关闭的是当前菜单，则选定下一个菜单\n                if ( isCur ){\n                    //激活下一个页签，前一个找不到，就找下一个，再找不到就找首页\n                    var menu = that.tagNavList[find-1] || that.tagNavList[find] || that.tagNavList[0];\n                    if ( menu ){\n                        that.activeName = menu.menuId;\n                    }\n                }\n                //根据menuId找到url\n                var url = this.mappingObject[menuId];\n                //获取组件，清除组件缓存\n                var componentId = url && this.convertToComp(url.substring(1));\n                if ( componentId ){\n                    this.$delete(this.cacheList,this.cacheList.indexOf(componentId))\n                }\n            }\n\n        },\n        handTags(item){\n            this.activeName = item.menuId;\n        },\n        menuSelect(n){\n            this.activeName = n;\n        }\n    },\n    watch:{\n        openedNames(v){\n            console.log(v)\n            var reallyActiveName = this.activeName.split('@')[0];\n            var menuIdArray = reallyActiveName.split(\"-\");\n            var openNames = [];\n            var conect = [];\n            $.each(menuIdArray,function(){\n                conect.push(this);\n                openNames.push(conect.join('-'));\n            });\n        },\n        //监听菜单选择\n        activeName :function(name) {\n\n            //选中系统\n            var that = this;\n            var reallyActiveName = name.split('@')[0];\n            var menuIdArray = reallyActiveName.split(\"-\");\n\n            var openNames = [];\n            var conect = [];\n            $.each(menuIdArray,function(){\n                conect.push(this);\n                openNames.push(conect.join('-'));\n            });\n            this.openedNames = openNames;\n\n            var url_ = this.mappingObject[name];\n\n            //菜单中没有就到导航里面找\n            if ( !url_ ){\n                //从tabnav里面找\n                $.each(that.tagNavList,function(){\n                    if (this.menuId == name ){\n                        url_ = this.url;\n                    }\n                });\n            }\n\n            if ( url_ ){\n                if ( url_.indexOf('#') == 0 ){\n                    window.location.hash=url_;\n                    this.addPageTag(name,url_.substring(1));\n                }\n                else{\n                    window.open(url_);\n                }\n            }\n\n        }\n    }\n})"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/login/login.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n    <meta name=\"viewport\"\n          content=\"maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0\"/>\n    <title>配置中心</title>\n    <link rel=\"shortcut icon\" href=\"favicon.ico\"/>\n    <link rel=\"bookmark\" href=\"favicon.ico\"/>\n    <!--<link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/iview/styles/iview.css\" />-->\n    <!--<link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/element/styles/index.css\" />-->\n    <!--<script type=\"text/javascript\" src=\"plugin/iview/js/iview.min.js\" ></script>-->\n\n    <script type=\"text/javascript\" src=\"plugin/babel/polyfill.min.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/common/env.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/jquery/3.3.1/jquery.min.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/common/common.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/element/styles/index.css\"/>\n    <script type=\"text/javascript\" src=\"plugin/iview/js/vue.min.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/element/js/index.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/jquery/jquery.history.js\"></script>\n    <script type=\"text/javascript\" src=\"plugin/mock/mock-min.js\"></script>\n    <script type=\"text/javascript\" src=\"mock/mock.js\"></script>\n    <script type=\"text/javascript\" src=\"mock/index.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"pages/index/index.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"plugin/element/styles/fonts/iconfont.css\"/>\n\n    <style>\n        html, body {\n            width: 100%;\n            height: 100%;\n            font-size: 12px;\n            line-height: 1.42857143;\n            color: #333;\n            margin: 0px;\n            padding: 0px;\n        }\n\n        #app {\n            width: 100%;\n            height: 100%;\n            background: rgba(19, 194, 194, 0.66);\n            margin: 0px;\n            padding: 0px;\n        }\n\n        .login-wrap {\n            position: fixed;\n            width: 1078px;\n            height: 600px;\n            margin-top: -300px;\n            margin-left: -539px;\n            top: 50%;\n            left: 50%;\n            background-image: url(\"images/login-back.png\");\n            background-repeat: no-repeat;\n            background-size: 100% 100%;\n            display: flex;\n        }\n\n        .login-left {\n            width: 70%;\n            height: 100%;\n            position: relative;\n        }\n\n        .login-title-en {\n            font-size: 30px;\n            color: #FFFFFF;\n            position: absolute;\n            top: 50px;\n            left: 40px;\n        }\n\n        .login-title {\n            font-size: 20px;\n            color: #FFFFFF;\n            position: absolute;\n            top: 100px;\n            left: 40px;\n        }\n\n        .login-log {\n            position: absolute;\n            bottom: 40px;\n            right: 30px;\n        }\n\n        .login-log > div {\n            position: relative;\n            display: inline-block;\n            padding: 15px;\n        }\n\n        .login-log > div > div {\n            position: absolute;\n            border-right: 1px solid #fff;\n            right: 0px;\n            top: 20%;\n            height: 60%;\n        }\n\n        .login-main {\n            width: 30%;\n            height: 96.8%;\n            background: #FFFFFF;\n            margin-top: 0.68%;\n            text-align: center;\n        }\n\n        .login-welcom {\n            font-size: 16px;\n            font-weight: 600;\n            margin-top: 50%;\n            margin-bottom: 30px;\n        }\n\n        .login-input {\n            padding: 0px 40px;\n            line-height: 40px;\n            height: 40px;\n        }\n\n        .login-input > div {\n            position: relative;\n            margin-top: 10px;\n        }\n\n        .login-input input {\n            padding-left: 40px;\n            font-size: 14px;\n            width: 220px;\n            border: none;\n            outline: none;\n            color: rgba(0, 0, 0, 0.5);\n            border-bottom: 1px solid rgba(0, 0, 0, 0.20);\n        }\n\n        .login-input input:focus {\n            border-bottom: 1px solid #13C2C2;\n        }\n\n        .login-input input:focus + i {\n            color: #13C2C2;\n        }\n\n        .login-input i {\n            left: 20px;\n            font-size: 24px;\n            color: #888888;\n            position: absolute;\n        }\n\n        .login-btn {\n            width: 280px;\n            height: 67px;\n            line-height: 57px;\n            background: url('images/login-btn.png');\n            cursor: pointer;\n        }\n\n        .login-btn > span {\n            font-size: 14px;\n            color: #FFFFFF;\n            letter-spacing: 8px;\n            text-align: center;\n        }\n\n        @media screen and (min-width: 960px) and (max-width: 1400px) {\n            .login-wrap {\n                width: 900px;\n                height: 500px;\n                margin-top: -250px;\n                margin-left: -450px;\n            }\n\n            .login-input-user > input, .login-input-pwd > input {\n                width: 170px;\n            }\n\n            .login-btn {\n                width: 220px;\n            }\n        }\n    </style>\n</head>\n\n<body>\n<div id=\"app\" v-loading=\"loading\">\n    <div class=\"login-wrap\">\n        <div class=\"login-left\">\n            <div class=\"login-title-en\">Config Manager Center</div>\n            <div class=\"login-title\"> 配置管理中心</div>\n            <!--<div class=\"login-log\" >-->\n            <!--<div>-->\n            <!--<img src=\"images/winner@1x.png\" />-->\n            <!--<div></div>-->\n            <!--</div>-->\n            <!--<div>-->\n            <!--<img src=\"images/purcotton@1x.png\" />-->\n            <!--<div></div>-->\n            <!--</div>-->\n            <!--<div>-->\n            <!--<img src=\"images/logo-h2b@1x.png\" />-->\n            <!--</div>-->\n            <!--</div>-->\n        </div>\n        <div class=\"login-main\">\n            <div class=\"login-welcom\">欢迎登录</div>\n            <div class=\"login-input\">\n                <div class=\"login-input-user\">\n                    <input v-model=\"formInline.user\" type=\"text\" placeholder=\"用户名\" @keydown.enter=\"handleSubmit\"\n                           autofocus/>\n                    <i class=\"iconfont icon-yonghuming\"></i>\n                </div>\n            </div>\n            <div class=\"login-input\">\n                <div class=\"login-input-pwd\">\n                    <input v-model=\"formInline.password\" type=\"password\" placeholder=\"密码\"\n                           @keydown.enter=\"handleSubmit\"/>\n                    <i class=\"iconfont icon-mima\"></i>\n                </div>\n            </div>\n            <div style=\"text-align:-webkit-center;margin-top:40px;\">\n                <div class=\"login-btn\" @click=\"handleSubmit\">\n                    <span>登录</span>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script>\n    'use strict';\n\n    App.start({\n        el: '#app',\n        data: {\n            loading: false,\n            formInline: {\n                user: '',\n                password: ''\n            },\n            ruleInline: {\n                user: [{required: true, message: '用户名不能为空', trigger: 'blur'}],\n                password: [{required: true, message: '请输入密码', trigger: 'blur'}, {\n                    type: 'string',\n                    min: 6,\n                    message: '密码不能少于6位',\n                    trigger: 'blur'\n                }]\n            }\n        },\n        methods: {\n            handleSubmit: function handleSubmit() {\n                var _this = this;\n\n                var loginName = _this.formInline.user;\n                var password = _this.formInline.password;\n                var success;\n                if (App.isEmpty(loginName)) {\n                    App.error('请输入用户名');\n                    return;\n                }\n                if (App.isEmpty(password)) {\n                    App.error('请输入密码');\n                    return;\n                }\n\n                var that = _this;\n                $.ajax({\n                    url: \"/user/auth/login\",\n                    type: \"post\",\n                    data: {loginName: loginName, password: password},\n                    beforeSend: function beforeSend() {\n                        that.loading = true;\n                    },\n                    success: function success(data, flag, xhr) {\n                        if (data.success) {\n                            var url = window.location.href;\n                            var find = url.indexOf('refUrl=');\n                            //先清理缓存\n                            window.localStorage && window.localStorage.clear();\n                            var loginToken = xhr.getResponseHeader('M-Auth-Token')\n                            // 保存token\n                            window.localStorage.setItem('M-Auth-Token', loginToken);\n\n                            //成功跳转页面\n                            if (find != -1) {\n                                var newUrl = url.substring(find + 7);\n                                window.location.href = newUrl;\n                            } else {\n                                window.location.href = '/';\n                            }\n\n                        } else {\n                            that.loading = false;\n                            data.message && that.$Message.error(data.message);\n                        }\n                    },\n                    error: function error(xhr) {\n                        that.loading = false;\n                        if (xhr.status == 401) {\n                            that.$Message.error('您没有浏览这个页面的权限');\n                        }\n                        if (xhr.status == 404) {\n                            that.$Message.error('您访问的页面不存在');\n                        } else if (xhr.status == 500) {\n                            var dataJson = xhr.responseJSON || JSON.parse(xhr.responseText);\n                            if (dataJson.message) {\n                                that.$Message.error(dataJson.message);\n                            } else {\n                                that.$Message.error('页面内部错误，请联系管理员');\n                            }\n                        } else if (xhr.status == 405) {\n                            that.$Message.error('请求方法错误');\n                        }\n                    }\n                });\n\n            }\n        }\n    });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/region/region.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-plus\" @click=\"addRegion = true\">新增</el-button>\n                    <!--<el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\" @click=\"deleteRow()\">删除</el-button>-->\n                    <!-- 添加API的页面 -->\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                </el-button-group>\n                <el-dialog\n                        title=\"添加区域\"\n                        :visible.sync=\"addRegion\"\n                        close-on-click-modal=\"false\"\n                        modal=\"true\"\n                        width=\"30%\"\n                        :before-close=\"addRegionClose\">\n\n                    <el-form ref=\"addRegionForm\" :model=\"addRegionForm\" size=\"small\" :rules=\"regionRules\">\n                        <el-form-item label=\"区域名称\" prop=\"regionName\">\n                            <el-input v-model=\"addRegionForm.regionName\" placeholder=\"区域名称\" style=\"width:360px;\"\n                                      clearable=\"true\"></el-input>\n                        </el-form-item>\n                        <el-form-item label=\"区域描述\" prop=\"regionDesc\">\n                            <el-input v-model=\"addRegionForm.regionDesc\" placeholder=\"区域描述\" style=\"width:360px;\"\n                                      clearable=\"true\"></el-input>\n                        </el-form-item>\n                    </el-form>\n\n                    <span slot=\"footer\" class=\"dialog-footer\">\n                        <el-button @click=\"addRegionClose\" size=\"mini\">取 消</el-button>\n                        <el-button type=\"primary\" @click=\"addRegionFrom\" size=\"small\">确 定</el-button>\n                    </span>\n                </el-dialog>\n\n                <!--查找的输入框-->\n                <br/><br/>\n                <el-form inline :model=\"form\" ref=\"form\" size=\"small\">\n                    <el-form-item label=\"区域名称\">\n                        <el-input v-model=\"form.regionName\" placeholder=\"区域名称\" style=\"width:230px;\"></el-input>\n                    </el-form-item>\n                    <!--<el-form-item label=\"开始时间\">-->\n                        <!--<el-date-picker v-model=\"form.createTime\" type=\"date\" placeholder=\"开始时间\"-->\n                                        <!--style=\"width:230px;\" value-format=\"yyyy-MM-dd\"></el-date-picker>-->\n                    <!--</el-form-item>-->\n                    <!--<el-form-item label=\"结束时间\">-->\n                        <!--<el-date-picker v-model=\"form.updateTime\" type=\"date\" placeholder=\"结束时间\"-->\n                                        <!--style=\"width:230px;\" value-format=\"yyyy-MM-dd\"></el-date-picker>-->\n                    <!--</el-form-item>-->\n                    <!--<el-from-item>-->\n                        <!--<el-button type=\"primary\" @click=\"onSubmit\" style=\"margin-left: 20px\" icon=\"el-icon-search\"-->\n                                   <!--size=\"mini\">查 询-->\n                        <!--</el-button>-->\n                    <!--</el-from-item>-->\n                </el-form>\n            </div>\n            <!-- 数据列表 -->\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" highlight-current-row style=\"width: 100%\"\n                      :height=\"tableHeight-65\" size=\"mini\" @selection-change=\"selectChagne\">\n                <el-table-column type=\"selection\" min-width=\"10%\"></el-table-column>\n                <el-table-column prop=\"id\" label=\"序号\" min-width=\"10%\">\n                </el-table-column>\n                <el-table-column prop=\"regionName\" label=\"区域名称\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column prop=\"regionDesc\" label=\"区域描述\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column prop=\"createTime\" label=\"创建时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column prop=\"updateTime\" label=\"更新时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column fixed=\"right\" label=\"操作\" min-width=\"20%\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\" @click=\"handleClick(scope.row)\">编辑\n                            </el-button>\n                            <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\"\n                                       @click.native.prevent=\"deleteRow(scope.row)\">删除\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <!-- 分页栏 -->\n            <!--<el-col :span=\"24\" align=\"right\">-->\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    :page-size=\"tablePageSize\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :total=\"tableTotal\"\n            ></el-pagination>\n            <!--</el-col>-->\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/region/region.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/region/region.js",
    "content": "(() => {\n\n    App.moule({\n        data: function () {\n            return {\n                /*添加区域的弹出框*/\n                addRegion: false,\n                tableHeight: 0,\n                /*复选框*/\n                selectionData: [],\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    regionName: '',\n                    regionDesc: '',\n                    createTime: '',\n                    updateTime: '',\n                }],\n\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n\n                /*查询API对应的form表单*/\n                form: {\n                    regionName: '',\n                    createTime: '',\n                    updateTime: '',\n                },\n\n                /*添加区域的from*/\n                addRegionForm: {\n                    regionName: '',\n                    regionDesc: '',\n                },\n\n                /*添加表单输入项的校验*/\n                regionRules: {\n                    regionName: [\n                        {required: true, message: '请输入区域名称', trigger: 'blur'}\n                    ],\n                    regionDesc: [\n                        {required: true, message: '请输入区域描述', trigger: 'blur'}\n                    ],\n                }\n            }\n        },\n        methods: {\n            /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                App.request(\"/region/queryRegion\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                })\n            },\n\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                this.findApi();\n            },\n\n            /* 添加区域 打开窗口*/\n            addRegionFrom() {\n                var that = this;\n                if (that.addRegionForm.regionName != null && that.addRegionForm.regionName != \"\" && that.addRegionForm.regionDesc != null && that.addRegionForm.regionDesc != \"\") {\n                    App.request(\"/region/addRegion\").post().setData(that.addRegionForm).callSuccess(function (resp) {\n                        if (resp.data) {\n                            that.$message({\n                                type: 'success',\n                                message: '成功!'\n                            });\n                        } else {\n                            that.$message({\n                                type: 'error',\n                                message: '失败!'\n                            });\n                        }\n                        ;\n                        that.addRegionClose();\n                    });\n                } else {\n                    that.$message({\n                        showClose: true,\n                        message: '区域名称或者区域描述不能为空！',\n                        type: 'error'\n                    });\n                }\n            },\n\n            // 关闭添加region的dialog\n            addRegionClose() {\n                this.addRegion = false;\n                this.addRegionForm = {\n                    regionName: '',\n                    regionDesc: '',\n                }\n                this.$refs[\"addRegionForm\"].resetFields();\n                this.findApi();\n            },\n\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n\n            selectChagne(v) {\n                this.selectionData = v;\n            },\n            /*删除API*/\n            deleteRow(row) {\n                var that = this;\n                if (\n                    !that.selectionData.length && !row\n                ) {\n                    App.error('请选择记录');\n                    return;\n                }\n                that.$confirm('此操作将永久删除该区域信息, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                    var selData = row ? [row] : that.selectionData;\n                    var newData = '';\n                    selData.forEach(function (t) {\n                        newData = newData + t.id + \",\";\n                    });\n                    App.request(\"/region/delectRegion/\" + newData.substr(0, newData.length - 1)).post().callSuccess(function (resp) {\n                        if (resp.data > 0) {\n                            that.$message({\n                                type: 'success',\n                                message: '删除成功!'\n                            });\n                            that.findApi();\n                        } else if (resp.data == -1) {\n                            App.error(\"已关联应用不能删除，必须先删除应用!\")\n                        }\n                        else {\n                            that.$message({\n                                type: 'error',\n                                message: '删除失败!'\n                            });\n                        }\n                        that.findApi();\n                    });\n                }).catch(() => {\n                    that.$message({\n                        type: 'info',\n                        message: '已取消删除'\n                    });\n                });\n            },\n\n            /*更新区域*/\n            handleClick: function (row) {\n                this.addRegion = true;\n                this.addRegionForm = row;\n            },\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated: function () {\n            this.findApi();\n        },\n        /* 组件创建完成事件  */\n        created: function () {\n            this.$nextTick(() => {\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n    });\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/server/server.js",
    "content": "(()=>{\n\n    App.moule({\n        data :function() {\n            return {\n            \t/*添加区域的弹出框*/\n                addServer: false,\n            \ttableHeight:0,\n            \tdeleteModal:false,\n                /*数据表格里的数据*/\n                tableData: [{\n                    id: '',\n                    serverHost: '',\n                    serverDesc: '',\n                    regionName: '',\n                    createTime: '',\n                    updateTime: '',\n                }],\n                pager:new App.Pager(),\n                /*分页栏的 当前页*/\n                tableCurrentPage: 1,\n                /*分页栏的 每页行数*/\n                tablePageSize: 10,\n                /*分页栏的总条数*/\n                tableTotal: 0,\n                addServerform:{\n                \tid: '',\n                    serverHost: '',\n                    serverDesc: '',\n                    regionId: '',\n                    regionName:''\n                },\n             // 区域\n                regions: [],\n                /*查询API对应的form表单*/\n                form: {\n                \tserverHost: '',\n                \tserverDesc: '',\n                    createTime: '',\n                    updateTime: '',\n                    pageNum: '',\n                    pageSize: '',\n                },\n                rules: {\n                \tserverHost: [{required: true, message: '请输入服务器IP', trigger: \"blur\"}],\n                \tserverDesc:[{required: true, message: '请输入服务器描述', trigger: \"blur\"}],\n                \tregionId: [{required: true, message: '请选择一个区域', trigger: 'change'}\n                    ]\n                },\n                itemId: '',\n                title: '',\n            }\n        },\n        methods:{\n        \t /*查询API*/\n            findApi() {\n                var that = this;\n                that.form.pageNum = that.tableCurrentPage;\n                that.form.pageSize = that.tablePageSize;\n                App.request(\"/api/serverHostConfig/page\").post().setData(that.form).callSuccess(function (resp) {\n                    that.tableData = resp.data.list;\n                    that.tableTotal = resp.data.total;\n                });\n            },\n            /*查询API 提交的函数*/\n            onSubmit() {\n                this.tableCurrentPage = 1;\n                this.findApi();\n            },\n            /*重置查询*/\n            resetForm() {\n                var that = this;\n                this.form = {};\n                that.tableCurrentPage = 1;\n                that.findApi();\n            },\n            /*分页栏对应的函数*/\n            handleSizeChange(val) {\n                this.tablePageSize = val;\n                //console.log(`每页 ${val} 条`);\n                this.findApi();\n            },\n            handleCurrentChange(val) {\n                this.tableCurrentPage = val;\n                // console.log(`当前页: ${val}`);\n                this.findApi();\n            },\n            selectChagne(v){\n                this.selectionData = v;\n            },\n            deleteBatch(){\n                //获取选择记录\n                if ( !this.selectionData.length ){\n                    App.error('请选择记录');\n                    return;\n                }\n                this.deleteModal=true;\n            },\n            confirmDelete(){\n                var _this = this;\n                App.post('/api/server/delect').setData(_this.selectionData)\n                    .setLoadArea(_this.$refs.deleteBtn).callSuccess( ()=> {\n                    App.success('删除成功！');\n                    _this.deleteModal = false\n                });\n            },\n            del(row) {\n                var that = this;\n                that.$confirm('此操作将永久删除该服务器信息, 是否继续?', '提示', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(() => {\n                \tvar id=row.id;\n                    App.request(\"/api/serverHostConfig/delectServerHostConfig/\" + id).post().callSuccess(function (resp) {\n                    \tdebugger;\n                    \tif (resp.data == 1) {\n                            App.success('删除成功');\n                        }else{\n                        \tApp.error('删除失败');\n                        }\n                        that.findApi();\n                    });\n                }).catch(() => {\n                    that.$message({\n                        type: 'info',\n                        message: '已取消删除'\n                    });\n                });\n            },\n            open(title, data) {\n                var that = this;\n                that.title = title;\n                if (data != null) {\n                    that.addServerform = data;\n                    that.itemId = data.id;\n                } else {\n                    that.addServerform = {};\n                }\n                that.addServer = true;\n            },\n            submit(formName) {\n                       var that = this;\n                        var url = '';\n                        if (that.itemId == '' || that.itemId == null) {\n                            url = '/api/serverHostConfig/addServerHostConfig';\n                            \n                        } else {\n                            url = '/api/serverHostConfig/updateServerHostConfig';\n                            that.addServerform.id = that.itemId;\n                        }\n                        if(that.addServerform.serverDesc != null && that.addServerform.serverDesc != \"\" && that.addServerform.serverHost != null && that.addServerform.serverHost != \"\" && that.addServerform.regionId != null && that.addServerform.regionId != \"\"){\n                        App.post(url).setData(this.addServerform).callSuccess((res) => {\n                            console.log(res)\n                            if (!that.addServerform.id) {\n                                if (res) {\n                                    App.success('保存成功')\n                                    that.addServer = false;\n                                    that.findApi();\n                                } else {\n                                    App.success('保存失败')\n                                }\n                            } else {\n                                if (res) {\n                                    App.success('修改成功')\n                                    that.addServer = false;\n                                    that.itemId ='';\n                                    that.findApi();\n                                } else {\n                                    App.success('修改失败')\n                                }\n                            }\n                        })}\n                        else{\n                            that.$message({\n                                showClose: true,\n                                message: '服务器ip或者区域或者描述不能为空！',\n                                type: 'error'\n                            });\n                        }\n\n            },\n        },\n        /* 组件创建完成事件  */\n        created :function(){\n            this.$nextTick(()=>{\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted :function(){\n        \t App.request(\"/appManager/queryAllRegion\").callSuccess((res) => {\n                 // 无区域可用，提示添加区域\n                 if (res.data.length == 0) {\n                     //调整添加区域\n                     App.error(\"暂无区域可选择，请先添加区域!!\");\n                     //App.openModule(\"addRegion\",\"添加区域\",\"template/detail.html\");\n                 } else {\n                     this.regions = res.data;\n                 }\n             })\n        },\n        /* 组件更新完成事件 */\n        updated:function(){\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated :function(){\n            console.log('组件被激活');\n            this.findApi();\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated :function() {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/server/serverlist.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\">\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-plus\" @click=\"open('新增服务器配置')\">新增</el-button>\n                    <el-button size=\"mini\" type=\"success\" icon=\"el-icon-search\" @click=\"onSubmit\"\n                               style=\"margin-left: 20px\">查询\n                    </el-button>\n                    <el-button size=\"mini\" type=\"info\" icon=\"el-icon-refresh\" @click=\"resetForm('form')\">重置\n                    </el-button>\n                    <!-- 添加API的页面 -->\n                    <!--<el-button size=\"small\" type=\"primary\" @click=\"onSubmit\" style=\"margin-left: 20px\">查询-->\n                    <!--</el-button>-->\n                    <!--<el-button size=\"small\" type=\"primary\" @click=\"resetForm('form')\" style=\"margin-left: 20px\">重置-->\n                    <!--</el-button>-->\n                </el-button-group>\n                <el-row>\n                    <el-dialog\n                            title=\"添加服务器\"\n                            :visible.sync=addServer\n                            close-on-click-modal=\"false\"\n                            modal=\"true\"\n                            width=\"30%\"\n                            center=\"true\">\n\n                        <el-form :rules=\"rules\" ref=\"addServerform\" :model=\"addServerform\" label-width=\"100px\">\n                            <el-form-item label=\"服务器IP\" prop=\"serverHost\">\n                                <el-input v-model=\"addServerform.serverHost\" style=\"width:280px;\"></el-input>\n                            </el-form-item>\n                            <el-form-item label=\"服务器描述\" prop=\"serverDesc\">\n                                <el-input v-model=\"addServerform.serverDesc\" style=\"width:280px;\"></el-input>\n                            </el-form-item>\n                            <el-form-item label=\"选择区域\" required prop=\"regionId\">\n                                <el-select v-model=\"addServerform.regionId\" placeholder=\"请选择区域\">\n                                    <el-option\n                                            v-for=\"regionId in regions\"\n                                            :key=\"regionId.value\"\n                                            :label=\"regionId.label\"\n                                            :value=\"regionId.value\">\n                                    </el-option>\n                                </el-select>\n                            </el-form-item>\n                        </el-form>\n\n                        <span slot=\"footer\" class=\"dialog-footer\">\n                            <el-button @click=\"addServer = false\" size=\"small\">取 消</el-button>\n                            <el-button type=\"primary\" @click=\"submit('addServerform')\" size=\"small\">确 定</el-button>\n                        </span>\n                    </el-dialog>\n                </el-row>\n                <br/>\n            </div>\n            <el-form :model=\"form\" ref=\"form\" size=\"small\" style=\"width: 100%;\" inline>\n                <el-form-item label=\"服务IP\">\n                    <el-input size=\"small\" v-model=\"form.serverHost\" placeholder=\"请输入服务器IP地址\"\n                              style=\"width:230px;\"></el-input>\n                </el-form-item>\n                <el-form-item label=\"服务描述信息\">\n                    <el-input size=\"small\" v-model=\"form.serverDesc\" placeholder=\"请输入描述信息\"\n                              style=\"width:230px;\"></el-input>\n                </el-form-item>\n                <!--<el-form-item>-->\n                <!--<el-date-picker-->\n                <!--v-model=\"form.createTime\"-->\n                <!--type=\"date\"-->\n                <!--placeholder=\"开始时间\"-->\n                <!--value-format=\"yyyy-MM-dd\">-->\n                <!--</el-date-picker>-->\n                <!--</el-form-item>-->\n                <!--<el-form-item>-->\n                <!--<el-date-picker-->\n                <!--v-model=\"form.updateTime\"-->\n                <!--type=\"date\"-->\n                <!--placeholder=\"结束时间\"-->\n                <!--value-format=\"yyyy-MM-dd\">-->\n                <!--</el-date-picker>-->\n                <!--</el-form-item>-->\n            </el-form>\n            <!-- 添加API的页面 -->\n            <!--  <el-button size=\"small\" type=\"primary\" @click=\"onSubmit\" style=\"margin-left: 20px\">查询\n             </el-button>\n             <el-button size=\"small\" type=\"primary\" @click=\"resetForm('form')\">重置</el-button> -->\n            <el-table size=\"mini\" ref=\"table\" :data=\"tableData\" stripe @selection-change=\"selectChagne\"\n                      highlight-current-row style=\"width: 100%\" :height=\"tableHeight-65\">\n                <el-table-column type=\"index\" label=\"序号\" min-width=\"5%\"></el-table-column>\n                <el-table-column property=\"serverHost\" label=\"服务器IP\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column property=\"serverDesc\" label=\"服务器描述\" min-width=\"20%\">\n                </el-table-column>\n                <el-table-column property=\"regionName\" label=\"所属区域\" min-width=\"10%\">\n                </el-table-column>\n                <el-table-column property=\"createTime\" label=\"创建时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column property=\"updateTime\" label=\"更新时间\" min-width=\"15%\">\n                </el-table-column>\n                <el-table-column label=\"操作\" min-width=\"20%\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" @click=\"open('修改配置项',scope.row)\">更新\n                            </el-button>\n                            <el-button size=\"mini\" type=\"danger\" @click=\"del(scope.row)\">删除\n                            </el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination\n                    @size-change=\"handleSizeChange\"\n                    @current-change=\"handleCurrentChange\"\n                    :page-sizes=\"[5, 10, 20, 50]\"\n                    layout=\"total, sizes, prev, pager, next, jumper\"\n                    :current-page=\"tableCurrentPage\"\n                    :page-size=\"tablePageSize\"\n                    :total=\"tableTotal\">\n            </el-pagination>\n        </el-card>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/server/server.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/support/code_check.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>前台页面代码检查</title>\n    <script type=\"text/javascript\" src=\"../../plugin/common/env.js\" ></script>\n    <script type=\"text/javascript\" src=\"../../plugin/jquery/3.3.1/jquery.min.js\" ></script>\n    <style>\n        #outPut p{\n            font-size: 12px;\n            color: red;\n        }\n    </style>\n</head>\n<body>\n<div id=\"outPut\">\n\n</div>\n\n<script>\n\n    function readUrl(chr){\n        chr.forEach( (item)=>{\n            checkSystem(\"#\"+item);\n        })\n    }\n\n    function checkSystem(url){\n        var url = url;\n        if ( url ){\n            url = url.substring(1);\n            $.get(contextPath+\"pages/\"+url,function(txt){\n                var html,devor;\n                $(txt).each(function(i){\n                    if ( this.nodeName == \"#comment\"){\n                        var di = this.nodeValue.indexOf(\"开发人：\");\n                        devor = this.nodeValue.substring(di+4,this.nodeValue.indexOf('\\n',di));\n                    }\n                    if ( this.tagName == \"SCRIPT\"){\n                        html = $(this).html()\n                        return false;\n                    }\n                });\n                var context = $('<div style=\"display: none;\"></div>').html(html).appendTo('body');\n                layoutRule(url,context,devor);\n            })\n        }\n    }\n\n    function outPut(url,error,devor){\n        //if ( devor == \"董志华\" )\n        $('#outPut').append($(\"<p></p>\").text(\"[\"+devor+\"]\"+url+\"，错误：\"+error));\n    }\n\n    function layoutRule(url,context,devor){\n        var lay = $(context).find('cust-layout');\n        if (lay.length == 0){\n            outPut(url,'页面没有cust-layout标签',devor)\n            return;\n        }\n        if ( undefined == lay.attr('ref') ){\n            outPut(url,'cust-layout没有ref属性',devor)\n        }\n        if ( undefined == lay.attr(':on-change-height') ){\n            outPut(url,'cust-layout没有绑定on-change-height钩子函数',devor)\n        }\n        if ( lay.find('modal,common-submit-modal').length > 0 ){\n            outPut(url,'cust-layout里面不要写modal,common-submit-modal',devor)\n        }\n        if ( lay.find('div[slot=\"query\"]').length > 0 ){\n            layoutQueryRule(url,lay.find('div[slot=\"query\"]'),devor);\n        }\n        layoutHeadRule(url,context);\n        if ( lay.find('[slot=\"content\"]').length == 0 ){\n            outPut(url,'cust-layout里面没有<div slot=\"content\" >',devor)\n        }else{\n            layoutTableRule(url,lay.find('div[slot=\"content\"]'),devor);\n        }\n\n    }\n\n    function layoutHeadRule(url,context,devor){\n        if ( $('span[slot=\"header\"]',context).length == 0){\n            outPut(url,'cust-layout>没有加<span slot=\"header\">',devor);\n            return\n        }\n\n        if ( $('ButtonGroup',context).length == 0){\n            outPut(url,'cust-layout>header>你的按钮没有分组',devor)\n        }\n    }\n\n    function layoutQueryRule(url,context,devor){\n        var form = $('i-form,form',context);\n        if ( form.attr(':label-width') == undefined && form.attr('label-width') == null ){\n\n            outPut(url,'cust-layout>query>form的label-width为空:',devor)\n        }\n        if ( undefined == form.attr('inline') ){\n            outPut(url,'cust-layout>query>form的inline为空',devor)\n        }\n        if ( form.find('form-item,FormItem').length == 0 ){\n            outPut(url,'cust-layout>query>form下面没有form-item',devor)\n        }else{\n            form.find('form-item,FormItem').children().each(function(){\n                if ( this.getAttribute('type') == 'hidden' )\n                    return true;\n                if ( this.tagName.toLowerCase() == 'checkbox')\n                    return true;\n                let s = $(this).attr('size');\n                if ( undefined == s ){\n                    outPut(url,'cust-layout>query>form>form-item>'+this.tagName+\"，没有size属性\",devor)\n                }if ( s != 'small' )\n                    outPut(url,'cust-layout>query>form>form-item>'+this.tagName+\"，size!=small\",devor)\n            });\n        }\n        layoutTableRule(url,context,devor);\n    }\n\n    function layoutTableRule(url,context,devor){\n        var table = $('i-table',context);\n        if ( table.length > 0){\n            if ( undefined == table.attr('border') ){\n                outPut(url,'表格没有加线条',devor)\n            }\n            if ( table.attr('size') != 'small'){\n                outPut(url,'表格size没有设置为small',devor)\n            }\n            if ( undefined == table.attr(':height') ){\n                outPut(url,'表格没有自动调高度',devor)\n            }\n            if ( undefined != table.attr('width') || undefined != table.attr(':width') ){\n                outPut(url,'不要给表格增加width属性',devor)\n            }\n            layoutPageRule(url,context,devor);\n        }\n\n    }\n\n    function layoutPageRule(url,context,devor){\n        var page = $('Page',context);\n        if ( page.length == 0){\n            outPut(url,'表格没有加分页',devor)\n        }else{\n            if ( 'small' != page.attr('size') || undefined == page.attr('transfer') || undefined == page.attr('show-elevator') ||\n                undefined == page.attr('show-total') || undefined == page.attr('show-sizer') ){\n                console.log(\"url:\"+url+\"begin\")\n                console.log(\"size:\"+page.attr('size'))\n                console.log(\"transfer:\"+page.attr('transfer'))\n                console.log(\"elevator:\"+page.attr('show-elevator'))\n                console.log(\"total:\"+page.attr('show-total'))\n                console.log(\"sizer:\"+page.attr('show-sizer'))\n                console.log(\"url:\"+url+\"end\")\n                outPut(url,\"分页需要这些属性size=\\\"small\\\" transfer show-total show-sizer show-elevator\",devor);\n            }\n        }\n    }\n\n    readUrl(['mdm/warehouse_mgt/warehouse_mgt.html','mdm/administration/administration.html','mdm/brand/brand.html','mdm/region_maintenance/region_maintenance.html','mdm/data_dict/data_dict.html','mdm/sys_parameter/sys_parameter.html','mdm/store_mgt/store_mgt.html','mdm/store_param/store_param.html','mdm/commodity/commodity.html','mdm/commodity_catalog/commodity_catalog.html','mdm/commodity_attr/commodity_attr.html','mdm/clear_corp/clear_corp.html','mpc/shop_decoration/catalog_mgt/catalog_mgt.html','mpc/shop_decoration/sowing_map/sowing_map.html','mpc/shop_decoration/hot_recommend/hot_recommend.html','mpc/shop_decoration/module_content_mgt/module_content_mgt.html','mpc/shop_decoration/exclusive_brand/exclusive_brand.html','mpc/shop_decoration/catalog_recommend/catalog_recommend.html','mpc/shop_decoration/bigpic_recommend/bigpic_recommend.html','mpc/shop_operator/catalog_mgt/catalog_mgt.html','mpc/shop_operator/cat_commodity_rel/cat_commodity_rel.html','mpc/mall_store_mgt/mall_store_mgt.html','mpc/commdity_mgt/commdity/commdity.html','mpc/commdity_mgt/commdity_put_pull/commdity_put_pull.html','mpc/commdity_mgt/commdity_stock/commdity_stock.html','mpc/commdity_mgt/commdity_pic/commdity_pic.html','mpc/commdity_mgt/commdity_label/commdity_label.html','mpc/commdity_comment/commdity_comment.html','mpc/commdity_mgt/commdity_hotWord/commdity_hotWord.html','mpc/order_mgt/order_list/order_list.html','mpc/order_mgt/order_cancel/order_cancel.html','uc/user_mgt/user/user.html','uc/sys_config/system/system.html','uc/sys_config/menu/menu.html','uc/sys_config/module/module.html','uc/sys_config/role/role.html','uc/sys_config/function/function.html','uc/data_mgt/region/region.html','uc/data_mgt/city/city.html','uc/data_mgt/warehouse/warehouse.html','uc/data_mgt/brand/brand.html','uc/data_mgt/shop/shop.html','mem/member/concern/concern.html','mem/member/register/register.html','mem/member/order_search/order_search.html','mem/member/address_list/address_list.html','mem/coupon/rule/rule.html','mem/coupon/coupon/coupon.html','mem/public_number/public_number/public_number.html','mem/public_number/template/template.html','mps/price_maint/price_maint.html','mps/mem_card/mem_rule/card_rule.html','mps/score_mgt/rule/rule.html','mps/score_mgt/special_schema/special_schema.html','mps/market_activity/activity/activity.html']);\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/support/support.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n    <script>\n        //浏览器检查，是否支持es6表达式\n        try {\n            eval('var a1 = { func(){ }, func2: () => { } };');\n            [].findIndex(function(){});\n            window.location = \"../../\";\n        } catch (e) {\n        }\n    </script>\n</head>\n<body>\n    <p>你的浏览器版本太低，请升级高版本</p>\n    <p>推荐使用chrome浏览器68.xx以上版本,FireFox浏览器61.xx以上版本</p>\n    <p>\n        点击<a href=\"http://omni-test.oss-cn-shenzhen.aliyuncs.com/omni/zip/browser/chrome/chrome_installer.bkill.com.zip\" >这里</a>，下载chrome浏览器\n    </p>\n    <!--<p>-->\n        <!--点击<a>这里</a>，下载FireFox浏览器-->\n    <!--</p>-->\n</body>\n</html>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/template/detail.html",
    "content": "<template>\n    <div>\n        <el-tabs value=\"base\" type=\"border-card\">\n            <el-tab-pane label=\"基本信息\" name=\"base\" :style=\"tabStyle\" >\n                <el-form ref=\"form\" :model=\"form\" label-width=\"100px\" >\n                    <el-form-item label=\"信息标题\">\n                        <el-input v-model=\"form.name\"  style=\"width:400px;\" ></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"信息图片\">\n                        <el-input v-model=\"form.name\"  style=\"width:400px;\"  ></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"发布时间\">\n                        <el-date-picker v-model=\"form.publish\"\n                                type=\"datetime\" placeholder=\"选择日期\" style=\"width:400px;\" >\n                        </el-date-picker>\n                    </el-form-item>\n                    <el-form-item label=\"信息排序\">\n                        <el-input-number v-model=\"form.sort\"></el-input-number>\n                    </el-form-item>\n                    <el-form-item label=\"是否显示\">\n                        <el-switch v-model=\"form.showFlag\"></el-switch>\n                    </el-form-item>\n                </el-form>\n            </el-tab-pane>\n            <el-tab-pane label=\"SEO属性\" name=\"seo\" :style=\"tabStyle\" >\n                <el-form ref=\"form\" :model=\"form\" label-width=\"100px\" >\n                    <el-form-item label=\"SEO标题\">\n                        <el-input v-model=\"form.title\"  style=\"width:400px;\" ></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"SEO关键词\">\n                        <el-input type=\"textarea\" rows=\"4\" v-model=\"form.keyword\"  style=\"width:400px;\" ></el-input>\n                    </el-form-item>\n                    <el-form-item label=\"SEO描述\">\n                        <el-input type=\"textarea\" rows=\"4\"  v-model=\"form.desc\"  style=\"width:400px;\" ></el-input>\n                    </el-form-item>\n                </el-form>\n            </el-tab-pane>\n        </el-tabs>\n        <div style=\"padding: 10px;position: fixed;top: 100px;right: 50px;\">\n            <el-button-group>\n                <el-button ref=\"submit\" type=\"primary\" icon=\"el-icon-check\" size=\"small\" @click=\"submit\" >保存</el-button>\n                <el-button type=\"error\" icon=\"el-icon-close\" size=\"small\" @click=\"App.closeCurrentTagNav()\" >取消</el-button>\n            </el-button-group>\n        </div>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/template/detail.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/template/detail.js",
    "content": "(()=>{\n\n    App.moule({\n        data :function() {\n            return {\n                form:{},\n                tabStyle:{}\n            }\n        },\n        activated(){\n            //接收数据\n            var editData = App.getData('editType');\n            App.success(\"接收传过来的数据为：\"+JSON.stringify(editData));\n            this.$nextTick(()=>{\n                this.$set(this.tabStyle,'height',(App.MainVueApp.pageHeight - 150)+\"px\")\n                this.$set(this.tabStyle,'overflow',\"auto\")\n            })\n        },\n        methods:{\n            submit(){\n                App.post('api/demo/submit').setData(this.form).callSuccess((res)=>{\n                    console.log(res)\n                    App.success('保存成功')\n                    App.closeCurrentTagNav()\n                })\n            },\n        },\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/template/template.html",
    "content": "<template>\n    <div>\n        <el-card class=\"box-card\">\n            <div slot=\"header\" >\n                <el-button-group>\n                    <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\" @click=\"create\" >新增</el-button>\n                    <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\" @click=\"deleteBatch\">删除</el-button>\n                </el-button-group>\n                <span style=\"float: right; padding: 3px 0\">\n                    <el-input placeholder=\"搜索\" size=\"mini\" suffix-icon=\"el-icon-search\" >\n                    </el-input>\n                </span>\n            </div>\n            <el-table  size=\"mini\" ref=\"table\" :data=\"pager.list\" stripe @selection-change=\"selectChagne\"\n                    highlight-current-row style=\"width: 100%\" :height=\"tableHeight\">\n                <el-table-column type=\"index\" width=\"50\"></el-table-column>\n                <el-table-column type=\"selection\" width=\"55\"></el-table-column>\n                <el-table-column property=\"date\"  label=\"日期\" width=\"120\">\n                </el-table-column>\n                <el-table-column property=\"name\" label=\"姓名\" width=\"120\">\n                </el-table-column>\n                <el-table-column property=\"address\" label=\"地址\">\n                </el-table-column>\n                <el-table-column label=\"操作\" width=\"150\">\n                    <template slot-scope=\"scope\">\n                        <el-button-group>\n                            <el-button size=\"mini\" type=\"primary\" icon=\"el-icon-edit\" @click=\"edit(scope.row)\"></el-button>\n                            <el-button size=\"mini\" type=\"danger\" icon=\"el-icon-delete\" @click=\"del(scope.row)\" ></el-button>\n                        </el-button-group>\n                    </template>\n                </el-table-column>\n            </el-table>\n            <el-pagination background layout=\"sizes, prev, pager, next, total\" :total=\"1000\"></el-pagination>\n        </el-card>\n        <el-dialog title=\"删除提示\" :visible.sync=\"deleteModal\"\n                    width=\"30%\" >\n                <h2>是否删除该记录！</h2>\n                <span slot=\"footer\" class=\"dialog-footer\">\n                    <el-button @click=\"deleteModal = false\" >取 消</el-button>\n                    <el-button ref=\"deleteBtn\" type=\"primary\" @click=\"confirmDelete\">确 定</el-button>\n                </span>\n        </el-dialog>\n    </div>\n</template>\n<script type=\"text/javascript\" src=\"pages/template/template.js\"></script>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/pages/template/template.js",
    "content": "(()=>{\n\n    App.moule({\n        data :function() {\n            return {\n                prop: \"我是属性\",\n                tableHeight:0,\n                deleteModal:false,\n                selectionData:[],\n                pager:new App.Pager(),\n            }\n        },\n        methods:{\n            selectChagne(v){\n               this.selectionData = v;\n            },\n            deleteBatch(){\n                //获取选择记录\n                if ( !this.selectionData.length ){\n                    App.error('请选择记录');\n                    return;\n                }\n                this.deleteModal=true;\n            },\n            confirmDelete(){\n                var _this = this;\n                App.post('/api/template/test').setData(_this.selectionData)\n                    .setLoadArea(_this.$refs.deleteBtn).callSuccess( ()=> {\n                    App.success('删除成功！');\n                    _this.deleteModal = false\n                });\n            },\n            edit(row){\n                //传递数据\n                App.putData(\"editData\",row);\n                App.openModule(\"detail\",\"信息编辑\",\"template/detail.html\");\n            },\n            del(row){\n                this.$set(this,'selectionData',[row]);\n                this.deleteModal = true;\n            },\n            create(){\n                //传递数据\n                App.putData(\"editType\",\"new\");\n                App.openModule(\"detail\",\"信息创建\",\"template/detail.html\");\n            }\n        },\n        /* 组件创建完成事件  */\n        created :function(){\n            this.$nextTick(()=>{\n                this.tableHeight = App.MainVueApp.pageHeight - 220\n            })\n        },\n        /* 模板编译挂载完成事件 类似小程序onload */\n        mounted :function(){\n            console.log('模板编译挂载完成事件');\n            App.request('api/demo/tempate').callSuccess((res)=>{\n                //兼容manggo 的pager和github的pager\n                this.pager = new App.Pager(res.data);\n            })\n        },\n        /* 组件更新完成事件 */\n        updated:function(){\n            console.log('组件更新完成事件');\n        },\n        /*  组件被激活 类似小程序onshow */\n        activated :function(){\n            console.log('组件被激活');\n        },\n        /*  组件未被激活 类似小程序ondestroy */\n        deactivated :function() {\n            console.log('组件未激活');\n        }\n    });\n\n})()"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/common/common.js",
    "content": "/**\n * App应用对象\n * @author zhdong\n * @date 2018/8/26\n */\nvar App = (function ($) {\n\n    const localPrefix = \"LOCAL_DATA_\";\n    //声明app\n    var app = {\n        MainVueApp: null,\n        currentLoading: null,\n        currentMoule:null\n    };\n\n    app.start = function(vue){\n        app.MainVueApp = new Vue(vue);\n    }\n\n    var localData = {};\n\n    /*************** 设置本地缓存 ****************/\n    app.putData = function(key,data){\n        localData[key] = data;\n        try{\n            window.localStorage.setItem(localPrefix+key,JSON.stringify(data));\n        }catch (e) { console.log(\"存储异常：\"+e) }\n    }\n    app.getData = function(key){\n        var data = localData[key];\n        if ( !data ){\n            try {\n                data = window.localStorage.getItem(localPrefix + key);\n                if (data != null && data != undefined) {\n                    return JSON.parse(data);\n                }\n            }catch (e) { console.log(\"存储异常：\"+e) }\n        }\n        return data;\n    }\n    /*************** 设置本地缓存 ****************/\n\n    app.removeData = function(key){\n        delete localData[key];\n        window.localStorage.removeItem(localPrefix + key);\n    }\n\n    /* 关闭当前页面 */\n    app.closeCurrentTagNav = function(){\n       this.MainVueApp.closeCurrentTagNav();\n    };\n\n    app.isEmpty = function(obj){\n        return obj == null || obj == undefined || obj == \"\";\n    }\n\n    /* 分页对象 PageInfo返回封装对象*/\n    app.Pager = function (p) {\n        p = p || {};\n        //判断是什么page类型\n        if ( p.content ){\n            //mongo类型\n            this.list = p.content || [];\n            this.pageNum = p.number || 1;\n            this.pageSize = p.size || 10;\n            this.pages = p.totalPages || 1;\n            this.total = p.totalElements || 0;\n        }else{\n            this.list = p.list || [];\n            this.pageNum = p.pageNum || 1;\n            this.pageSize = p.pageSize || 10;\n            this.pages = p.pages || 1;\n            this.total = p.total || 0;\n        }\n\n    }\n\n    /* 分页对象 PageImpl返回封装对象*/\n    app.Page = function (p) {\n        p = p || {};\n        this.list = p.content || [];\n        this.pageNum = p.pageNum || 1;\n        this.pageSize = p.pageSize || 10;\n        this.pages = p.totalPages || 1;\n        this.total = p.totalElements || 0;\n    }\n    \n\n    /* 获取oss访问地址 */\n    app.getOssAccessUrl = function (buck, key) {\n        return \"http://\" + buck + \".\" + OSSAccessDomain + \"/\" + key;\n    }\n\n    app.getPath = function(url){\n        url = contextPath + url;\n        if (url.substring(0, 2) == \"//\") {\n            url = url.substring(1);\n        }\n        return url;\n    }\n\n    app.requestCache = new Map();\n\n    //获取app高度\n    app.height = function () {\n        return $(App.MainVueApp.$el).height();\n    }\n\n    //获取模块高度\n    app.moduleHeight = function () {\n        var layoutH = document.body.clientHeight - App.MainVueApp.moduleDiff;\n        var tagH = App.MainVueApp.tagsNavHeight;\n        return layoutH - tagH;\n    }\n\n    //计算高度属性，需要传递hh头高度才能计算得出，默认为0\n    var computedHeight = function (hh) {\n        var hh = hh || 0;\n        let modulePadding = 18 * 2;//模块内边距\n        let rang = 10;//误差\n        let pgH = 32 + modulePadding + rang;\n        var minH = 100;\n        var contentH = app.moduleHeight() - hh - pgH;\n        return contentH < minH ? minH : contentH;\n    };\n\n    /*\n    * moduleComp，必须组件中直接传递this\n    * headH  头高度默认0，如果为数组则自动填充多个属性的高度格式\n    * [\n    *   {prop:'tableAptHeight',hh:'100'}\n    * ]\n    * */\n    app.acptTableHeight = function (moduleComp, headH) {\n        var work_ = function () {\n            if ($.isArray(headH)) {\n                $.each(headH, function () {\n                    if (!(this.prop in moduleComp)) {\n                        console.error('你的组建要定义' + this.prop + '属性');\n                        //跳出循环\n                        return false\n                    }\n                    moduleComp[this.prop] = computedHeight(this.hh || 0);\n                })\n            } else {\n                moduleComp.tableAptHeight = computedHeight(headH || 0);\n            }\n            if ( navigator.userAgent.indexOf(\"Firefox\") != -1){\n                App.MainVueApp.moduleHeight = (document.body.clientHeight-60) + 'px';\n            }\n        };\n\n        work_();\n        //解决resize频繁更新问题\n        var count_ = 0;\n        $(window).off('resize').on('resize', function () {\n            var self_ = ++count_;\n            if ( self_ < count_){\n                return;\n            }\n            setTimeout(work_,500)\n        });\n    }\n\n    //注册组件\n    app.register = function (compent) {\n        if (!compent.template) {\n            app.error('组件template为空')\n        } else {\n            return Vue.component(compent.template.substring(1), compent);\n        }\n    }\n\n    app.moule =function(compent){\n        this.currentMoule = compent;\n    }\n\n    //设置主App应用\n    app.setMainApp = function (vue) {\n        this.MainVueApp = vue;\n    }\n\n    //显示loadding蒙层\n    app.showLoadding = function (message, timeout, ajax) {\n        try {\n            this.currentLoading && this.currentLoading.close();\n            this.currentLoading = this.MainVueApp.$loading({\n                lock: true,\n                text: message || '加载中...',\n                spinner: 'el-icon-loading',\n                background: 'rgba(0, 0, 0, 0.7)'\n            })\n        } catch (e) {\n            console.log('显示loading错误' + e)\n        }\n    }\n    //隐藏蒙层\n    app.hideLoading = function () {\n        try {\n            this.currentLoading && this.currentLoading.close();\n        } catch (e) {\n            console.log('隐藏loading错误' + e)\n        }\n    }\n\n    //弹出提示toast\n    app.info = function (msg, timeout, closable) {\n        this.MainVueApp.$message({\n            type:\"info\",\n            showClose: closable || true,\n            message:msg,\n            duration: timeout || 3*1000,\n        });\n    }\n\n    //弹出成功toast\n    app.success = function (msg, timeout, closable) {\n        this.MainVueApp.$message({\n            type:\"success\",\n            showClose: closable || true,\n            message:msg,\n            duration: timeout || 3*1000,\n        });\n    }\n\n    //弹出警告toast\n    app.warning = function (msg, timeout, closable) {\n        this.MainVueApp.$message({\n            type:\"warning\",\n            showClose: closable || true,\n            message:msg,\n            duration: timeout || 3*1000,\n        });\n    }\n\n    //弹出错误toast\n    app.error = function (msg, timeout, closable) {\n        this.MainVueApp.$message.error(msg);\n    }\n\n    //debug\n    app.debug = function (e) {\n        if (DEBUGGER) {\n            console.log(e);\n        }\n    }\n\n\n    app.request = function (options, data) {\n\n        //默认ajax请求\n        var defOpt = {\n            type: \"get\",\n            dataType: \"json\",\n            showLoad: true,\n            cached: false,\n            loadArea:null,\n            setUrl: function (url) {\n                this.url = contextPath + url;\n                if (this.url.substring(0, 2) == \"//\") {\n                    this.url = this.url.substring(1);\n                }\n                return this;\n            },\n            setType: function (type) {\n                this.type = type;\n                return this;\n            },\n            setLoadArea(area) {\n                this.loadArea = area;\n                return this;\n            },\n            post: function () {\n                this.type = \"post\";\n                return this;\n            },\n            useCache: function () {\n                this.cached = true;\n                return this;\n            },\n            synced: function () {\n                this.async = false;\n                return this;\n            },\n            setData: function (d) {\n                this.contentType = 'application/json;charset=utf-8';\n                this.data = JSON.stringify(d);\n                return this;\n            },\n            hideLoad: function () {\n                this.showLoad = false;\n                return this;\n            },\n            beforeSend: function (xhr) {\n                if ( this.loadArea ){\n                    this.loadArea.$set(this.loadArea,'loading',true)\n                }else{\n                    this.showLoad && App.showLoadding(null, null, xhr);\n                }\n                this.beforeCallback && this.beforeCallback.call(this,xhr);\n                // 设置token 本地获取token\n                var token = window.localStorage.getItem('M-Auth-Token');\n                xhr.setRequestHeader('M-Auth-Token', token);\n            },\n            complete: function () {\n\n                if ( this.loadArea ){\n                    this.loadArea.$set(this.loadArea,'loading',false)\n                }else{\n                    this.showLoad && App.hideLoading();\n                }\n                this.completeCallback && this.completeCallback();\n            },\n            success: function (res) {\n                if (this.successCallback2) {\n                    return this.successCallback2(res);\n                }\n                if (res.success) {\n                    //如果激活了缓存，则保存缓存\n                    if ((!this.type || this.type.toLowerCase() == 'get') && this.cached) {\n                        app.requestCache.set(this.url,$.extend(true,{},res))\n                    }\n                    this.successCallback && this.successCallback(res);\n                } else {\n                    if (this.errorCallback2) {\n                        return this.errorCallback2(res);\n                    }\n                    res.message && app.error(res.message);\n                    this.errorCallback && this.errorCallback(res);\n                }\n            },\n            error: function (xhr) {\n                if (xhr.status == 401) {\n                    var dataJson = xhr.responseJSON || JSON.parse(xhr.responseText);\n                    if (dataJson && dataJson.code == 10060) {\n                        app.error('登录超时，请重新登录!');\n                        app.MainVueApp.callLogin(this);\n                        return;\n                    }\n                }\n\n                if (this.errorCallback2) {\n                    return this.errorCallback2(xhr.responseJSON, xhr);\n                }\n                if (xhr.status == 403) {\n                    app.error('您没有浏览该页面的权限');\n                }\n                else if (xhr.status == 404) {\n                    app.error('您访问的页面不存在');\n                }\n                else if (xhr.status == 500) {\n                    var dataJson = xhr.responseJSON || JSON.parse(xhr.responseText);\n                    if (dataJson.message) {\n                        app.error(dataJson.message);\n                    } else {\n                        app.error('页面内部错误，请联系管理员');\n                    }\n                }\n                else if (xhr.status == 405) {\n                    app.error('请求方法错误');\n                }else{\n                    console.log(xhr)\n                    app.error('无法访问服务器，请检查网络');\n                }\n                this.errorCallback && this.errorCallback(xhr.responseJSON, xhr);\n            },\n            callBefore: function (callback) {\n                this.beforeCallback = callback;\n                return this;\n            },\n            callComplete: function (callback) {\n                this.completeCallback = callback;\n                return this;\n            },\n            callError: function (callback) {\n                this.errorCallback = callback\n                return this;\n            },\n            callSuccess: function (callback) {\n                this.successCallback = callback\n                return this;\n            },\n            handError: function (callback) {\n                this.errorCallback2 = callback\n                return this;\n            },\n            handSuccess: function (callback) {\n                this.successCallback2 = callback\n                return this;\n            }\n        }\n        var finalOpt;\n        //第一个参数是string，直接引用默认属性，否则为对象类型，直接复制对象\n        if (typeof options === 'string') {\n            finalOpt = defOpt.setUrl(options);\n            finalOpt.data = convertParam(data);\n        } else {\n            finalOpt = $.extend(defOpt, options)\n            finalOpt.url = contextPath + finalOpt.url;\n            //设置参数\n            if (data) {\n                //处理数据\n                finalOpt.data = convertParam(data);\n            }\n            if (finalOpt.url.substring(0, 2) == \"//\") {\n                finalOpt.url = finalOpt.url.substring(1);\n            }\n        }\n        //延时调用，方便调用对象方法追加属性\n        setTimeout(function () {\n            //判断是否从缓存中获取\n            if (finalOpt.cached) {\n                var ps = finalOpt.data ? $.param(finalOpt.data) : \"\";\n                var key = finalOpt.url.indexOf('?') == -1 && ps ? finalOpt.url + \"?\" + ps :finalOpt.url + ps;\n                var exitsCache = app.requestCache.get(key);\n                if (exitsCache) {\n                    finalOpt.successCallback && finalOpt.successCallback($.extend(true,{},exitsCache));\n                    return;\n                }\n            }\n            $.ajax(finalOpt)\n        }, 100);\n\n        return finalOpt;\n    }\n\n    var convertParam = function(data){\n        for (var r in data){\n            var d = data[r];\n            //将集合转换为正确的数组格式\n            if ( d && $.isArray(d) && d.length ){\n                d.forEach((item,i)=>{\n                    data[r+\"[\"+i+\"]\"] = item;\n                });\n                delete data[r];\n            }\n        }\n        return data;\n    }\n\n    app.post = function(options, data){\n        return app.request(options, data).post();\n    }\n\n    /**\n     *\n     * @param subMenuFlag 子模块标识 ,直接写html的名称吧\n     * @param url 模块url\n     * @param name 模块名称\n     */\n    app.openModule = function (moudelFlag, name, url) {\n        var mainApp = this.MainVueApp;\n        var tabNav = new NavObject(mainApp.activeName + \"@\" + moudelFlag, \"#\" + url, name);\n        mainApp.addSubPageTag(tabNav);\n    }\n\n    app.openResource = function(url){\n        window.location.hash = url;\n    }\n\n    return app;\n})(jQuery)\n\n//导航对象\nfunction NavObject(menuId, url, name, iconCls) {\n    this.menuId = menuId;\n    this.name = name;\n    this.url = url;\n    this.iconCls = iconCls;\n}\n\nfunction JS_UUID() {\n    var uuid = new Date().getTime();\n    var rdn = Math.floor(Math.random() * 1000000);\n    return uuid.toString(36) + \"-\" + rdn.toString(36);\n}\n\nDate.prototype.format = function(format) {\n    var date = {\n        \"M+\": this.getMonth() + 1,\n        \"d+\": this.getDate(),\n        \"h+\": this.getHours(),\n        \"m+\": this.getMinutes(),\n        \"s+\": this.getSeconds(),\n        \"q+\": Math.floor((this.getMonth() + 3) / 3),\n        \"S+\": this.getMilliseconds()\n    };\n    if (/(y+)/i.test(format)) {\n        format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));\n    }\n    for (var k in date) {\n        if (new RegExp(\"(\" + k + \")\").test(format)) {\n            format = format.replace(RegExp.$1, RegExp.$1.length == 1\n                ? date[k] : (\"00\" + date[k]).substr((\"\" + date[k]).length));\n        }\n    }\n    return format;\n}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/common/env.js",
    "content": "/**\n *  环境信息\n *  @author zhdong\n *  @date 2018/8/26\n */\nvar contextPath = \"/\";//上下文根\n\nvar LOCAL_STORAGE_TABBTN_KEY = \"tabBtnStorage\";//导航存储key\nvar pageContextPath = contextPath+\"pages/\";//页面路径\nvar OSSAccessDomain= \"oss-cn-shenzhen.aliyuncs.com\";\n\n\n//调试模式\nvar DEBUGGER = false;\n//首页配置\nvar HOME_NAV_TAB_OBJ = {\n    id: \"#1\",\n    menuId: \"#1\",\n    name: \"首页\",\n    url: \"#home/home.html\",\n    iconCls: \"ios-home-outline\",\n    componentId:\"admin-home\"\n};\n\n// //浏览器检查，是否支持es6表达式\n// try {\n//     //表达式检查\n//     eval('var a1 = { func(){ }, func2: () => { } };');\n//     [].findIndex(function(){})\n//     const aaaaaaaaa = 1;\n//\n//\n//\n//\n// } catch (e) {\n//     window.location.href=contextPath+\"pages/support/support.html\";\n// }"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/element/js/index.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t(require(\"vue\")):\"function\"==typeof define&&define.amd?define(\"ELEMENT\",[\"vue\"],t):\"object\"==typeof exports?exports.ELEMENT=t(require(\"vue\")):e.ELEMENT=t(e.Vue)}(this,function(e){return function(e){function t(n){if(i[n])return i[n].exports;var s=i[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,\"a\",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/dist/\",t(t.s=93)}([function(e,t){e.exports=function(e,t,i,n,s,r){var o,a=e=e||{},l=typeof e.default;\"object\"!==l&&\"function\"!==l||(o=e,a=e.default);var u=\"function\"==typeof a?a.options:a;t&&(u.render=t.render,u.staticRenderFns=t.staticRenderFns,u._compiled=!0),i&&(u.functional=!0),s&&(u._scopeId=s);var c;if(r?(c=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),n&&n.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},u._ssrRegister=c):n&&(c=n),c){var d=u.functional,h=d?u.render:u.beforeCreate;d?(u._injectStyles=c,u.render=function(e,t){return c.call(t),h(e,t)}):u.beforeCreate=h?[].concat(h,c):[c]}return{esModule:o,exports:a,options:u}}},function(e,t,i){\"use strict\";function n(e,t,i){this.$children.forEach(function(s){s.$options.componentName===e?s.$emit.apply(s,[t].concat(i)):n.apply(s,[e,t].concat([i]))})}t.__esModule=!0,t.default={methods:{dispatch:function(e,t,i){for(var n=this.$parent||this.$root,s=n.$options.componentName;n&&(!s||s!==e);)(n=n.$parent)&&(s=n.$options.componentName);n&&n.$emit.apply(n,[t].concat(i))},broadcast:function(e,t,i){n.call(this,e,t,i)}}}},function(t,i){t.exports=e},function(e,t,i){\"use strict\";function n(){for(var e=arguments.length,t=Array(e),i=0;i<e;i++)t[i]=arguments[i];var n=1,s=t[0],r=t.length;if(\"function\"==typeof s)return s.apply(null,t.slice(1));if(\"string\"==typeof s){for(var o=String(s).replace(v,function(e){if(\"%%\"===e)return\"%\";if(n>=r)return e;switch(e){case\"%s\":return String(t[n++]);case\"%d\":return Number(t[n++]);case\"%j\":try{return JSON.stringify(t[n++])}catch(e){return\"[Circular]\"}break;default:return e}}),a=t[n];n<r;a=t[++n])o+=\" \"+a;return o}return s}function s(e){return\"string\"===e||\"url\"===e||\"hex\"===e||\"email\"===e||\"pattern\"===e}function r(e,t){return void 0===e||null===e||(!(\"array\"!==t||!Array.isArray(e)||e.length)||!(!s(t)||\"string\"!=typeof e||e))}function o(e,t,i){function n(e){s.push.apply(s,e),++r===o&&i(s)}var s=[],r=0,o=e.length;e.forEach(function(e){t(e,n)})}function a(e,t,i){function n(o){if(o&&o.length)return void i(o);var a=s;s+=1,a<r?t(e[a],n):i([])}var s=0,r=e.length;n([])}function l(e){var t=[];return Object.keys(e).forEach(function(i){t.push.apply(t,e[i])}),t}function u(e,t,i,n){if(t.first){return a(l(e),i,n)}var s=t.firstFields||[];!0===s&&(s=Object.keys(e));var r=Object.keys(e),u=r.length,c=0,d=[],h=function(e){d.push.apply(d,e),++c===u&&n(d)};r.forEach(function(t){var n=e[t];-1!==s.indexOf(t)?a(n,i,h):o(n,i,h)})}function c(e){return function(t){return t&&t.message?(t.field=t.field||e.fullField,t):{message:t,field:t.field||e.fullField}}}function d(e,t){if(t)for(var i in t)if(t.hasOwnProperty(i)){var n=t[i];\"object\"===(void 0===n?\"undefined\":m()(n))&&\"object\"===m()(e[i])?e[i]=f()({},e[i],n):e[i]=n}return e}i.d(t,\"f\",function(){return g}),t.d=n,t.e=r,t.a=u,t.b=c,t.c=d;var h=i(77),f=i.n(h),p=i(41),m=i.n(p),v=/%[sdj%]/g,g=function(){}},function(e,t,i){\"use strict\";function n(){}function s(e,t){return c.call(e,t)}function r(e,t){for(var i in t)e[i]=t[i];return e}function o(e){for(var t={},i=0;i<e.length;i++)e[i]&&r(t,e[i]);return t}function a(e,t,i){var n=e;t=t.replace(/\\[(\\w+)\\]/g,\".$1\"),t=t.replace(/^\\./,\"\");for(var s=t.split(\".\"),r=0,o=s.length;r<o-1&&(n||i);++r){var a=s[r];if(!(a in n)){if(i)throw new Error(\"please transfer a valid prop path to form item!\");break}n=n[a]}return{o:n,k:s[r],v:n?n[s[r]]:null}}t.__esModule=!0,t.isEdge=t.isIE=t.coerceTruthyValueToArray=t.arrayFind=t.arrayFindIndex=t.escapeRegexpString=t.valueEquals=t.generateId=t.getValueByPath=void 0,t.noop=n,t.hasOwn=s,t.toObject=o,t.getPropByPath=a;var l=i(2),u=function(e){return e&&e.__esModule?e:{default:e}}(l),c=Object.prototype.hasOwnProperty,d=(t.getValueByPath=function(e,t){t=t||\"\";for(var i=t.split(\".\"),n=e,s=null,r=0,o=i.length;r<o;r++){var a=i[r];if(!n)break;if(r===o-1){s=n[a];break}n=n[a]}return s},t.generateId=function(){return Math.floor(1e4*Math.random())},t.valueEquals=function(e,t){if(e===t)return!0;if(!(e instanceof Array))return!1;if(!(t instanceof Array))return!1;if(e.length!==t.length)return!1;for(var i=0;i!==e.length;++i)if(e[i]!==t[i])return!1;return!0},t.escapeRegexpString=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return String(e).replace(/[|\\\\{}()[\\]^$+*?.]/g,\"\\\\$&\")},t.arrayFindIndex=function(e,t){for(var i=0;i!==e.length;++i)if(t(e[i]))return i;return-1});t.arrayFind=function(e,t){var i=d(e,t);return-1!==i?e[i]:void 0},t.coerceTruthyValueToArray=function(e){return Array.isArray(e)?e:e?[e]:[]},t.isIE=function(){return!u.default.prototype.$isServer&&!isNaN(Number(document.documentMode))},t.isEdge=function(){return!u.default.prototype.$isServer&&navigator.userAgent.indexOf(\"Edge\")>-1}},function(e,t,i){\"use strict\";function n(e,t){if(!e||!t)return!1;if(-1!==t.indexOf(\" \"))throw new Error(\"className should not contain space.\");return e.classList?e.classList.contains(t):(\" \"+e.className+\" \").indexOf(\" \"+t+\" \")>-1}function s(e,t){if(e){for(var i=e.className,s=(t||\"\").split(\" \"),r=0,o=s.length;r<o;r++){var a=s[r];a&&(e.classList?e.classList.add(a):n(e,a)||(i+=\" \"+a))}e.classList||(e.className=i)}}function r(e,t){if(e&&t){for(var i=t.split(\" \"),s=\" \"+e.className+\" \",r=0,o=i.length;r<o;r++){var a=i[r];a&&(e.classList?e.classList.remove(a):n(e,a)&&(s=s.replace(\" \"+a+\" \",\" \")))}e.classList||(e.className=p(s))}}function o(e,t,i){if(e&&t)if(\"object\"===(void 0===t?\"undefined\":a(t)))for(var n in t)t.hasOwnProperty(n)&&o(e,n,t[n]);else t=m(t),\"opacity\"===t&&f<9?e.style.filter=isNaN(i)?\"\":\"alpha(opacity=\"+100*i+\")\":e.style[t]=i}t.__esModule=!0,t.getStyle=t.once=t.off=t.on=void 0;var a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};t.hasClass=n,t.addClass=s,t.removeClass=r,t.setStyle=o;var l=i(2),u=function(e){return e&&e.__esModule?e:{default:e}}(l),c=u.default.prototype.$isServer,d=/([\\:\\-\\_]+(.))/g,h=/^moz([A-Z])/,f=c?0:Number(document.documentMode),p=function(e){return(e||\"\").replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g,\"\")},m=function(e){return e.replace(d,function(e,t,i,n){return n?i.toUpperCase():i}).replace(h,\"Moz$1\")},v=t.on=function(){return!c&&document.addEventListener?function(e,t,i){e&&t&&i&&e.addEventListener(t,i,!1)}:function(e,t,i){e&&t&&i&&e.attachEvent(\"on\"+t,i)}}(),g=t.off=function(){return!c&&document.removeEventListener?function(e,t,i){e&&t&&e.removeEventListener(t,i,!1)}:function(e,t,i){e&&t&&e.detachEvent(\"on\"+t,i)}}();t.once=function(e,t,i){v(e,t,function n(){i&&i.apply(this,arguments),g(e,t,n)})},t.getStyle=f<9?function(e,t){if(!c){if(!e||!t)return null;t=m(t),\"float\"===t&&(t=\"styleFloat\");try{switch(t){case\"opacity\":try{return e.filters.item(\"alpha\").opacity/100}catch(e){return 1}default:return e.style[t]||e.currentStyle?e.currentStyle[t]:null}}catch(i){return e.style[t]}}}:function(e,t){if(!c){if(!e||!t)return null;t=m(t),\"float\"===t&&(t=\"cssFloat\");try{var i=document.defaultView.getComputedStyle(e,\"\");return e.style[t]||i?i[t]:null}catch(i){return e.style[t]}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(17);t.default={methods:{t:function(){for(var e=arguments.length,t=Array(e),i=0;i<e;i++)t[i]=arguments[i];return n.t.apply(this,t)}}}},function(e,t,i){\"use strict\";var n=i(88),s=i(320),r=i(321),o=i(322),a=i(323),l=i(324);t.a={required:n.a,whitespace:s.a,type:r.a,range:o.a,enum:a.a,pattern:l.a}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(105),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={mounted:function(){return},methods:{getMigratingConfig:function(){return{props:{},events:{}}}}}},function(e,t,i){\"use strict\";t.__esModule=!0,t.default=function(e){for(var t=1,i=arguments.length;t<i;t++){var n=arguments[t]||{};for(var s in n)if(n.hasOwnProperty(s)){var r=n[s];void 0!==r&&(e[s]=r)}}return e}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(2),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=i(14),o=s.default.prototype.$isServer?function(){}:i(112),a=function(e){return e.stopPropagation()};t.default={props:{transformOrigin:{type:[Boolean,String],default:!0},placement:{type:String,default:\"bottom\"},boundariesPadding:{type:Number,default:5},reference:{},popper:{},offset:{default:0},value:Boolean,visibleArrow:Boolean,arrowOffset:{type:Number,default:35},appendToBody:{type:Boolean,default:!0},popperOptions:{type:Object,default:function(){return{gpuAcceleration:!1}}}},data:function(){return{showPopper:!1,currentPlacement:\"\"}},watch:{value:{immediate:!0,handler:function(e){this.showPopper=e,this.$emit(\"input\",e)}},showPopper:function(e){this.disabled||(e?this.updatePopper():this.destroyPopper(),this.$emit(\"input\",e))}},methods:{createPopper:function(){var e=this;if(!this.$isServer&&(this.currentPlacement=this.currentPlacement||this.placement,/^(top|bottom|left|right)(-start|-end)?$/g.test(this.currentPlacement))){var t=this.popperOptions,i=this.popperElm=this.popperElm||this.popper||this.$refs.popper,n=this.referenceElm=this.referenceElm||this.reference||this.$refs.reference;!n&&this.$slots.reference&&this.$slots.reference[0]&&(n=this.referenceElm=this.$slots.reference[0].elm),i&&n&&(this.visibleArrow&&this.appendArrow(i),this.appendToBody&&document.body.appendChild(this.popperElm),this.popperJS&&this.popperJS.destroy&&this.popperJS.destroy(),t.placement=this.currentPlacement,t.offset=this.offset,t.arrowOffset=this.arrowOffset,this.popperJS=new o(n,i,t),this.popperJS.onCreate(function(t){e.$emit(\"created\",e),e.resetTransformOrigin(),e.$nextTick(e.updatePopper)}),\"function\"==typeof t.onUpdate&&this.popperJS.onUpdate(t.onUpdate),this.popperJS._popper.style.zIndex=r.PopupManager.nextZIndex(),this.popperElm.addEventListener(\"click\",a))}},updatePopper:function(){var e=this.popperJS;e?(e.update(),e._popper&&(e._popper.style.zIndex=r.PopupManager.nextZIndex())):this.createPopper()},doDestroy:function(e){!this.popperJS||this.showPopper&&!e||(this.popperJS.destroy(),this.popperJS=null)},destroyPopper:function(){this.popperJS&&this.resetTransformOrigin()},resetTransformOrigin:function(){if(this.transformOrigin){var e={top:\"bottom\",bottom:\"top\",left:\"right\",right:\"left\"},t=this.popperJS._popper.getAttribute(\"x-placement\").split(\"-\")[0],i=e[t];this.popperJS._popper.style.transformOrigin=\"string\"==typeof this.transformOrigin?this.transformOrigin:[\"top\",\"bottom\"].indexOf(t)>-1?\"center \"+i:i+\" center\"}},appendArrow:function(e){var t=void 0;if(!this.appended){this.appended=!0;for(var i in e.attributes)if(/^_v-/.test(e.attributes[i].name)){t=e.attributes[i].name;break}var n=document.createElement(\"div\");t&&n.setAttribute(t,\"\"),n.setAttribute(\"x-arrow\",\"\"),n.className=\"popper__arrow\",e.appendChild(n)}}},beforeDestroy:function(){this.doDestroy(!0),this.popperElm&&this.popperElm.parentNode===document.body&&(this.popperElm.removeEventListener(\"click\",a),document.body.removeChild(this.popperElm))},deactivated:function(){this.$options.beforeDestroy[0].call(this)}}},function(e,t,i){\"use strict\";function n(e,t,i){return function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!(i&&i.context&&n.target&&s.target)||e.contains(n.target)||e.contains(s.target)||e===n.target||i.context.popperElm&&(i.context.popperElm.contains(n.target)||i.context.popperElm.contains(s.target))||(t.expression&&e[l].methodName&&i.context[e[l].methodName]?i.context[e[l].methodName]():e[l].bindingFn&&e[l].bindingFn())}}t.__esModule=!0;var s=i(2),r=function(e){return e&&e.__esModule?e:{default:e}}(s),o=i(5),a=[],l=\"@@clickoutsideContext\",u=void 0,c=0;!r.default.prototype.$isServer&&(0,o.on)(document,\"mousedown\",function(e){return u=e}),!r.default.prototype.$isServer&&(0,o.on)(document,\"mouseup\",function(e){a.forEach(function(t){return t[l].documentHandler(e,u)})}),t.default={bind:function(e,t,i){a.push(e);var s=c++;e[l]={id:s,documentHandler:n(e,t,i),methodName:t.expression,bindingFn:t.value}},update:function(e,t,i){e[l].documentHandler=n(e,t,i),e[l].methodName=t.expression,e[l].bindingFn=t.value},unbind:function(e){for(var t=a.length,i=0;i<t;i++)if(a[i][l].id===e[l].id){a.splice(i,1);break}delete e[l]}}},function(e,t,i){\"use strict\";function n(e,t,i,n){for(var s=t;s<i;s++)e[s]=n}t.__esModule=!0,t.extractTimeFormat=t.extractDateFormat=t.nextYear=t.prevYear=t.nextMonth=t.prevMonth=t.changeYearMonthAndClampDate=t.timeWithinRange=t.limitTimeRange=t.clearMilliseconds=t.clearTime=t.modifyWithTimeString=t.modifyTime=t.modifyDate=t.range=t.getRangeMinutes=t.getRangeHours=t.getWeekNumber=t.getStartDateOfMonth=t.nextDate=t.prevDate=t.getFirstDayOfMonth=t.getDayCountOfYear=t.getDayCountOfMonth=t.parseDate=t.formatDate=t.isDateObject=t.isDate=t.toDate=void 0;var s=i(228),r=function(e){return e&&e.__esModule?e:{default:e}}(s),o=i(17),a=[\"sun\",\"mon\",\"tue\",\"wed\",\"thu\",\"fri\",\"sat\"],l=[\"jan\",\"feb\",\"mar\",\"apr\",\"may\",\"jun\",\"jul\",\"aug\",\"sep\",\"oct\",\"nov\",\"dec\"],u=function(){return{dayNamesShort:a.map(function(e){return(0,o.t)(\"el.datepicker.weeks.\"+e)}),dayNames:a.map(function(e){return(0,o.t)(\"el.datepicker.weeks.\"+e)}),monthNamesShort:l.map(function(e){return(0,o.t)(\"el.datepicker.months.\"+e)}),monthNames:l.map(function(e,t){return(0,o.t)(\"el.datepicker.month\"+(t+1))}),amPm:[\"am\",\"pm\"]}},c=function(e,t){for(var i=[],n=e;n<=t;n++)i.push(n);return i},d=t.toDate=function(e){return h(e)?new Date(e):null},h=t.isDate=function(e){return null!==e&&void 0!==e&&(!isNaN(new Date(e).getTime())&&!Array.isArray(e))},f=(t.isDateObject=function(e){return e instanceof Date},t.formatDate=function(e,t){return e=d(e),e?r.default.format(e,t||\"yyyy-MM-dd\",u()):\"\"},t.parseDate=function(e,t){return r.default.parse(e,t||\"yyyy-MM-dd\",u())}),p=t.getDayCountOfMonth=function(e,t){return 3===t||5===t||8===t||10===t?30:1===t?e%4==0&&e%100!=0||e%400==0?29:28:31},m=(t.getDayCountOfYear=function(e){return e%400==0||e%100!=0&&e%4==0?366:365},t.getFirstDayOfMonth=function(e){var t=new Date(e.getTime());return t.setDate(1),t.getDay()},t.prevDate=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Date(e.getFullYear(),e.getMonth(),e.getDate()-t)}),v=(t.nextDate=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)},t.getStartDateOfMonth=function(e,t){var i=new Date(e,t,1),n=i.getDay();return 0===n?m(i,7):m(i,n)},t.getWeekNumber=function(e){if(!h(e))return null;var t=new Date(e.getTime());t.setHours(0,0,0,0),t.setDate(t.getDate()+3-(t.getDay()+6)%7);var i=new Date(t.getFullYear(),0,4);return 1+Math.round(((t.getTime()-i.getTime())/864e5-3+(i.getDay()+6)%7)/7)},t.getRangeHours=function(e){var t=[],i=[];if((e||[]).forEach(function(e){var t=e.map(function(e){return e.getHours()});i=i.concat(c(t[0],t[1]))}),i.length)for(var n=0;n<24;n++)t[n]=-1===i.indexOf(n);else for(var s=0;s<24;s++)t[s]=!1;return t},t.getRangeMinutes=function(e,t){var i=new Array(60);return e.length>0?e.forEach(function(e){var s=e[0],r=e[1],o=s.getHours(),a=s.getMinutes(),l=r.getHours(),u=r.getMinutes();o===t&&l!==t?n(i,a,60,!0):o===t&&l===t?n(i,a,u+1,!0):o!==t&&l===t?n(i,0,u+1,!0):o<t&&l>t&&n(i,0,60,!0)}):n(i,0,60,!0),i},t.range=function(e){return Array.apply(null,{length:e}).map(function(e,t){return t})},t.modifyDate=function(e,t,i,n){return new Date(t,i,n,e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())}),g=t.modifyTime=function(e,t,i,n){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),t,i,n,e.getMilliseconds())},b=(t.modifyWithTimeString=function(e,t){return null!=e&&t?(t=f(t,\"HH:mm:ss\"),g(e,t.getHours(),t.getMinutes(),t.getSeconds())):e},t.clearTime=function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())},t.clearMilliseconds=function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),0)},t.limitTimeRange=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"HH:mm:ss\";if(0===t.length)return e;var n=function(e){return r.default.parse(r.default.format(e,i),i)},s=n(e),o=t.map(function(e){return e.map(n)});if(o.some(function(e){return s>=e[0]&&s<=e[1]}))return e;var a=o[0][0],l=o[0][0];return o.forEach(function(e){a=new Date(Math.min(e[0],a)),l=new Date(Math.max(e[1],a))}),v(s<a?a:l,e.getFullYear(),e.getMonth(),e.getDate())}),y=(t.timeWithinRange=function(e,t,i){return b(e,t,i).getTime()===e.getTime()},t.changeYearMonthAndClampDate=function(e,t,i){var n=Math.min(e.getDate(),p(t,i));return v(e,t,i,n)});t.prevMonth=function(e){var t=e.getFullYear(),i=e.getMonth();return 0===i?y(e,t-1,11):y(e,t,i-1)},t.nextMonth=function(e){var t=e.getFullYear(),i=e.getMonth();return 11===i?y(e,t+1,0):y(e,t,i+1)},t.prevYear=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.getFullYear(),n=e.getMonth();return y(e,i-t,n)},t.nextYear=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.getFullYear(),n=e.getMonth();return y(e,i+t,n)},t.extractDateFormat=function(e){return e.replace(/\\W?m{1,2}|\\W?ZZ/g,\"\").replace(/\\W?h{1,2}|\\W?s{1,3}|\\W?a/gi,\"\").trim()},t.extractTimeFormat=function(e){return e.replace(/\\W?D{1,2}|\\W?Do|\\W?d{1,4}|\\W?M{1,4}|\\W?y{2,4}/g,\"\").trim()}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.PopupManager=void 0;var s=i(2),r=n(s),o=i(10),a=n(o),l=i(111),u=n(l),c=i(44),d=n(c),h=i(5),f=1,p=void 0,m=function e(t){return 3===t.nodeType&&(t=t.nextElementSibling||t.nextSibling,e(t)),t};t.default={props:{visible:{type:Boolean,default:!1},openDelay:{},closeDelay:{},zIndex:{},modal:{type:Boolean,default:!1},modalFade:{type:Boolean,default:!0},modalClass:{},modalAppendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!1},closeOnClickModal:{type:Boolean,default:!1}},beforeMount:function(){this._popupId=\"popup-\"+f++,u.default.register(this._popupId,this)},beforeDestroy:function(){u.default.deregister(this._popupId),u.default.closeModal(this._popupId),this.restoreBodyStyle()},data:function(){return{opened:!1,bodyPaddingRight:null,computedBodyPaddingRight:0,withoutHiddenClass:!0,rendered:!1}},watch:{visible:function(e){var t=this;if(e){if(this._opening)return;this.rendered?this.open():(this.rendered=!0,r.default.nextTick(function(){t.open()}))}else this.close()}},methods:{open:function(e){var t=this;this.rendered||(this.rendered=!0);var i=(0,a.default)({},this.$props||this,e);this._closeTimer&&(clearTimeout(this._closeTimer),this._closeTimer=null),clearTimeout(this._openTimer);var n=Number(i.openDelay);n>0?this._openTimer=setTimeout(function(){t._openTimer=null,t.doOpen(i)},n):this.doOpen(i)},doOpen:function(e){if(!this.$isServer&&(!this.willOpen||this.willOpen())&&!this.opened){this._opening=!0;var t=m(this.$el),i=e.modal,n=e.zIndex;if(n&&(u.default.zIndex=n),i&&(this._closing&&(u.default.closeModal(this._popupId),this._closing=!1),u.default.openModal(this._popupId,u.default.nextZIndex(),this.modalAppendToBody?void 0:t,e.modalClass,e.modalFade),e.lockScroll)){this.withoutHiddenClass=!(0,h.hasClass)(document.body,\"el-popup-parent--hidden\"),this.withoutHiddenClass&&(this.bodyPaddingRight=document.body.style.paddingRight,this.computedBodyPaddingRight=parseInt((0,h.getStyle)(document.body,\"paddingRight\"),10)),p=(0,d.default)();var s=document.documentElement.clientHeight<document.body.scrollHeight,r=(0,h.getStyle)(document.body,\"overflowY\");p>0&&(s||\"scroll\"===r)&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.computedBodyPaddingRight+p+\"px\"),(0,h.addClass)(document.body,\"el-popup-parent--hidden\")}\"static\"===getComputedStyle(t).position&&(t.style.position=\"absolute\"),t.style.zIndex=u.default.nextZIndex(),this.opened=!0,this.onOpen&&this.onOpen(),this.doAfterOpen()}},doAfterOpen:function(){this._opening=!1},close:function(){var e=this;if(!this.willClose||this.willClose()){null!==this._openTimer&&(clearTimeout(this._openTimer),this._openTimer=null),clearTimeout(this._closeTimer);var t=Number(this.closeDelay);t>0?this._closeTimer=setTimeout(function(){e._closeTimer=null,e.doClose()},t):this.doClose()}},doClose:function(){this._closing=!0,this.onClose&&this.onClose(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose()},doAfterClose:function(){u.default.closeModal(this._popupId),this._closing=!1},restoreBodyStyle:function(){this.modal&&this.withoutHiddenClass&&(document.body.style.paddingRight=this.bodyPaddingRight,(0,h.removeClass)(document.body,\"el-popup-parent--hidden\")),this.withoutHiddenClass=!0}}},t.PopupManager=u.default},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(186),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t){var i=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=i)},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.i18n=t.use=t.t=void 0;var s=i(102),r=n(s),o=i(2),a=n(o),l=i(103),u=n(l),c=i(104),d=n(c),h=(0,d.default)(a.default),f=r.default,p=!1,m=function(){var e=Object.getPrototypeOf(this||a.default).$t;if(\"function\"==typeof e&&a.default.locale)return p||(p=!0,a.default.locale(a.default.config.lang,(0,u.default)(f,a.default.locale(a.default.config.lang)||{},{clone:!0}))),e.apply(this,arguments)},v=t.t=function(e,t){var i=m.apply(this,arguments);if(null!==i&&void 0!==i)return i;for(var n=e.split(\".\"),s=f,r=0,o=n.length;r<o;r++){if(i=s[n[r]],r===o-1)return h(i,t);if(!i)return\"\";s=i}return\"\"},g=t.use=function(e){f=e||f},b=t.i18n=function(e){m=e||m};t.default={use:g,t:v,i18n:b}},function(e,t,i){var n=i(68);e.exports=function(e,t,i){return void 0===i?n(e,t,!1):n(e,i,!1!==t)}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(139),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t){var i={}.hasOwnProperty;e.exports=function(e,t){return i.call(e,t)}},function(e,t,i){var n=i(81),s=i(53);e.exports=function(e){return n(s(e))}},function(e,t,i){var n=i(23),s=i(38);e.exports=i(24)?function(e,t,i){return n.f(e,t,s(1,i))}:function(e,t,i){return e[t]=i,e}},function(e,t,i){var n=i(36),s=i(78),r=i(52),o=Object.defineProperty;t.f=i(24)?Object.defineProperty:function(e,t,i){if(n(e),t=r(t,!0),n(i),s)try{return o(e,t,i)}catch(e){}if(\"get\"in i||\"set\"in i)throw TypeError(\"Accessors not supported!\");return\"value\"in i&&(e[t]=i.value),e}},function(e,t,i){e.exports=!i(28)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(e,t,i){var n=i(56)(\"wks\"),s=i(39),r=i(16).Symbol,o=\"function\"==typeof r;(e.exports=function(e){return n[e]||(n[e]=o&&r[e]||(o?r:s)(\"Symbol.\"+e))}).store=n},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(118),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.removeResizeListener=t.addResizeListener=void 0;var n=i(119),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=\"undefined\"==typeof window,o=function(e){for(var t=e,i=Array.isArray(t),n=0,t=i?t:t[Symbol.iterator]();;){var s;if(i){if(n>=t.length)break;s=t[n++]}else{if(n=t.next(),n.done)break;s=n.value}var r=s,o=r.target.__resizeListeners__||[];o.length&&o.forEach(function(e){e()})}};t.addResizeListener=function(e,t){r||(e.__resizeListeners__||(e.__resizeListeners__=[],e.__ro__=new s.default(o),e.__ro__.observe(e)),e.__resizeListeners__.push(t))},t.removeResizeListener=function(e,t){e&&e.__resizeListeners__&&(e.__resizeListeners__.splice(e.__resizeListeners__.indexOf(t),1),e.__resizeListeners__.length||e.__ro__.disconnect())}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,i){var n=i(80),s=i(57);e.exports=Object.keys||function(e){return n(e,s)}},function(e,t,i){\"use strict\";t.__esModule=!0,t.default=function(e){return{methods:{focus:function(){this.$refs[e].focus()}}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(116),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var s=i(5),r=function(){function e(){n(this,e)}return e.prototype.beforeEnter=function(e){(0,s.addClass)(e,\"collapse-transition\"),e.dataset||(e.dataset={}),e.dataset.oldPaddingTop=e.style.paddingTop,e.dataset.oldPaddingBottom=e.style.paddingBottom,e.style.height=\"0\",e.style.paddingTop=0,e.style.paddingBottom=0},e.prototype.enter=function(e){e.dataset.oldOverflow=e.style.overflow,0!==e.scrollHeight?(e.style.height=e.scrollHeight+\"px\",e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom):(e.style.height=\"\",e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom),e.style.overflow=\"hidden\"},e.prototype.afterEnter=function(e){(0,s.removeClass)(e,\"collapse-transition\"),e.style.height=\"\",e.style.overflow=e.dataset.oldOverflow},e.prototype.beforeLeave=function(e){e.dataset||(e.dataset={}),e.dataset.oldPaddingTop=e.style.paddingTop,e.dataset.oldPaddingBottom=e.style.paddingBottom,e.dataset.oldOverflow=e.style.overflow,e.style.height=e.scrollHeight+\"px\",e.style.overflow=\"hidden\"},e.prototype.leave=function(e){0!==e.scrollHeight&&((0,s.addClass)(e,\"collapse-transition\"),e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0)},e.prototype.afterLeave=function(e){(0,s.removeClass)(e,\"collapse-transition\"),e.style.height=\"\",e.style.overflow=e.dataset.oldOverflow,e.style.paddingTop=e.dataset.oldPaddingTop,e.style.paddingBottom=e.dataset.oldPaddingBottom},e}();t.default={name:\"ElCollapseTransition\",functional:!0,render:function(e,t){var i=t.children;return e(\"transition\",{on:new r},i)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(165),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return null!==e&&\"object\"===(void 0===e?\"undefined\":r(e))&&(0,o.hasOwn)(e,\"componentOptions\")}function s(e){return e&&e.filter(function(e){return e&&e.tag})[0]}t.__esModule=!0;var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};t.isVNode=n,t.getFirstComponentChild=s;var o=i(4)},function(e,t){var i=e.exports={version:\"2.4.0\"};\"number\"==typeof __e&&(__e=i)},function(e,t,i){var n=i(37);e.exports=function(e){if(!n(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var i=0,n=Math.random();e.exports=function(e){return\"Symbol(\".concat(void 0===e?\"\":e,\")_\",(++i+n).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(294),r=n(s),o=i(306),a=n(o),l=\"function\"==typeof a.default&&\"symbol\"==typeof r.default?function(e){return typeof e}:function(e){return e&&\"function\"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?\"symbol\":typeof e};t.default=\"function\"==typeof a.default&&\"symbol\"===l(r.default)?function(e){return void 0===e?\"undefined\":l(e)}:function(e){return e&&\"function\"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?\"symbol\":void 0===e?\"undefined\":l(e)}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=t.NODE_KEY=\"$treeNodeId\";t.markNodeData=function(e,t){t&&!t[n]&&Object.defineProperty(t,n,{value:e.id,enumerable:!1,configurable:!1,writable:!1})},t.getNodeKey=function(e,t){return e?t[e]:t[n]},t.findNearestComponent=function(e,t){for(var i=e;i&&\"BODY\"!==i.tagName;){if(i.__vue__&&i.__vue__.$options.name===t)return i.__vue__;i=i.parentNode}return null}},function(e,t,i){\"use strict\";function n(e){return void 0!==e&&null!==e}function s(e){return/([(\\uAC00-\\uD7AF)|(\\u3130-\\u318F)])+/gi.test(e)}t.__esModule=!0,t.isDef=n,t.isKorean=s},function(e,t,i){\"use strict\";t.__esModule=!0,t.default=function(){if(s.default.prototype.$isServer)return 0;if(void 0!==r)return r;var e=document.createElement(\"div\");e.className=\"el-scrollbar__wrap\",e.style.visibility=\"hidden\",e.style.width=\"100px\",e.style.position=\"absolute\",e.style.top=\"-9999px\",document.body.appendChild(e);var t=e.offsetWidth;e.style.overflow=\"scroll\";var i=document.createElement(\"div\");i.style.width=\"100%\",e.appendChild(i);var n=i.offsetWidth;return e.parentNode.removeChild(e),r=t-n};var n=i(2),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=void 0},function(e,t,i){\"use strict\";function n(e,t){if(!r.default.prototype.$isServer){if(!t)return void(e.scrollTop=0);for(var i=[],n=t.offsetParent;n&&e!==n&&e.contains(n);)i.push(n),n=n.offsetParent;var s=t.offsetTop+i.reduce(function(e,t){return e+t.offsetTop},0),o=s+t.offsetHeight,a=e.scrollTop,l=a+e.clientHeight;s<a?e.scrollTop=s:o>l&&(e.scrollTop=o-e.clientHeight)}}t.__esModule=!0,t.default=n;var s=i(2),r=function(e){return e&&e.__esModule?e:{default:e}}(s)},function(e,t,i){\"use strict\";t.__esModule=!0;var n=n||{};n.Utils=n.Utils||{},n.Utils.focusFirstDescendant=function(e){for(var t=0;t<e.childNodes.length;t++){var i=e.childNodes[t];if(n.Utils.attemptFocus(i)||n.Utils.focusFirstDescendant(i))return!0}return!1},n.Utils.focusLastDescendant=function(e){for(var t=e.childNodes.length-1;t>=0;t--){var i=e.childNodes[t];if(n.Utils.attemptFocus(i)||n.Utils.focusLastDescendant(i))return!0}return!1},n.Utils.attemptFocus=function(e){if(!n.Utils.isFocusable(e))return!1;n.Utils.IgnoreUtilFocusChanges=!0;try{e.focus()}catch(e){}return n.Utils.IgnoreUtilFocusChanges=!1,document.activeElement===e},n.Utils.isFocusable=function(e){if(e.tabIndex>0||0===e.tabIndex&&null!==e.getAttribute(\"tabIndex\"))return!0;if(e.disabled)return!1;switch(e.nodeName){case\"A\":return!!e.href&&\"ignore\"!==e.rel;case\"INPUT\":return\"hidden\"!==e.type&&\"file\"!==e.type;case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":return!0;default:return!1}},n.Utils.triggerEvent=function(e,t){var i=void 0;i=/^mouse|click/.test(t)?\"MouseEvents\":/^key/.test(t)?\"KeyboardEvent\":\"HTMLEvents\";for(var n=document.createEvent(i),s=arguments.length,r=Array(s>2?s-2:0),o=2;o<s;o++)r[o-2]=arguments[o];return n.initEvent.apply(n,[t].concat(r)),e.dispatchEvent?e.dispatchEvent(n):e.fireEvent(\"on\"+t,n),e},n.Utils.keys={tab:9,enter:13,space:32,left:37,up:38,right:39,down:40},t.default=n.Utils},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(193),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={created:function(){this.tableLayout.addObserver(this)},destroyed:function(){this.tableLayout.removeObserver(this)},computed:{tableLayout:function(){var e=this.layout;if(!e&&this.table&&(e=this.table.layout),!e)throw new Error(\"Can not find table layout.\");return e}},mounted:function(){this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout)},updated:function(){this.__updated__||(this.onColumnsChange(this.tableLayout),this.onScrollableChange(this.tableLayout),this.__updated__=!0)},methods:{onColumnsChange:function(){var e=this.$el.querySelectorAll(\"colgroup > col\");if(e.length){var t=this.tableLayout.getFlattenColumns(),i={};t.forEach(function(e){i[e.id]=e});for(var n=0,s=e.length;n<s;n++){var r=e[n],o=r.getAttribute(\"name\"),a=i[o];a&&r.setAttribute(\"width\",a.realWidth||a.width)}}},onScrollableChange:function(e){for(var t=this.$el.querySelectorAll(\"colgroup > col[name=gutter]\"),i=0,n=t.length;i<n;i++){t[i].setAttribute(\"width\",e.scrollY?e.gutterWidth:\"0\")}for(var s=this.$el.querySelectorAll(\"th.gutter\"),r=0,o=s.length;r<o;r++){var a=s[r];a.style.width=e.scrollY?e.gutterWidth+\"px\":\"0\",a.style.display=e.scrollY?\"\":\"none\"}}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(227),s=i.n(n),r=i(229),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(232),s=i.n(n),r=i(235),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){var n=i(16),s=i(35),r=i(288),o=i(22),a=function(e,t,i){var l,u,c,d=e&a.F,h=e&a.G,f=e&a.S,p=e&a.P,m=e&a.B,v=e&a.W,g=h?s:s[t]||(s[t]={}),b=g.prototype,y=h?n:f?n[t]:(n[t]||{}).prototype;h&&(i=t);for(l in i)(u=!d&&y&&void 0!==y[l])&&l in g||(c=u?y[l]:i[l],g[l]=h&&\"function\"!=typeof y[l]?i[l]:m&&u?r(c,n):v&&y[l]==c?function(e){var t=function(t,i,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,i)}return new e(t,i,n)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(c):p&&\"function\"==typeof c?r(Function.call,c):c,p&&((g.virtual||(g.virtual={}))[l]=c,e&a.R&&b&&!b[l]&&o(b,l,c)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,e.exports=a},function(e,t,i){var n=i(37);e.exports=function(e,t){if(!n(e))return e;var i,s;if(t&&\"function\"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;if(\"function\"==typeof(i=e.valueOf)&&!n(s=i.call(e)))return s;if(!t&&\"function\"==typeof(i=e.toString)&&!n(s=i.call(e)))return s;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on  \"+e);return e}},function(e,t){var i=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:i)(e)}},function(e,t,i){var n=i(56)(\"keys\"),s=i(39);e.exports=function(e){return n[e]||(n[e]=s(e))}},function(e,t,i){var n=i(16),s=n[\"__core-js_shared__\"]||(n[\"__core-js_shared__\"]={});e.exports=function(e){return s[e]||(s[e]={})}},function(e,t){e.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports=!0},function(e,t){e.exports={}},function(e,t,i){var n=i(23).f,s=i(20),r=i(25)(\"toStringTag\");e.exports=function(e,t,i){e&&!s(e=i?e:e.prototype,r)&&n(e,r,{configurable:!0,value:t})}},function(e,t,i){t.f=i(25)},function(e,t,i){var n=i(16),s=i(35),r=i(59),o=i(62),a=i(23).f;e.exports=function(e){var t=s.Symbol||(s.Symbol=r?{}:n.Symbol||{});\"_\"==e.charAt(0)||e in t||a(t,e,{value:o.f(e)})}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(395),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.default=function(e,t){if(!s.default.prototype.$isServer){var i=function(e){t.drag&&t.drag(e)},n=function e(n){document.removeEventListener(\"mousemove\",i),document.removeEventListener(\"mouseup\",e),document.onselectstart=null,document.ondragstart=null,r=!1,t.end&&t.end(n)};e.addEventListener(\"mousedown\",function(e){r||(document.onselectstart=function(){return!1},document.ondragstart=function(){return!1},document.addEventListener(\"mousemove\",i),document.addEventListener(\"mouseup\",n),r=!0,t.start&&t.start(e))})}};var n=i(2),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=!1},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(100),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(114),s=i.n(n),r=i(115),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t){e.exports=function(e,t,i,n){function s(){function s(){o=Number(new Date),i.apply(l,c)}function a(){r=void 0}var l=this,u=Number(new Date)-o,c=arguments;n&&!r&&s(),r&&clearTimeout(r),void 0===n&&u>e?s():!0!==t&&(r=setTimeout(n?a:s,void 0===n?e-u:e))}var r,o=0;return\"boolean\"!=typeof t&&(n=i,i=t,t=void 0),s}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(67),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(142),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={inject:[\"rootMenu\"],computed:{indexPath:function(){for(var e=[this.index],t=this.$parent;\"ElMenu\"!==t.$options.componentName;)t.index&&e.unshift(t.index),t=t.$parent;return e},parentMenu:function(){for(var e=this.$parent;e&&-1===[\"ElMenu\",\"ElSubmenu\"].indexOf(e.$options.componentName);)e=e.$parent;return e},paddingStyle:function(){if(\"vertical\"!==this.rootMenu.mode)return{};var e=20,t=this.$parent;if(this.rootMenu.collapse)e=20;else for(;t&&\"ElMenu\"!==t.$options.componentName;)\"ElSubmenu\"===t.$options.componentName&&(e+=20),t=t.$parent;return{paddingLeft:e+\"px\"}}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(171),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(5);t.default={bind:function(e,t,i){var s=null,r=void 0,o=function(){return i.context[t.expression].apply()},a=function(){new Date-r<100&&o(),clearInterval(s),s=null};(0,n.on)(e,\"mousedown\",function(e){0===e.button&&(r=new Date,(0,n.once)(document,\"mouseup\",a),clearInterval(s),s=setInterval(o,100))})}}},function(e,t,i){\"use strict\";t.__esModule=!0,t.getRowIdentity=t.getColumnByCell=t.getColumnByKey=t.getColumnById=t.orderBy=t.getCell=void 0;var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},s=i(4),r=(t.getCell=function(e){for(var t=e.target;t&&\"HTML\"!==t.tagName.toUpperCase();){if(\"TD\"===t.tagName.toUpperCase())return t;t=t.parentNode}return null},function(e){return null!==e&&\"object\"===(void 0===e?\"undefined\":n(e))}),o=(t.orderBy=function(e,t,i,n,o){if(!t&&!n&&(!o||Array.isArray(o)&&!o.length))return e;i=\"string\"==typeof i?\"descending\"===i?-1:1:i&&i<0?-1:1;var a=n?null:function(i,n){return o?(Array.isArray(o)||(o=[o]),o.map(function(t){return\"string\"==typeof t?(0,s.getValueByPath)(i,t):t(i,n,e)})):(\"$key\"!==t&&r(i)&&\"$value\"in i&&(i=i.$value),[r(i)?(0,s.getValueByPath)(i,t):i])},l=function(e,t){if(n)return n(e.value,t.value);for(var i=0,s=e.key.length;i<s;i++){if(e.key[i]<t.key[i])return-1;if(e.key[i]>t.key[i])return 1}return 0};return e.map(function(e,t){return{value:e,index:t,key:a?a(e,t):null}}).sort(function(e,t){var n=l(e,t);return n||(n=e.index-t.index),n*i}).map(function(e){return e.value})},t.getColumnById=function(e,t){var i=null;return e.columns.forEach(function(e){e.id===t&&(i=e)}),i});t.getColumnByKey=function(e,t){for(var i=null,n=0;n<e.columns.length;n++){var s=e.columns[n];if(s.columnKey===t){i=s;break}}return i},t.getColumnByCell=function(e,t){var i=(t.className||\"\").match(/el-table_[^\\s]+/gm);return i?o(e,i[0]):null},t.getRowIdentity=function(e,t){if(!e)throw new Error(\"row is required when get row identity\");if(\"string\"==typeof t){if(t.indexOf(\".\")<0)return e[t];for(var i=t.split(\".\"),n=e,s=0;s<i.length;s++)n=n[i[s]];return n}if(\"function\"==typeof t)return t.call(null,e)}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(233),s=i.n(n),r=i(234),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(242),s=i.n(n),r=i(243),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(285),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=s.default||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e}},function(e,t,i){e.exports=!i(24)&&!i(28)(function(){return 7!=Object.defineProperty(i(79)(\"div\"),\"a\",{get:function(){return 7}}).a})},function(e,t,i){var n=i(37),s=i(16).document,r=n(s)&&n(s.createElement);e.exports=function(e){return r?s.createElement(e):{}}},function(e,t,i){var n=i(20),s=i(21),r=i(291)(!1),o=i(55)(\"IE_PROTO\");e.exports=function(e,t){var i,a=s(e),l=0,u=[];for(i in a)i!=o&&n(a,i)&&u.push(i);for(;t.length>l;)n(a,i=t[l++])&&(~r(u,i)||u.push(i));return u}},function(e,t,i){var n=i(82);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==n(e)?e.split(\"\"):Object(e)}},function(e,t){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,t,i){var n=i(53);e.exports=function(e){return Object(n(e))}},function(e,t,i){\"use strict\";var n=i(59),s=i(51),r=i(85),o=i(22),a=i(20),l=i(60),u=i(298),c=i(61),d=i(301),h=i(25)(\"iterator\"),f=!([].keys&&\"next\"in[].keys()),p=function(){return this};e.exports=function(e,t,i,m,v,g,b){u(i,t,m);var y,_,C,x=function(e){if(!f&&e in M)return M[e];switch(e){case\"keys\":case\"values\":return function(){return new i(this,e)}}return function(){return new i(this,e)}},w=t+\" Iterator\",k=\"values\"==v,S=!1,M=e.prototype,$=M[h]||M[\"@@iterator\"]||v&&M[v],E=$||x(v),D=v?k?x(\"entries\"):E:void 0,T=\"Array\"==t?M.entries||$:$;if(T&&(C=d(T.call(new e)))!==Object.prototype&&(c(C,w,!0),n||a(C,h)||o(C,h,p)),k&&$&&\"values\"!==$.name&&(S=!0,E=function(){return $.call(this)}),n&&!b||!f&&!S&&M[h]||o(M,h,E),l[t]=E,l[w]=p,v)if(y={values:k?E:x(\"values\"),keys:g?E:x(\"keys\"),entries:D},b)for(_ in y)_ in M||r(M,_,y[_]);else s(s.P+s.F*(f||S),t,y);return y}},function(e,t,i){e.exports=i(22)},function(e,t,i){var n=i(36),s=i(299),r=i(57),o=i(55)(\"IE_PROTO\"),a=function(){},l=function(){var e,t=i(79)(\"iframe\"),n=r.length;for(t.style.display=\"none\",i(300).appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(\"<script>document.F=Object<\\/script>\"),e.close(),l=e.F;n--;)delete l.prototype[r[n]];return l()};e.exports=Object.create||function(e,t){var i;return null!==e?(a.prototype=n(e),i=new a,a.prototype=null,i[o]=e):i=l(),void 0===t?i:s(i,t)}},function(e,t,i){var n=i(80),s=i(57).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return n(e,s)}},function(e,t,i){\"use strict\";function n(e,t,i,n,r,o){!e.required||i.hasOwnProperty(e.field)&&!s.e(t,o||e.type)||n.push(s.d(r.messages.required,e.fullField))}var s=i(3);t.a=n},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(379),s=i.n(n),r=i(380),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:300,n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!e||!t)throw new Error(\"instance & callback is required\");var s=!1,r=function(){s||(s=!0,t&&t.apply(null,arguments))};n?e.$once(\"after-leave\",r):e.$on(\"after-leave\",r),setTimeout(function(){r()},i+100)}},function(e,t){function i(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}var n=/^(attrs|props|on|nativeOn|class|style|hook)$/;e.exports=function(e){return e.reduce(function(e,t){var s,r,o,a,l;for(o in t)if(s=e[o],r=t[o],s&&n.test(o))if(\"class\"===o&&(\"string\"==typeof s&&(l=s,e[o]=s={},s[l]=!0),\"string\"==typeof r&&(l=r,t[o]=r={},r[l]=!0)),\"on\"===o||\"nativeOn\"===o||\"hook\"===o)for(a in r)s[a]=i(s[a],r[a]);else if(Array.isArray(s))e[o]=s.concat(r);else if(Array.isArray(r))e[o]=[s].concat(r);else for(a in r)s[a]=r[a];else e[o]=t[o];return e},{})}},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=function(e,t,i){return[e,t*i/((e=(2-t)*i)<1?e:2-e)||0,e/2]},o=function(e){return\"string\"==typeof e&&-1!==e.indexOf(\".\")&&1===parseFloat(e)},a=function(e){return\"string\"==typeof e&&-1!==e.indexOf(\"%\")},l=function(e,t){o(e)&&(e=\"100%\");var i=a(e);return e=Math.min(t,Math.max(0,parseFloat(e))),i&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)},u={10:\"A\",11:\"B\",12:\"C\",13:\"D\",14:\"E\",15:\"F\"},c=function(e){var t=e.r,i=e.g,n=e.b,s=function(e){e=Math.min(Math.round(e),255);var t=Math.floor(e/16),i=e%16;return\"\"+(u[t]||t)+(u[i]||i)};return isNaN(t)||isNaN(i)||isNaN(n)?\"\":\"#\"+s(t)+s(i)+s(n)},d={A:10,B:11,C:12,D:13,E:14,F:15},h=function(e){return 2===e.length?16*(d[e[0].toUpperCase()]||+e[0])+(d[e[1].toUpperCase()]||+e[1]):d[e[1].toUpperCase()]||+e[1]},f=function(e,t,i){t/=100,i/=100;var n=t,s=Math.max(i,.01),r=void 0,o=void 0;return i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s,o=(i+t)/2,r=0===i?2*n/(s+n):2*t/(i+t),{h:e,s:100*r,v:100*o}},p=function(e,t,i){e=l(e,255),t=l(t,255),i=l(i,255);var n=Math.max(e,t,i),s=Math.min(e,t,i),r=void 0,o=void 0,a=n,u=n-s;if(o=0===n?0:u/n,n===s)r=0;else{switch(n){case e:r=(t-i)/u+(t<i?6:0);break;case t:r=(i-e)/u+2;break;case i:r=(e-t)/u+4}r/=6}return{h:360*r,s:100*o,v:100*a}},m=function(e,t,i){e=6*l(e,360),t=l(t,100),i=l(i,100);var n=Math.floor(e),s=e-n,r=i*(1-t),o=i*(1-s*t),a=i*(1-(1-s)*t),u=n%6,c=[i,o,r,r,a,i][u],d=[a,i,i,o,r,r][u],h=[r,r,a,i,i,o][u];return{r:Math.round(255*c),g:Math.round(255*d),b:Math.round(255*h)}},v=function(){function e(t){n(this,e),this._hue=0,this._saturation=100,this._value=100,this._alpha=100,this.enableAlpha=!1,this.format=\"hex\",this.value=\"\",t=t||{};for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i]);this.doOnChange()}return e.prototype.set=function(e,t){if(1!==arguments.length||\"object\"!==(void 0===e?\"undefined\":s(e)))this[\"_\"+e]=t,this.doOnChange();else for(var i in e)e.hasOwnProperty(i)&&this.set(i,e[i])},e.prototype.get=function(e){return this[\"_\"+e]},e.prototype.toRgb=function(){return m(this._hue,this._saturation,this._value)},e.prototype.fromString=function(e){var t=this;if(!e)return this._hue=0,this._saturation=100,this._value=100,void this.doOnChange();var i=function(e,i,n){t._hue=Math.max(0,Math.min(360,e)),t._saturation=Math.max(0,Math.min(100,i)),t._value=Math.max(0,Math.min(100,n)),t.doOnChange()};if(-1!==e.indexOf(\"hsl\")){var n=e.replace(/hsla|hsl|\\(|\\)/gm,\"\").split(/\\s|,/g).filter(function(e){return\"\"!==e}).map(function(e,t){return t>2?parseFloat(e):parseInt(e,10)});if(4===n.length?this._alpha=Math.floor(100*parseFloat(n[3])):3===n.length&&(this._alpha=100),n.length>=3){var s=f(n[0],n[1],n[2]);i(s.h,s.s,s.v)}}else if(-1!==e.indexOf(\"hsv\")){var r=e.replace(/hsva|hsv|\\(|\\)/gm,\"\").split(/\\s|,/g).filter(function(e){return\"\"!==e}).map(function(e,t){return t>2?parseFloat(e):parseInt(e,10)});4===r.length?this._alpha=Math.floor(100*parseFloat(r[3])):3===r.length&&(this._alpha=100),r.length>=3&&i(r[0],r[1],r[2])}else if(-1!==e.indexOf(\"rgb\")){var o=e.replace(/rgba|rgb|\\(|\\)/gm,\"\").split(/\\s|,/g).filter(function(e){return\"\"!==e}).map(function(e,t){return t>2?parseFloat(e):parseInt(e,10)});if(4===o.length?this._alpha=Math.floor(100*parseFloat(o[3])):3===o.length&&(this._alpha=100),o.length>=3){var a=p(o[0],o[1],o[2]),l=a.h,u=a.s,c=a.v;i(l,u,c)}}else if(-1!==e.indexOf(\"#\")){var d=e.replace(\"#\",\"\").trim(),m=void 0,v=void 0,g=void 0;3===d.length?(m=h(d[0]+d[0]),v=h(d[1]+d[1]),g=h(d[2]+d[2])):6!==d.length&&8!==d.length||(m=h(d.substring(0,2)),v=h(d.substring(2,4)),g=h(d.substring(4,6))),8===d.length?this._alpha=Math.floor(h(d.substring(6))/255*100):3!==d.length&&6!==d.length||(this._alpha=100);var b=p(m,v,g),y=b.h,_=b.s,C=b.v;i(y,_,C)}},e.prototype.compare=function(e){return Math.abs(e._hue-this._hue)<2&&Math.abs(e._saturation-this._saturation)<1&&Math.abs(e._value-this._value)<1&&Math.abs(e._alpha-this._alpha)<1},e.prototype.doOnChange=function(){var e=this._hue,t=this._saturation,i=this._value,n=this._alpha,s=this.format;if(this.enableAlpha)switch(s){case\"hsl\":var o=r(e,t/100,i/100);this.value=\"hsla(\"+e+\", \"+Math.round(100*o[1])+\"%, \"+Math.round(100*o[2])+\"%, \"+n/100+\")\";break;case\"hsv\":this.value=\"hsva(\"+e+\", \"+Math.round(t)+\"%, \"+Math.round(i)+\"%, \"+n/100+\")\";break;default:var a=m(e,t,i),l=a.r,u=a.g,d=a.b;this.value=\"rgba(\"+l+\", \"+u+\", \"+d+\", \"+n/100+\")\"}else switch(s){case\"hsl\":var h=r(e,t/100,i/100);this.value=\"hsl(\"+e+\", \"+Math.round(100*h[1])+\"%, \"+Math.round(100*h[2])+\"%)\";break;case\"hsv\":this.value=\"hsv(\"+e+\", \"+Math.round(t)+\"%, \"+Math.round(i)+\"%)\";break;case\"rgb\":var f=m(e,t,i),p=f.r,v=f.g,g=f.b;this.value=\"rgb(\"+p+\", \"+v+\", \"+g+\")\";break;default:this.value=c(m(e,t,i))}},e}();t.default=v},function(e,t,i){e.exports=i(94)},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}var s=i(95),r=n(s),o=i(125),a=n(o),l=i(129),u=n(l),c=i(136),d=n(c),h=i(145),f=n(h),p=i(149),m=n(p),v=i(153),g=n(v),b=i(159),y=n(b),_=i(162),C=n(_),x=i(167),w=n(x),k=i(8),S=n(k),M=i(72),$=n(M),E=i(174),D=n(E),T=i(178),O=n(T),P=i(182),N=n(P),F=i(15),I=n(F),A=i(189),V=n(A),L=i(47),B=n(L),R=i(196),z=n(R),j=i(66),H=n(j),W=i(69),q=n(W),K=i(200),Y=n(K),G=i(19),U=n(G),X=i(70),J=n(X),Z=i(204),Q=n(Z),ee=i(223),te=n(ee),ie=i(225),ne=n(ie),se=i(248),re=n(se),oe=i(253),ae=n(oe),le=i(258),ue=n(le),ce=i(33),de=n(ce),he=i(263),fe=n(he),pe=i(269),me=n(pe),ve=i(273),ge=n(ve),be=i(277),ye=n(be),_e=i(281),Ce=n(_e),xe=i(340),we=n(xe),ke=i(348),Se=n(ke),Me=i(31),$e=n(Me),Ee=i(352),De=n(Ee),Te=i(361),Oe=n(Te),Pe=i(365),Ne=n(Pe),Fe=i(370),Ie=n(Fe),Ae=i(377),Ve=n(Ae),Le=i(382),Be=n(Le),Re=i(386),ze=n(Re),je=i(388),He=n(je),We=i(390),qe=n(We),Ke=i(64),Ye=n(Ke),Ge=i(405),Ue=n(Ge),Xe=i(409),Je=n(Xe),Ze=i(414),Qe=n(Ze),et=i(418),tt=n(et),it=i(422),nt=n(it),st=i(426),rt=n(st),ot=i(430),at=n(ot),lt=i(434),ut=n(lt),ct=i(26),dt=n(ct),ht=i(438),ft=n(ht),pt=i(442),mt=n(pt),vt=i(446),gt=n(vt),bt=i(450),yt=n(bt),_t=i(456),Ct=n(_t),xt=i(475),wt=n(xt),kt=i(482),St=n(kt),Mt=i(486),$t=n(Mt),Et=i(490),Dt=n(Et),Tt=i(494),Ot=n(Tt),Pt=i(498),Nt=n(Pt),Ft=i(17),It=n(Ft),At=i(32),Vt=n(At),Lt=[r.default,a.default,u.default,d.default,f.default,m.default,g.default,y.default,C.default,w.default,S.default,$.default,D.default,O.default,N.default,I.default,V.default,B.default,z.default,H.default,q.default,Y.default,U.default,J.default,Q.default,te.default,ne.default,re.default,ae.default,ue.default,de.default,me.default,ge.default,ye.default,Ce.default,we.default,Se.default,$e.default,De.default,Oe.default,Ie.default,Be.default,ze.default,He.default,qe.default,Ye.default,Ue.default,Qe.default,tt.default,nt.default,rt.default,at.default,ut.default,dt.default,ft.default,mt.default,gt.default,yt.default,Ct.default,wt.default,St.default,$t.default,Dt.default,Ot.default,Nt.default,Vt.default],Bt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};It.default.use(t.locale),It.default.i18n(t.i18n),Lt.forEach(function(t){e.component(t.name,t)}),e.use(Ve.default.directive),e.prototype.$ELEMENT={size:t.size||\"\",zIndex:t.zIndex||2e3},e.prototype.$loading=Ve.default.service,e.prototype.$msgbox=fe.default,e.prototype.$alert=fe.default.alert,e.prototype.$confirm=fe.default.confirm,e.prototype.$prompt=fe.default.prompt,e.prototype.$notify=Ne.default,e.prototype.$message=Je.default};\"undefined\"!=typeof window&&window.Vue&&Bt(window.Vue),e.exports={version:\"2.4.10\",locale:It.default.use,i18n:It.default.i18n,install:Bt,CollapseTransition:Vt.default,Loading:Ve.default,Pagination:r.default,Dialog:a.default,Autocomplete:u.default,Dropdown:d.default,DropdownMenu:f.default,DropdownItem:m.default,Menu:g.default,Submenu:y.default,MenuItem:C.default,MenuItemGroup:w.default,Input:S.default,InputNumber:$.default,Radio:D.default,RadioGroup:O.default,RadioButton:N.default,Checkbox:I.default,CheckboxButton:V.default,CheckboxGroup:B.default,Switch:z.default,Select:H.default,Option:q.default,OptionGroup:Y.default,Button:U.default,ButtonGroup:J.default,Table:Q.default,TableColumn:te.default,DatePicker:ne.default,TimeSelect:re.default,TimePicker:ae.default,Popover:ue.default,Tooltip:de.default,MessageBox:fe.default,Breadcrumb:me.default,BreadcrumbItem:ge.default,Form:ye.default,FormItem:Ce.default,Tabs:we.default,TabPane:Se.default,Tag:$e.default,Tree:De.default,Alert:Oe.default,Notification:Ne.default,Slider:Ie.default,Icon:Be.default,Row:ze.default,Col:He.default,Upload:qe.default,Progress:Ye.default,Spinner:Ue.default,Message:Je.default,Badge:Qe.default,Card:tt.default,Rate:nt.default,Steps:rt.default,Step:at.default,Carousel:ut.default,Scrollbar:dt.default,CarouselItem:ft.default,Collapse:mt.default,CollapseItem:gt.default,Cascader:yt.default,ColorPicker:Ct.default,Transfer:wt.default,Container:St.default,Header:$t.default,Aside:Dt.default,Main:Ot.default,Footer:Nt.default},e.exports.default=e.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(96),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(97),r=n(s),o=i(66),a=n(o),l=i(69),u=n(l),c=i(8),d=n(c),h=i(6),f=n(h),p=i(4);t.default={name:\"ElPagination\",props:{pageSize:{type:Number,default:10},small:Boolean,total:Number,pageCount:Number,pagerCount:{type:Number,validator:function(e){return(0|e)===e&&e>4&&e<22&&e%2==1},default:7},currentPage:{type:Number,default:1},layout:{default:\"prev, pager, next, jumper, ->, total\"},pageSizes:{type:Array,default:function(){return[10,20,30,40,50,100]}},popperClass:String,prevText:String,nextText:String,background:Boolean,disabled:Boolean},data:function(){return{internalCurrentPage:1,internalPageSize:0,lastEmittedPage:-1,userChangePageSize:!1}},render:function(e){var t=e(\"div\",{class:[\"el-pagination\",{\"is-background\":this.background,\"el-pagination--small\":this.small}]},[]),i=this.layout||\"\";if(i){var n={prev:e(\"prev\",null,[]),jumper:e(\"jumper\",null,[]),pager:e(\"pager\",{attrs:{currentPage:this.internalCurrentPage,pageCount:this.internalPageCount,pagerCount:this.pagerCount,disabled:this.disabled},on:{change:this.handleCurrentChange}},[]),next:e(\"next\",null,[]),sizes:e(\"sizes\",{attrs:{pageSizes:this.pageSizes}},[]),slot:e(\"my-slot\",null,[]),total:e(\"total\",null,[])},s=i.split(\",\").map(function(e){return e.trim()}),r=e(\"div\",{class:\"el-pagination__rightwrapper\"},[]),o=!1;return t.children=t.children||[],r.children=r.children||[],s.forEach(function(e){if(\"->\"===e)return void(o=!0);o?r.children.push(n[e]):t.children.push(n[e])}),o&&t.children.unshift(r),t}},components:{MySlot:{render:function(e){return this.$parent.$slots.default?this.$parent.$slots.default[0]:\"\"}},Prev:{render:function(e){return e(\"button\",{attrs:{type:\"button\",disabled:this.$parent.disabled||this.$parent.internalCurrentPage<=1},class:\"btn-prev\",on:{click:this.$parent.prev}},[this.$parent.prevText?e(\"span\",null,[this.$parent.prevText]):e(\"i\",{class:\"el-icon el-icon-arrow-left\"},[])])}},Next:{render:function(e){return e(\"button\",{attrs:{type:\"button\",disabled:this.$parent.disabled||this.$parent.internalCurrentPage===this.$parent.internalPageCount||0===this.$parent.internalPageCount},class:\"btn-next\",on:{click:this.$parent.next}},[this.$parent.nextText?e(\"span\",null,[this.$parent.nextText]):e(\"i\",{class:\"el-icon el-icon-arrow-right\"},[])])}},Sizes:{mixins:[f.default],props:{pageSizes:Array},watch:{pageSizes:{immediate:!0,handler:function(e,t){(0,p.valueEquals)(e,t)||Array.isArray(e)&&(this.$parent.internalPageSize=e.indexOf(this.$parent.pageSize)>-1?this.$parent.pageSize:this.pageSizes[0])}}},render:function(e){var t=this;return e(\"span\",{class:\"el-pagination__sizes\"},[e(\"el-select\",{attrs:{value:this.$parent.internalPageSize,popperClass:this.$parent.popperClass||\"\",size:\"mini\",disabled:this.$parent.disabled},on:{input:this.handleChange}},[this.pageSizes.map(function(i){return e(\"el-option\",{attrs:{value:i,label:i+t.t(\"el.pagination.pagesize\")}},[])})])])},components:{ElSelect:a.default,ElOption:u.default},methods:{handleChange:function(e){e!==this.$parent.internalPageSize&&(this.$parent.internalPageSize=e=parseInt(e,10),this.$parent.userChangePageSize=!0,this.$parent.$emit(\"update:pageSize\",e),this.$parent.$emit(\"size-change\",e))}}},Jumper:{mixins:[f.default],data:function(){return{oldValue:null}},components:{ElInput:d.default},watch:{\"$parent.internalPageSize\":function(){var e=this;this.$nextTick(function(){e.$refs.input.$el.querySelector(\"input\").value=e.$parent.internalCurrentPage})}},methods:{handleFocus:function(e){this.oldValue=e.target.value},handleBlur:function(e){var t=e.target;this.resetValueIfNeed(t.value),this.reassignMaxValue(t.value)},handleKeyup:function(e){var t=e.keyCode,i=e.target;13===t&&this.oldValue&&i.value!==this.oldValue&&this.handleChange(i.value)},handleChange:function(e){this.$parent.internalCurrentPage=this.$parent.getValidCurrentPage(e),this.$parent.emitChange(),this.oldValue=null,this.resetValueIfNeed(e)},resetValueIfNeed:function(e){var t=parseInt(e,10);isNaN(t)||(t<1?this.$refs.input.setCurrentValue(1):this.reassignMaxValue(e))},reassignMaxValue:function(e){var t=this.$parent.internalPageCount;+e>t&&this.$refs.input.setCurrentValue(t||1)}},render:function(e){return e(\"span\",{class:\"el-pagination__jump\"},[this.t(\"el.pagination.goto\"),e(\"el-input\",{class:\"el-pagination__editor is-in-pagination\",attrs:{min:1,max:this.$parent.internalPageCount,value:this.$parent.internalCurrentPage,type:\"number\",disabled:this.$parent.disabled},domProps:{value:this.$parent.internalCurrentPage},ref:\"input\",nativeOn:{keyup:this.handleKeyup},on:{change:this.handleChange,focus:this.handleFocus,blur:this.handleBlur}},[]),this.t(\"el.pagination.pageClassifier\")])}},Total:{mixins:[f.default],render:function(e){return\"number\"==typeof this.$parent.total?e(\"span\",{class:\"el-pagination__total\"},[this.t(\"el.pagination.total\",{total:this.$parent.total})]):\"\"}},Pager:r.default},methods:{handleCurrentChange:function(e){this.internalCurrentPage=this.getValidCurrentPage(e),this.userChangePageSize=!0,this.emitChange()},prev:function(){if(!this.disabled){var e=this.internalCurrentPage-1;this.internalCurrentPage=this.getValidCurrentPage(e),this.$emit(\"prev-click\",this.internalCurrentPage),this.emitChange()}},next:function(){if(!this.disabled){var e=this.internalCurrentPage+1;this.internalCurrentPage=this.getValidCurrentPage(e),this.$emit(\"next-click\",this.internalCurrentPage),this.emitChange()}},getValidCurrentPage:function(e){e=parseInt(e,10);var t=\"number\"==typeof this.internalPageCount,i=void 0;return t?e<1?i=1:e>this.internalPageCount&&(i=this.internalPageCount):(isNaN(e)||e<1)&&(i=1),void 0===i&&isNaN(e)?i=1:0===i&&(i=1),void 0===i?e:i},emitChange:function(){var e=this;this.$nextTick(function(){(e.internalCurrentPage!==e.lastEmittedPage||e.userChangePageSize)&&(e.$emit(\"current-change\",e.internalCurrentPage),e.lastEmittedPage=e.internalCurrentPage,e.userChangePageSize=!1)})}},computed:{internalPageCount:function(){return\"number\"==typeof this.total?Math.ceil(this.total/this.internalPageSize):\"number\"==typeof this.pageCount?this.pageCount:null}},watch:{currentPage:{immediate:!0,handler:function(e){this.internalCurrentPage=e}},pageSize:{immediate:!0,handler:function(e){this.internalPageSize=isNaN(e)?10:e}},internalCurrentPage:{immediate:!0,handler:function(e,t){e=parseInt(e,10),e=isNaN(e)?t||1:this.getValidCurrentPage(e),void 0!==e?(this.internalCurrentPage=e,t!==e&&this.$emit(\"update:currentPage\",e)):this.$emit(\"update:currentPage\",e),this.lastEmittedPage=-1}},internalPageCount:function(e){var t=this.internalCurrentPage;e>0&&0===t?this.internalCurrentPage=1:t>e&&(this.internalCurrentPage=0===e?1:e,this.userChangePageSize&&this.emitChange()),this.userChangePageSize=!1}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(98),s=i.n(n),r=i(99),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElPager\",props:{currentPage:Number,pageCount:Number,pagerCount:Number,disabled:Boolean},watch:{showPrevMore:function(e){e||(this.quickprevIconClass=\"el-icon-more\")},showNextMore:function(e){e||(this.quicknextIconClass=\"el-icon-more\")}},methods:{onPagerClick:function(e){var t=e.target;if(\"UL\"!==t.tagName&&!this.disabled){var i=Number(e.target.textContent),n=this.pageCount,s=this.currentPage,r=this.pagerCount-2;-1!==t.className.indexOf(\"more\")&&(-1!==t.className.indexOf(\"quickprev\")?i=s-r:-1!==t.className.indexOf(\"quicknext\")&&(i=s+r)),isNaN(i)||(i<1&&(i=1),i>n&&(i=n)),i!==s&&this.$emit(\"change\",i)}},onMouseenter:function(e){this.disabled||(\"left\"===e?this.quickprevIconClass=\"el-icon-d-arrow-left\":this.quicknextIconClass=\"el-icon-d-arrow-right\")}},computed:{pagers:function(){var e=this.pagerCount,t=(e-1)/2,i=Number(this.currentPage),n=Number(this.pageCount),s=!1,r=!1;n>e&&(i>e-t&&(s=!0),i<n-t&&(r=!0));var o=[];if(s&&!r)for(var a=n-(e-2),l=a;l<n;l++)o.push(l);else if(!s&&r)for(var u=2;u<e;u++)o.push(u);else if(s&&r)for(var c=Math.floor(e/2)-1,d=i-c;d<=i+c;d++)o.push(d);else for(var h=2;h<n;h++)o.push(h);return this.showPrevMore=s,this.showNextMore=r,o}},data:function(){return{current:null,showPrevMore:!1,showNextMore:!1,quicknextIconClass:\"el-icon-more\",quickprevIconClass:\"el-icon-more\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"ul\",{staticClass:\"el-pager\",on:{click:e.onPagerClick}},[e.pageCount>0?i(\"li\",{staticClass:\"number\",class:{active:1===e.currentPage,disabled:e.disabled}},[e._v(\"1\")]):e._e(),e.showPrevMore?i(\"li\",{staticClass:\"el-icon more btn-quickprev\",class:[e.quickprevIconClass,{disabled:e.disabled}],on:{mouseenter:function(t){e.onMouseenter(\"left\")},mouseleave:function(t){e.quickprevIconClass=\"el-icon-more\"}}}):e._e(),e._l(e.pagers,function(t){return i(\"li\",{key:t,staticClass:\"number\",class:{active:e.currentPage===t,disabled:e.disabled}},[e._v(e._s(t))])}),e.showNextMore?i(\"li\",{staticClass:\"el-icon more btn-quicknext\",class:[e.quicknextIconClass,{disabled:e.disabled}],on:{mouseenter:function(t){e.onMouseenter(\"right\")},mouseleave:function(t){e.quicknextIconClass=\"el-icon-more\"}}}):e._e(),e.pageCount>1?i(\"li\",{staticClass:\"number\",class:{active:e.currentPage===e.pageCount,disabled:e.disabled}},[e._v(e._s(e.pageCount))]):e._e()],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(101),s=i.n(n),r=i(124),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=i(1),o=n(r),a=i(30),l=n(a),u=i(6),c=n(u),d=i(8),h=n(d),f=i(109),p=n(f),m=i(67),v=n(m),g=i(31),b=n(g),y=i(26),_=n(y),C=i(18),x=n(C),w=i(12),k=n(w),S=i(27),M=i(17),$=i(45),E=n($),D=i(4),T=i(123),O=n(T),P=i(43);t.default={mixins:[o.default,c.default,(0,l.default)(\"reference\"),O.default],name:\"ElSelect\",componentName:\"ElSelect\",inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},provide:function(){return{select:this}},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},readonly:function(){return!this.filterable||this.multiple||!(0,D.isIE)()&&!(0,D.isEdge)()&&!this.visible},showClose:function(){var e=this.multiple?Array.isArray(this.value)&&this.value.length>0:void 0!==this.value&&null!==this.value&&\"\"!==this.value;return this.clearable&&!this.selectDisabled&&this.inputHovering&&e},iconClass:function(){return this.remote&&this.filterable?\"\":this.visible?\"arrow-up is-reverse\":\"arrow-up\"},debounce:function(){return this.remote?300:0},emptyText:function(){return this.loading?this.loadingText||this.t(\"el.select.loading\"):(!this.remote||\"\"!==this.query||0!==this.options.length)&&(this.filterable&&this.query&&this.options.length>0&&0===this.filteredOptionsCount?this.noMatchText||this.t(\"el.select.noMatch\"):0===this.options.length?this.noDataText||this.t(\"el.select.noData\"):null)},showNewOption:function(){var e=this,t=this.options.filter(function(e){return!e.created}).some(function(t){return t.currentLabel===e.query});return this.filterable&&this.allowCreate&&\"\"!==this.query&&!t},selectSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},selectDisabled:function(){return this.disabled||(this.elForm||{}).disabled},collapseTagSize:function(){return[\"small\",\"mini\"].indexOf(this.selectSize)>-1?\"mini\":\"small\"}},components:{ElInput:h.default,ElSelectMenu:p.default,ElOption:v.default,ElTag:b.default,ElScrollbar:_.default},directives:{Clickoutside:k.default},props:{name:String,id:String,value:{required:!0},autocomplete:{type:String,default:\"off\"},autoComplete:{type:String,validator:function(e){return!0}},automaticDropdown:Boolean,size:String,disabled:Boolean,clearable:Boolean,filterable:Boolean,allowCreate:Boolean,loading:Boolean,popperClass:String,remote:Boolean,loadingText:String,noMatchText:String,noDataText:String,remoteMethod:Function,filterMethod:Function,multiple:Boolean,multipleLimit:{type:Number,default:0},placeholder:{type:String,default:function(){return(0,M.t)(\"el.select.placeholder\")}},defaultFirstOption:Boolean,reserveKeyword:Boolean,valueKey:{type:String,default:\"value\"},collapseTags:Boolean,popperAppendToBody:{type:Boolean,default:!0}},data:function(){return{options:[],cachedOptions:[],createdLabel:null,createdSelected:!1,selected:this.multiple?[]:{},inputLength:20,inputWidth:0,initialInputHeight:0,cachedPlaceHolder:\"\",optionsCount:0,filteredOptionsCount:0,visible:!1,softFocus:!1,selectedLabel:\"\",hoverIndex:-1,query:\"\",previousQuery:null,inputHovering:!1,currentPlaceholder:\"\",menuVisibleOnFocus:!1,isOnComposition:!1,isSilentBlur:!1}},watch:{selectDisabled:function(){var e=this;this.$nextTick(function(){e.resetInputHeight()})},placeholder:function(e){this.cachedPlaceHolder=this.currentPlaceholder=e},value:function(e,t){this.multiple&&(this.resetInputHeight(),e.length>0||this.$refs.input&&\"\"!==this.query?this.currentPlaceholder=\"\":this.currentPlaceholder=this.cachedPlaceHolder,this.filterable&&!this.reserveKeyword&&(this.query=\"\",this.handleQueryChange(this.query))),this.setSelected(),this.filterable&&!this.multiple&&(this.inputLength=20),(0,D.valueEquals)(e,t)||this.dispatch(\"ElFormItem\",\"el.form.change\",e)},visible:function(e){var t=this;e?(this.broadcast(\"ElSelectDropdown\",\"updatePopper\"),this.filterable&&(this.query=this.remote?\"\":this.selectedLabel,this.handleQueryChange(this.query),this.multiple?this.$refs.input.focus():(this.remote||(this.broadcast(\"ElOption\",\"queryChange\",\"\"),this.broadcast(\"ElOptionGroup\",\"queryChange\")),this.broadcast(\"ElInput\",\"inputSelect\")))):(this.broadcast(\"ElSelectDropdown\",\"destroyPopper\"),this.$refs.input&&this.$refs.input.blur(),this.query=\"\",this.previousQuery=null,this.selectedLabel=\"\",this.inputLength=20,this.menuVisibleOnFocus=!1,this.resetHoverIndex(),this.$nextTick(function(){t.$refs.input&&\"\"===t.$refs.input.value&&0===t.selected.length&&(t.currentPlaceholder=t.cachedPlaceHolder)}),this.multiple||this.selected&&(this.filterable&&this.allowCreate&&this.createdSelected&&this.createdLabel?this.selectedLabel=this.createdLabel:this.selectedLabel=this.selected.currentLabel,this.filterable&&(this.query=this.selectedLabel))),this.$emit(\"visible-change\",e)},options:function(){var e=this;if(!this.$isServer){this.$nextTick(function(){e.broadcast(\"ElSelectDropdown\",\"updatePopper\")}),this.multiple&&this.resetInputHeight();var t=this.$el.querySelectorAll(\"input\");-1===[].indexOf.call(t,document.activeElement)&&this.setSelected(),this.defaultFirstOption&&(this.filterable||this.remote)&&this.filteredOptionsCount&&this.checkDefaultFirstOption()}}},methods:{handleComposition:function(e){var t=e.target.value;if(\"compositionend\"===e.type)this.isOnComposition=!1,this.handleQueryChange(t);else{var i=t[t.length-1]||\"\";this.isOnComposition=!(0,P.isKorean)(i)}},handleQueryChange:function(e){var t=this;if(this.previousQuery!==e&&!this.isOnComposition){if(null===this.previousQuery&&(\"function\"==typeof this.filterMethod||\"function\"==typeof this.remoteMethod))return void(this.previousQuery=e);if(this.previousQuery=e,this.$nextTick(function(){t.visible&&t.broadcast(\"ElSelectDropdown\",\"updatePopper\")}),this.hoverIndex=-1,this.multiple&&this.filterable){var i=15*this.$refs.input.value.length+20;this.inputLength=this.collapseTags?Math.min(50,i):i,this.managePlaceholder(),this.resetInputHeight()}this.remote&&\"function\"==typeof this.remoteMethod?(this.hoverIndex=-1,this.remoteMethod(e)):\"function\"==typeof this.filterMethod?(this.filterMethod(e),this.broadcast(\"ElOptionGroup\",\"queryChange\")):(this.filteredOptionsCount=this.optionsCount,this.broadcast(\"ElOption\",\"queryChange\",e),this.broadcast(\"ElOptionGroup\",\"queryChange\")),this.defaultFirstOption&&(this.filterable||this.remote)&&this.filteredOptionsCount&&this.checkDefaultFirstOption()}},scrollToOption:function(e){var t=Array.isArray(e)&&e[0]?e[0].$el:e.$el;if(this.$refs.popper&&t){var i=this.$refs.popper.$el.querySelector(\".el-select-dropdown__wrap\");(0,E.default)(i,t)}this.$refs.scrollbar&&this.$refs.scrollbar.handleScroll()},handleMenuEnter:function(){var e=this;this.$nextTick(function(){return e.scrollToOption(e.selected)})},emitChange:function(e){(0,D.valueEquals)(this.value,e)||this.$emit(\"change\",e)},getOption:function(e){for(var t=void 0,i=\"[object object]\"===Object.prototype.toString.call(e).toLowerCase(),n=\"[object null]\"===Object.prototype.toString.call(e).toLowerCase(),s=this.cachedOptions.length-1;s>=0;s--){var r=this.cachedOptions[s];if(i?(0,D.getValueByPath)(r.value,this.valueKey)===(0,D.getValueByPath)(e,this.valueKey):r.value===e){t=r;break}}if(t)return t;var o=i||n?\"\":e,a={value:e,currentLabel:o};return this.multiple&&(a.hitState=!1),a},setSelected:function(){var e=this;if(!this.multiple){var t=this.getOption(this.value);return t.created?(this.createdLabel=t.currentLabel,this.createdSelected=!0):this.createdSelected=!1,this.selectedLabel=t.currentLabel,this.selected=t,void(this.filterable&&(this.query=this.selectedLabel))}var i=[];Array.isArray(this.value)&&this.value.forEach(function(t){i.push(e.getOption(t))}),this.selected=i,this.$nextTick(function(){e.resetInputHeight()})},handleFocus:function(e){this.softFocus?this.softFocus=!1:((this.automaticDropdown||this.filterable)&&(this.visible=!0,this.menuVisibleOnFocus=!0),this.$emit(\"focus\",e))},blur:function(){this.visible=!1,this.$refs.reference.blur()},handleBlur:function(e){var t=this;setTimeout(function(){t.isSilentBlur?t.isSilentBlur=!1:t.$emit(\"blur\",e)},50),this.softFocus=!1},handleClearClick:function(e){this.deleteSelected(e)},doDestroy:function(){this.$refs.popper&&this.$refs.popper.doDestroy()},handleClose:function(){this.visible=!1},toggleLastOptionHitState:function(e){if(Array.isArray(this.selected)){var t=this.selected[this.selected.length-1];if(t)return!0===e||!1===e?(t.hitState=e,e):(t.hitState=!t.hitState,t.hitState)}},deletePrevTag:function(e){if(e.target.value.length<=0&&!this.toggleLastOptionHitState()){var t=this.value.slice();t.pop(),this.$emit(\"input\",t),this.emitChange(t)}},managePlaceholder:function(){\"\"!==this.currentPlaceholder&&(this.currentPlaceholder=this.$refs.input.value?\"\":this.cachedPlaceHolder)},resetInputState:function(e){8!==e.keyCode&&this.toggleLastOptionHitState(!1),this.inputLength=15*this.$refs.input.value.length+20,this.resetInputHeight()},resetInputHeight:function(){var e=this;this.collapseTags&&!this.filterable||this.$nextTick(function(){if(e.$refs.reference){var t=e.$refs.reference.$el.childNodes,i=[].filter.call(t,function(e){return\"INPUT\"===e.tagName})[0],n=e.$refs.tags,s=e.initialInputHeight||40;i.style.height=0===e.selected.length?s+\"px\":Math.max(n?n.clientHeight+(n.clientHeight>s?6:0):0,s)+\"px\",e.visible&&!1!==e.emptyText&&e.broadcast(\"ElSelectDropdown\",\"updatePopper\")}})},resetHoverIndex:function(){var e=this;setTimeout(function(){e.multiple?e.selected.length>0?e.hoverIndex=Math.min.apply(null,e.selected.map(function(t){return e.options.indexOf(t)})):e.hoverIndex=-1:e.hoverIndex=e.options.indexOf(e.selected)},300)},handleOptionSelect:function(e,t){var i=this;if(this.multiple){var n=this.value.slice(),s=this.getValueIndex(n,e.value);s>-1?n.splice(s,1):(this.multipleLimit<=0||n.length<this.multipleLimit)&&n.push(e.value),this.$emit(\"input\",n),this.emitChange(n),e.created&&(this.query=\"\",this.handleQueryChange(\"\"),this.inputLength=20),this.filterable&&this.$refs.input.focus()}else this.$emit(\"input\",e.value),this.emitChange(e.value),this.visible=!1;this.isSilentBlur=t,this.setSoftFocus(),this.visible||this.$nextTick(function(){i.scrollToOption(e)})},setSoftFocus:function(){this.softFocus=!0;var e=this.$refs.input||this.$refs.reference;e&&e.focus()},getValueIndex:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=arguments[1];if(\"[object object]\"!==Object.prototype.toString.call(i).toLowerCase())return t.indexOf(i);var n=function(){var n=e.valueKey,s=-1;return t.some(function(e,t){return(0,D.getValueByPath)(e,n)===(0,D.getValueByPath)(i,n)&&(s=t,!0)}),{v:s}}();return\"object\"===(void 0===n?\"undefined\":s(n))?n.v:void 0},toggleMenu:function(){this.selectDisabled||(this.menuVisibleOnFocus?this.menuVisibleOnFocus=!1:this.visible=!this.visible,this.visible&&(this.$refs.input||this.$refs.reference).focus())},selectOption:function(){this.visible?this.options[this.hoverIndex]&&this.handleOptionSelect(this.options[this.hoverIndex]):this.toggleMenu()},deleteSelected:function(e){e.stopPropagation();var t=this.multiple?[]:\"\";this.$emit(\"input\",t),this.emitChange(t),this.visible=!1,this.$emit(\"clear\")},deleteTag:function(e,t){var i=this.selected.indexOf(t);if(i>-1&&!this.selectDisabled){var n=this.value.slice();n.splice(i,1),this.$emit(\"input\",n),this.emitChange(n),this.$emit(\"remove-tag\",t.value)}e.stopPropagation()},onInputChange:function(){this.filterable&&this.query!==this.selectedLabel&&(this.query=this.selectedLabel,this.handleQueryChange(this.query))},onOptionDestroy:function(e){e>-1&&(this.optionsCount--,this.filteredOptionsCount--,this.options.splice(e,1))},resetInputWidth:function(){this.inputWidth=this.$refs.reference.$el.getBoundingClientRect().width},handleResize:function(){this.resetInputWidth(),this.multiple&&this.resetInputHeight()},checkDefaultFirstOption:function(){this.hoverIndex=-1;for(var e=!1,t=this.options.length-1;t>=0;t--)if(this.options[t].created){e=!0,this.hoverIndex=t;break}if(!e)for(var i=0;i!==this.options.length;++i){var n=this.options[i];if(this.query){if(!n.disabled&&!n.groupDisabled&&n.visible){this.hoverIndex=i;break}}else if(n.itemSelected){this.hoverIndex=i;break}}},getValueKey:function(e){return\"[object object]\"!==Object.prototype.toString.call(e.value).toLowerCase()?e.value:(0,D.getValueByPath)(e.value,this.valueKey)}},created:function(){var e=this;this.cachedPlaceHolder=this.currentPlaceholder=this.placeholder,this.multiple&&!Array.isArray(this.value)&&this.$emit(\"input\",[]),!this.multiple&&Array.isArray(this.value)&&this.$emit(\"input\",\"\"),this.debouncedOnInputChange=(0,x.default)(this.debounce,function(){e.onInputChange()}),this.debouncedQueryChange=(0,x.default)(this.debounce,function(t){e.handleQueryChange(t.target.value)}),this.$on(\"handleOptionClick\",this.handleOptionSelect),this.$on(\"setSelected\",this.setSelected)},mounted:function(){var e=this;this.multiple&&Array.isArray(this.value)&&this.value.length>0&&(this.currentPlaceholder=\"\"),(0,S.addResizeListener)(this.$el,this.handleResize);var t=this.$refs.reference;if(t&&t.$el){var i={medium:36,small:32,mini:28};this.initialInputHeight=t.$el.getBoundingClientRect().height||i[this.selectSize]}this.remote&&this.multiple&&this.resetInputHeight(),this.$nextTick(function(){t&&t.$el&&(e.inputWidth=t.$el.getBoundingClientRect().width)}),this.setSelected()},beforeDestroy:function(){this.$el&&this.handleResize&&(0,S.removeResizeListener)(this.$el,this.handleResize)}}},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={el:{colorpicker:{confirm:\"确定\",clear:\"清空\"},datepicker:{now:\"此刻\",today:\"今天\",cancel:\"取消\",clear:\"清空\",confirm:\"确定\",selectDate:\"选择日期\",selectTime:\"选择时间\",startDate:\"开始日期\",startTime:\"开始时间\",endDate:\"结束日期\",endTime:\"结束时间\",prevYear:\"前一年\",nextYear:\"后一年\",prevMonth:\"上个月\",nextMonth:\"下个月\",year:\"年\",month1:\"1 月\",month2:\"2 月\",month3:\"3 月\",month4:\"4 月\",month5:\"5 月\",month6:\"6 月\",month7:\"7 月\",month8:\"8 月\",month9:\"9 月\",month10:\"10 月\",month11:\"11 月\",month12:\"12 月\",weeks:{sun:\"日\",mon:\"一\",tue:\"二\",wed:\"三\",thu:\"四\",fri:\"五\",sat:\"六\"},months:{jan:\"一月\",feb:\"二月\",mar:\"三月\",apr:\"四月\",may:\"五月\",jun:\"六月\",jul:\"七月\",aug:\"八月\",sep:\"九月\",oct:\"十月\",nov:\"十一月\",dec:\"十二月\"}},select:{loading:\"加载中\",noMatch:\"无匹配数据\",noData:\"无数据\",placeholder:\"请选择\"},cascader:{noMatch:\"无匹配数据\",loading:\"加载中\",placeholder:\"请选择\"},pagination:{goto:\"前往\",pagesize:\"条/页\",total:\"共 {total} 条\",pageClassifier:\"页\"},messagebox:{title:\"提示\",confirm:\"确定\",cancel:\"取消\",error:\"输入的数据不合法!\"},upload:{deleteTip:\"按 delete 键可删除\",delete:\"删除\",preview:\"查看图片\",continue:\"继续上传\"},table:{emptyText:\"暂无数据\",confirmFilter:\"筛选\",resetFilter:\"重置\",clearFilter:\"全部\",sumText:\"合计\"},tree:{emptyText:\"暂无数据\"},transfer:{noMatch:\"无匹配数据\",noData:\"无数据\",titles:[\"列表 1\",\"列表 2\"],filterPlaceholder:\"请输入搜索内容\",noCheckedFormat:\"共 {total} 项\",hasCheckedFormat:\"已选 {checked}/{total} 项\"}}}},function(e,t,i){var n,s;!function(r,o){n=o,void 0!==(s=\"function\"==typeof n?n.call(t,i,t,e):n)&&(e.exports=s)}(0,function(){function e(e){return e&&\"object\"==typeof e&&\"[object RegExp]\"!==Object.prototype.toString.call(e)&&\"[object Date]\"!==Object.prototype.toString.call(e)}function t(e){return Array.isArray(e)?[]:{}}function i(i,n){return n&&!0===n.clone&&e(i)?r(t(i),i,n):i}function n(t,n,s){var o=t.slice();return n.forEach(function(n,a){void 0===o[a]?o[a]=i(n,s):e(n)?o[a]=r(t[a],n,s):-1===t.indexOf(n)&&o.push(i(n,s))}),o}function s(t,n,s){var o={};return e(t)&&Object.keys(t).forEach(function(e){o[e]=i(t[e],s)}),Object.keys(n).forEach(function(a){e(n[a])&&t[a]?o[a]=r(t[a],n[a],s):o[a]=i(n[a],s)}),o}function r(e,t,r){var o=Array.isArray(t),a=r||{arrayMerge:n},l=a.arrayMerge||n;return o?Array.isArray(e)?l(e,t,r):i(t,r):s(e,t,r)}return r.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error(\"first argument should be an array with at least two elements\");return e.reduce(function(e,i){return r(e,i,t)})},r})},function(e,t,i){\"use strict\";t.__esModule=!0;var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};t.default=function(e){function t(e){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return 1===i.length&&\"object\"===n(i[0])&&(i=i[0]),i&&i.hasOwnProperty||(i={}),e.replace(r,function(t,n,r,o){var a=void 0;return\"{\"===e[o-1]&&\"}\"===e[o+t.length]?r:(a=(0,s.hasOwn)(i,r)?i[r]:null,null===a||void 0===a?\"\":a)})}return t};var s=i(4),r=/(%|)\\{([0-9a-zA-Z_]+)\\}/g},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(106),s=i.n(n),r=i(108),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(1),r=n(s),o=i(9),a=n(o),l=i(107),u=n(l),c=i(10),d=n(c),h=i(43);t.default={name:\"ElInput\",componentName:\"ElInput\",mixins:[r.default,a.default],inheritAttrs:!1,inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},data:function(){return{currentValue:void 0===this.value||null===this.value?\"\":this.value,textareaCalcStyle:{},hovering:!1,focused:!1,isOnComposition:!1,valueBeforeComposition:null}},props:{value:[String,Number],size:String,resize:String,form:String,disabled:Boolean,readonly:Boolean,type:{type:String,default:\"text\"},autosize:{type:[Boolean,Object],default:!1},autocomplete:{type:String,default:\"off\"},autoComplete:{type:String,validator:function(e){return!0}},validateEvent:{type:Boolean,default:!0},suffixIcon:String,prefixIcon:String,label:String,clearable:{type:Boolean,default:!1},tabindex:String},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},validateState:function(){return this.elFormItem?this.elFormItem.validateState:\"\"},needStatusIcon:function(){return!!this.elForm&&this.elForm.statusIcon},validateIcon:function(){return{validating:\"el-icon-loading\",success:\"el-icon-circle-check\",error:\"el-icon-circle-close\"}[this.validateState]},textareaStyle:function(){return(0,d.default)({},this.textareaCalcStyle,{resize:this.resize})},inputSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},inputDisabled:function(){return this.disabled||(this.elForm||{}).disabled},showClear:function(){return this.clearable&&!this.inputDisabled&&!this.readonly&&\"\"!==this.currentValue&&(this.focused||this.hovering)}},watch:{value:function(e,t){this.setCurrentValue(e)}},methods:{focus:function(){(this.$refs.input||this.$refs.textarea).focus()},blur:function(){(this.$refs.input||this.$refs.textarea).blur()},getMigratingConfig:function(){return{props:{icon:\"icon is removed, use suffix-icon / prefix-icon instead.\",\"on-icon-click\":\"on-icon-click is removed.\"},events:{click:\"click is removed.\"}}},handleBlur:function(e){this.focused=!1,this.$emit(\"blur\",e),this.validateEvent&&this.dispatch(\"ElFormItem\",\"el.form.blur\",[this.currentValue])},select:function(){(this.$refs.input||this.$refs.textarea).select()},resizeTextarea:function(){if(!this.$isServer){var e=this.autosize;if(\"textarea\"===this.type){if(!e)return void(this.textareaCalcStyle={minHeight:(0,u.default)(this.$refs.textarea).minHeight});var t=e.minRows,i=e.maxRows;this.textareaCalcStyle=(0,u.default)(this.$refs.textarea,t,i)}}},handleFocus:function(e){this.focused=!0,this.$emit(\"focus\",e)},handleComposition:function(e){if(\"compositionend\"===e.type)this.isOnComposition=!1,this.currentValue=this.valueBeforeComposition,this.valueBeforeComposition=null,this.handleInput(e);else{var t=e.target.value,i=t[t.length-1]||\"\";this.isOnComposition=!(0,h.isKorean)(i),this.isOnComposition&&\"compositionstart\"===e.type&&(this.valueBeforeComposition=t)}},handleInput:function(e){var t=e.target.value;this.setCurrentValue(t),this.isOnComposition||this.$emit(\"input\",t)},handleChange:function(e){this.$emit(\"change\",e.target.value)},setCurrentValue:function(e){this.isOnComposition&&e===this.valueBeforeComposition||(this.currentValue=e,this.isOnComposition||(this.$nextTick(this.resizeTextarea),this.validateEvent&&this.currentValue===this.value&&this.dispatch(\"ElFormItem\",\"el.form.change\",[e])))},calcIconOffset:function(e){var t=[].slice.call(this.$el.querySelectorAll(\".el-input__\"+e)||[]);if(t.length){for(var i=null,n=0;n<t.length;n++)if(t[n].parentNode===this.$el){i=t[n];break}if(i){var s={suffix:\"append\",prefix:\"prepend\"},r=s[e];this.$slots[r]?i.style.transform=\"translateX(\"+(\"suffix\"===e?\"-\":\"\")+this.$el.querySelector(\".el-input-group__\"+r).offsetWidth+\"px)\":i.removeAttribute(\"style\")}}},updateIconOffset:function(){this.calcIconOffset(\"prefix\"),this.calcIconOffset(\"suffix\")},clear:function(){this.$emit(\"input\",\"\"),this.$emit(\"change\",\"\"),this.$emit(\"clear\"),this.setCurrentValue(\"\")}},created:function(){this.$on(\"inputSelect\",this.select)},mounted:function(){this.resizeTextarea(),this.updateIconOffset()},updated:function(){this.$nextTick(this.updateIconOffset)}}},function(e,t,i){\"use strict\";function n(e){var t=window.getComputedStyle(e),i=t.getPropertyValue(\"box-sizing\"),n=parseFloat(t.getPropertyValue(\"padding-bottom\"))+parseFloat(t.getPropertyValue(\"padding-top\")),s=parseFloat(t.getPropertyValue(\"border-bottom-width\"))+parseFloat(t.getPropertyValue(\"border-top-width\"));return{contextStyle:a.map(function(e){return e+\":\"+t.getPropertyValue(e)}).join(\";\"),paddingSize:n,borderSize:s,boxSizing:i}}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;r||(r=document.createElement(\"textarea\"),document.body.appendChild(r));var s=n(e),a=s.paddingSize,l=s.borderSize,u=s.boxSizing,c=s.contextStyle;r.setAttribute(\"style\",c+\";\"+o),r.value=e.value||e.placeholder||\"\";var d=r.scrollHeight,h={};\"border-box\"===u?d+=l:\"content-box\"===u&&(d-=a),r.value=\"\";var f=r.scrollHeight-a;if(null!==t){var p=f*t;\"border-box\"===u&&(p=p+a+l),d=Math.max(p,d),h.minHeight=p+\"px\"}if(null!==i){var m=f*i;\"border-box\"===u&&(m=m+a+l),d=Math.min(m,d)}return h.height=d+\"px\",r.parentNode&&r.parentNode.removeChild(r),r=null,h}t.__esModule=!0,t.default=s;var r=void 0,o=\"\\n  height:0 !important;\\n  visibility:hidden !important;\\n  overflow:hidden !important;\\n  position:absolute !important;\\n  z-index:-1000 !important;\\n  top:0 !important;\\n  right:0 !important\\n\",a=[\"letter-spacing\",\"line-height\",\"padding-top\",\"padding-bottom\",\"font-family\",\"font-weight\",\"font-size\",\"text-rendering\",\"text-transform\",\"width\",\"text-indent\",\"padding-left\",\"padding-right\",\"border-width\",\"box-sizing\"]},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{class:[\"textarea\"===e.type?\"el-textarea\":\"el-input\",e.inputSize?\"el-input--\"+e.inputSize:\"\",{\"is-disabled\":e.inputDisabled,\"el-input-group\":e.$slots.prepend||e.$slots.append,\"el-input-group--append\":e.$slots.append,\"el-input-group--prepend\":e.$slots.prepend,\"el-input--prefix\":e.$slots.prefix||e.prefixIcon,\"el-input--suffix\":e.$slots.suffix||e.suffixIcon||e.clearable}],on:{mouseenter:function(t){e.hovering=!0},mouseleave:function(t){e.hovering=!1}}},[\"textarea\"!==e.type?[e.$slots.prepend?i(\"div\",{staticClass:\"el-input-group__prepend\"},[e._t(\"prepend\")],2):e._e(),\"textarea\"!==e.type?i(\"input\",e._b({ref:\"input\",staticClass:\"el-input__inner\",attrs:{tabindex:e.tabindex,type:e.type,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,\"aria-label\":e.label},domProps:{value:e.currentValue},on:{compositionstart:e.handleComposition,compositionupdate:e.handleComposition,compositionend:e.handleComposition,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},\"input\",e.$attrs,!1)):e._e(),e.$slots.prefix||e.prefixIcon?i(\"span\",{staticClass:\"el-input__prefix\"},[e._t(\"prefix\"),e.prefixIcon?i(\"i\",{staticClass:\"el-input__icon\",class:e.prefixIcon}):e._e()],2):e._e(),e.$slots.suffix||e.suffixIcon||e.showClear||e.validateState&&e.needStatusIcon?i(\"span\",{staticClass:\"el-input__suffix\"},[i(\"span\",{staticClass:\"el-input__suffix-inner\"},[e.showClear?i(\"i\",{staticClass:\"el-input__icon el-icon-circle-close el-input__clear\",on:{click:e.clear}}):[e._t(\"suffix\"),e.suffixIcon?i(\"i\",{staticClass:\"el-input__icon\",class:e.suffixIcon}):e._e()]],2),e.validateState?i(\"i\",{staticClass:\"el-input__icon\",class:[\"el-input__validateIcon\",e.validateIcon]}):e._e()]):e._e(),e.$slots.append?i(\"div\",{staticClass:\"el-input-group__append\"},[e._t(\"append\")],2):e._e()]:i(\"textarea\",e._b({ref:\"textarea\",staticClass:\"el-textarea__inner\",style:e.textareaStyle,attrs:{tabindex:e.tabindex,disabled:e.inputDisabled,readonly:e.readonly,autocomplete:e.autoComplete||e.autocomplete,\"aria-label\":e.label},domProps:{value:e.currentValue},on:{compositionstart:e.handleComposition,compositionupdate:e.handleComposition,compositionend:e.handleComposition,input:e.handleInput,focus:e.handleFocus,blur:e.handleBlur,change:e.handleChange}},\"textarea\",e.$attrs,!1))],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(110),s=i.n(n),r=i(113),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(11),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElSelectDropdown\",componentName:\"ElSelectDropdown\",mixins:[s.default],props:{placement:{default:\"bottom-start\"},boundariesPadding:{default:0},popperOptions:{default:function(){return{gpuAcceleration:!1}}},visibleArrow:{default:!0},appendToBody:{type:Boolean,default:!0}},data:function(){return{minWidth:\"\"}},computed:{popperClass:function(){return this.$parent.popperClass}},watch:{\"$parent.inputWidth\":function(){this.minWidth=this.$parent.$el.getBoundingClientRect().width+\"px\"}},mounted:function(){var e=this;this.referenceElm=this.$parent.$refs.reference.$el,this.$parent.popperElm=this.popperElm=this.$el,this.$on(\"updatePopper\",function(){e.$parent.visible&&e.updatePopper()}),this.$on(\"destroyPopper\",this.destroyPopper)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(2),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=i(5),o=!1,a=!1,l=2e3,u=function(){if(!s.default.prototype.$isServer){var e=d.modalDom;return e?o=!0:(o=!1,e=document.createElement(\"div\"),d.modalDom=e,e.addEventListener(\"touchmove\",function(e){e.preventDefault(),e.stopPropagation()}),e.addEventListener(\"click\",function(){d.doOnModalClick&&d.doOnModalClick()})),e}},c={},d={modalFade:!0,getInstance:function(e){return c[e]},register:function(e,t){e&&t&&(c[e]=t)},deregister:function(e){e&&(c[e]=null,delete c[e])},nextZIndex:function(){return d.zIndex++},modalStack:[],doOnModalClick:function(){var e=d.modalStack[d.modalStack.length-1];if(e){var t=d.getInstance(e.id);t&&t.closeOnClickModal&&t.close()}},openModal:function(e,t,i,n,a){if(!s.default.prototype.$isServer&&e&&void 0!==t){this.modalFade=a;for(var l=this.modalStack,c=0,d=l.length;c<d;c++){if(l[c].id===e)return}var h=u();if((0,r.addClass)(h,\"v-modal\"),this.modalFade&&!o&&(0,r.addClass)(h,\"v-modal-enter\"),n){n.trim().split(/\\s+/).forEach(function(e){return(0,r.addClass)(h,e)})}setTimeout(function(){(0,r.removeClass)(h,\"v-modal-enter\")},200),i&&i.parentNode&&11!==i.parentNode.nodeType?i.parentNode.appendChild(h):document.body.appendChild(h),t&&(h.style.zIndex=t),h.tabIndex=0,h.style.display=\"\",this.modalStack.push({id:e,zIndex:t,modalClass:n})}},closeModal:function(e){var t=this.modalStack,i=u();if(t.length>0){var n=t[t.length-1];if(n.id===e){if(n.modalClass){n.modalClass.trim().split(/\\s+/).forEach(function(e){return(0,r.removeClass)(i,e)})}t.pop(),t.length>0&&(i.style.zIndex=t[t.length-1].zIndex)}else for(var s=t.length-1;s>=0;s--)if(t[s].id===e){t.splice(s,1);break}}0===t.length&&(this.modalFade&&(0,r.addClass)(i,\"v-modal-leave\"),setTimeout(function(){0===t.length&&(i.parentNode&&i.parentNode.removeChild(i),i.style.display=\"none\",d.modalDom=void 0),(0,r.removeClass)(i,\"v-modal-leave\")},200))}};Object.defineProperty(d,\"zIndex\",{configurable:!0,get:function(){return a||(l=(s.default.prototype.$ELEMENT||{}).zIndex||l,a=!0),l},set:function(e){l=e}});var h=function(){if(!s.default.prototype.$isServer&&d.modalStack.length>0){var e=d.modalStack[d.modalStack.length-1];if(!e)return;return d.getInstance(e.id)}};s.default.prototype.$isServer||window.addEventListener(\"keydown\",function(e){if(27===e.keyCode){var t=h();t&&t.closeOnPressEscape&&(t.handleClose?t.handleClose():t.handleAction?t.handleAction(\"cancel\"):t.close())}}),t.default=d},function(e,t,i){var n,s;!function(r,o){n=o,void 0!==(s=\"function\"==typeof n?n.call(t,i,t,e):n)&&(e.exports=s)}(0,function(){\"use strict\";function e(e,t,i){this._reference=e.jquery?e[0]:e,this.state={};var n=void 0===t||null===t,s=t&&\"[object Object]\"===Object.prototype.toString.call(t);return this._popper=n||s?this.parse(s?t:{}):t.jquery?t[0]:t,this._options=Object.assign({},v,i),this._options.modifiers=this._options.modifiers.map(function(e){if(-1===this._options.modifiersIgnored.indexOf(e))return\"applyStyle\"===e&&this._popper.setAttribute(\"x-placement\",this._options.placement),this.modifiers[e]||e}.bind(this)),this.state.position=this._getPosition(this._popper,this._reference),u(this._popper,{position:this.state.position,top:0}),this.update(),this._setupEventListeners(),this}function t(e){var t=e.style.display,i=e.style.visibility;e.style.display=\"block\",e.style.visibility=\"hidden\";var n=(e.offsetWidth,m.getComputedStyle(e)),s=parseFloat(n.marginTop)+parseFloat(n.marginBottom),r=parseFloat(n.marginLeft)+parseFloat(n.marginRight),o={width:e.offsetWidth+r,height:e.offsetHeight+s};return e.style.display=t,e.style.visibility=i,o}function i(e){var t={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function n(e){var t=Object.assign({},e);return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function s(e,t){var i,n=0;for(i in e){if(e[i]===t)return n;n++}return null}function r(e,t){return m.getComputedStyle(e,null)[t]}function o(e){var t=e.offsetParent;return t!==m.document.body&&t?t:m.document.documentElement}function a(e){var t=e.parentNode;return t?t===m.document?m.document.body.scrollTop||m.document.body.scrollLeft?m.document.body:m.document.documentElement:-1!==[\"scroll\",\"auto\"].indexOf(r(t,\"overflow\"))||-1!==[\"scroll\",\"auto\"].indexOf(r(t,\"overflow-x\"))||-1!==[\"scroll\",\"auto\"].indexOf(r(t,\"overflow-y\"))?t:a(e.parentNode):e}function l(e){return e!==m.document.body&&(\"fixed\"===r(e,\"position\")||(e.parentNode?l(e.parentNode):e))}function u(e,t){function i(e){return\"\"!==e&&!isNaN(parseFloat(e))&&isFinite(e)}Object.keys(t).forEach(function(n){var s=\"\";-1!==[\"width\",\"height\",\"top\",\"right\",\"bottom\",\"left\"].indexOf(n)&&i(t[n])&&(s=\"px\"),e.style[n]=t[n]+s})}function c(e){var t={};return e&&\"[object Function]\"===t.toString.call(e)}function d(e){var t={width:e.offsetWidth,height:e.offsetHeight,left:e.offsetLeft,top:e.offsetTop};return t.right=t.left+t.width,t.bottom=t.top+t.height,t}function h(e){var t=e.getBoundingClientRect(),i=-1!=navigator.userAgent.indexOf(\"MSIE\"),n=i&&\"HTML\"===e.tagName?-e.scrollTop:t.top;return{left:t.left,top:n,right:t.right,bottom:t.bottom,width:t.right-t.left,height:t.bottom-n}}function f(e,t,i){var n=h(e),s=h(t);if(i){var r=a(t);s.top+=r.scrollTop,s.bottom+=r.scrollTop,s.left+=r.scrollLeft,s.right+=r.scrollLeft}return{top:n.top-s.top,left:n.left-s.left,bottom:n.top-s.top+n.height,right:n.left-s.left+n.width,width:n.width,height:n.height}}function p(e){for(var t=[\"\",\"ms\",\"webkit\",\"moz\",\"o\"],i=0;i<t.length;i++){var n=t[i]?t[i]+e.charAt(0).toUpperCase()+e.slice(1):e;if(void 0!==m.document.body.style[n])return n}return null}var m=window,v={placement:\"bottom\",gpuAcceleration:!0,offset:0,boundariesElement:\"viewport\",boundariesPadding:5,preventOverflowOrder:[\"left\",\"right\",\"top\",\"bottom\"],flipBehavior:\"flip\",arrowElement:\"[x-arrow]\",arrowOffset:0,modifiers:[\"shift\",\"offset\",\"preventOverflow\",\"keepTogether\",\"arrow\",\"flip\",\"applyStyle\"],modifiersIgnored:[],forceAbsolute:!1};return e.prototype.destroy=function(){return this._popper.removeAttribute(\"x-placement\"),this._popper.style.left=\"\",this._popper.style.position=\"\",this._popper.style.top=\"\",this._popper.style[p(\"transform\")]=\"\",this._removeEventListeners(),this._options.removeOnDestroy&&this._popper.remove(),this},e.prototype.update=function(){var e={instance:this,styles:{}};e.placement=this._options.placement,e._originalPlacement=this._options.placement,e.offsets=this._getOffsets(this._popper,this._reference,e.placement),e.boundaries=this._getBoundaries(e,this._options.boundariesPadding,this._options.boundariesElement),e=this.runModifiers(e,this._options.modifiers),\"function\"==typeof this.state.updateCallback&&this.state.updateCallback(e)},e.prototype.onCreate=function(e){return e(this),this},e.prototype.onUpdate=function(e){return this.state.updateCallback=e,this},e.prototype.parse=function(e){function t(e,t){t.forEach(function(t){e.classList.add(t)})}function i(e,t){t.forEach(function(t){e.setAttribute(t.split(\":\")[0],t.split(\":\")[1]||\"\")})}var n={tagName:\"div\",classNames:[\"popper\"],attributes:[],parent:m.document.body,content:\"\",contentType:\"text\",arrowTagName:\"div\",arrowClassNames:[\"popper__arrow\"],arrowAttributes:[\"x-arrow\"]};e=Object.assign({},n,e);var s=m.document,r=s.createElement(e.tagName);if(t(r,e.classNames),i(r,e.attributes),\"node\"===e.contentType?r.appendChild(e.content.jquery?e.content[0]:e.content):\"html\"===e.contentType?r.innerHTML=e.content:r.textContent=e.content,e.arrowTagName){var o=s.createElement(e.arrowTagName);t(o,e.arrowClassNames),i(o,e.arrowAttributes),r.appendChild(o)}var a=e.parent.jquery?e.parent[0]:e.parent;if(\"string\"==typeof a){if(a=s.querySelectorAll(e.parent),a.length>1&&console.warn(\"WARNING: the given `parent` query(\"+e.parent+\") matched more than one element, the first one will be used\"),0===a.length)throw\"ERROR: the given `parent` doesn't exists!\";a=a[0]}return a.length>1&&a instanceof Element==!1&&(console.warn(\"WARNING: you have passed as parent a list of elements, the first one will be used\"),a=a[0]),a.appendChild(r),r},e.prototype._getPosition=function(e,t){var i=o(t);return this._options.forceAbsolute?\"absolute\":l(t,i)?\"fixed\":\"absolute\"},e.prototype._getOffsets=function(e,i,n){n=n.split(\"-\")[0];var s={};s.position=this.state.position;var r=\"fixed\"===s.position,a=f(i,o(e),r),l=t(e);return-1!==[\"right\",\"left\"].indexOf(n)?(s.top=a.top+a.height/2-l.height/2,s.left=\"left\"===n?a.left-l.width:a.right):(s.left=a.left+a.width/2-l.width/2,s.top=\"top\"===n?a.top-l.height:a.bottom),s.width=l.width,s.height=l.height,{popper:s,reference:a}},e.prototype._setupEventListeners=function(){if(this.state.updateBound=this.update.bind(this),m.addEventListener(\"resize\",this.state.updateBound),\"window\"!==this._options.boundariesElement){var e=a(this._reference);e!==m.document.body&&e!==m.document.documentElement||(e=m),e.addEventListener(\"scroll\",this.state.updateBound),this.state.scrollTarget=e}},e.prototype._removeEventListeners=function(){m.removeEventListener(\"resize\",this.state.updateBound),\"window\"!==this._options.boundariesElement&&this.state.scrollTarget&&(this.state.scrollTarget.removeEventListener(\"scroll\",this.state.updateBound),this.state.scrollTarget=null),this.state.updateBound=null},e.prototype._getBoundaries=function(e,t,i){var n,s,r={};if(\"window\"===i){var l=m.document.body,u=m.document.documentElement;s=Math.max(l.scrollHeight,l.offsetHeight,u.clientHeight,u.scrollHeight,u.offsetHeight),n=Math.max(l.scrollWidth,l.offsetWidth,u.clientWidth,u.scrollWidth,u.offsetWidth),r={top:0,right:n,bottom:s,left:0}}else if(\"viewport\"===i){var c=o(this._popper),h=a(this._popper),f=d(c),p=\"fixed\"===e.offsets.popper.position?0:function(e){return e==document.body?Math.max(document.documentElement.scrollTop,document.body.scrollTop):e.scrollTop}(h),v=\"fixed\"===e.offsets.popper.position?0:function(e){return e==document.body?Math.max(document.documentElement.scrollLeft,document.body.scrollLeft):e.scrollLeft}(h);r={top:0-(f.top-p),right:m.document.documentElement.clientWidth-(f.left-v),bottom:m.document.documentElement.clientHeight-(f.top-p),left:0-(f.left-v)}}else r=o(this._popper)===i?{top:0,left:0,right:i.clientWidth,bottom:i.clientHeight}:d(i);return r.left+=t,r.right-=t,r.top=r.top+t,r.bottom=r.bottom-t,r},e.prototype.runModifiers=function(e,t,i){var n=t.slice();return void 0!==i&&(n=this._options.modifiers.slice(0,s(this._options.modifiers,i))),n.forEach(function(t){c(t)&&(e=t.call(this,e))}.bind(this)),e},e.prototype.isModifierRequired=function(e,t){var i=s(this._options.modifiers,e);return!!this._options.modifiers.slice(0,i).filter(function(e){return e===t}).length},e.prototype.modifiers={},e.prototype.modifiers.applyStyle=function(e){var t,i={position:e.offsets.popper.position},n=Math.round(e.offsets.popper.left),s=Math.round(e.offsets.popper.top);return this._options.gpuAcceleration&&(t=p(\"transform\"))?(i[t]=\"translate3d(\"+n+\"px, \"+s+\"px, 0)\",i.top=0,i.left=0):(i.left=n,i.top=s),Object.assign(i,e.styles),u(this._popper,i),this._popper.setAttribute(\"x-placement\",e.placement),this.isModifierRequired(this.modifiers.applyStyle,this.modifiers.arrow)&&e.offsets.arrow&&u(e.arrowElement,e.offsets.arrow),e},e.prototype.modifiers.shift=function(e){var t=e.placement,i=t.split(\"-\")[0],s=t.split(\"-\")[1];if(s){var r=e.offsets.reference,o=n(e.offsets.popper),a={y:{start:{top:r.top},end:{top:r.top+r.height-o.height}},x:{start:{left:r.left},end:{left:r.left+r.width-o.width}}},l=-1!==[\"bottom\",\"top\"].indexOf(i)?\"x\":\"y\";e.offsets.popper=Object.assign(o,a[l][s])}return e},e.prototype.modifiers.preventOverflow=function(e){var t=this._options.preventOverflowOrder,i=n(e.offsets.popper),s={left:function(){var t=i.left;return i.left<e.boundaries.left&&(t=Math.max(i.left,e.boundaries.left)),{left:t}},right:function(){var t=i.left;return i.right>e.boundaries.right&&(t=Math.min(i.left,e.boundaries.right-i.width)),{left:t}},top:function(){var t=i.top;return i.top<e.boundaries.top&&(t=Math.max(i.top,e.boundaries.top)),{top:t}},bottom:function(){var t=i.top;return i.bottom>e.boundaries.bottom&&(t=Math.min(i.top,e.boundaries.bottom-i.height)),{top:t}}};return t.forEach(function(t){e.offsets.popper=Object.assign(i,s[t]())}),e},e.prototype.modifiers.keepTogether=function(e){var t=n(e.offsets.popper),i=e.offsets.reference,s=Math.floor;return t.right<s(i.left)&&(e.offsets.popper.left=s(i.left)-t.width),t.left>s(i.right)&&(e.offsets.popper.left=s(i.right)),t.bottom<s(i.top)&&(e.offsets.popper.top=s(i.top)-t.height),t.top>s(i.bottom)&&(e.offsets.popper.top=s(i.bottom)),e},e.prototype.modifiers.flip=function(e){if(!this.isModifierRequired(this.modifiers.flip,this.modifiers.preventOverflow))return console.warn(\"WARNING: preventOverflow modifier is required by flip modifier in order to work, be sure to include it before flip!\"),e;if(e.flipped&&e.placement===e._originalPlacement)return e;var t=e.placement.split(\"-\")[0],s=i(t),r=e.placement.split(\"-\")[1]||\"\",o=[];return o=\"flip\"===this._options.flipBehavior?[t,s]:this._options.flipBehavior,o.forEach(function(a,l){if(t===a&&o.length!==l+1){t=e.placement.split(\"-\")[0],s=i(t);var u=n(e.offsets.popper),c=-1!==[\"right\",\"bottom\"].indexOf(t);(c&&Math.floor(e.offsets.reference[t])>Math.floor(u[s])||!c&&Math.floor(e.offsets.reference[t])<Math.floor(u[s]))&&(e.flipped=!0,e.placement=o[l+1],r&&(e.placement+=\"-\"+r),e.offsets.popper=this._getOffsets(this._popper,this._reference,e.placement).popper,e=this.runModifiers(e,this._options.modifiers,this._flip))}}.bind(this)),e},e.prototype.modifiers.offset=function(e){var t=this._options.offset,i=e.offsets.popper;return-1!==e.placement.indexOf(\"left\")?i.top-=t:-1!==e.placement.indexOf(\"right\")?i.top+=t:-1!==e.placement.indexOf(\"top\")?i.left-=t:-1!==e.placement.indexOf(\"bottom\")&&(i.left+=t),e},e.prototype.modifiers.arrow=function(e){var i=this._options.arrowElement,s=this._options.arrowOffset;if(\"string\"==typeof i&&(i=this._popper.querySelector(i)),!i)return e;if(!this._popper.contains(i))return console.warn(\"WARNING: `arrowElement` must be child of its popper element!\"),e;if(!this.isModifierRequired(this.modifiers.arrow,this.modifiers.keepTogether))return console.warn(\"WARNING: keepTogether modifier is required by arrow modifier in order to work, be sure to include it before arrow!\"),e;var r={},o=e.placement.split(\"-\")[0],a=n(e.offsets.popper),l=e.offsets.reference,u=-1!==[\"left\",\"right\"].indexOf(o),c=u?\"height\":\"width\",d=u?\"top\":\"left\",h=u?\"left\":\"top\",f=u?\"bottom\":\"right\",p=t(i)[c];l[f]-p<a[d]&&(e.offsets.popper[d]-=a[d]-(l[f]-p)),l[d]+p>a[f]&&(e.offsets.popper[d]+=l[d]+p-a[f]);var m=l[d]+(s||l[c]/2-p/2),v=m-a[d];return v=Math.max(Math.min(a[c]-p-8,v),8),r[d]=v,r[h]=\"\",e.offsets.arrow=r,e.arrowElement=i,e},Object.assign||Object.defineProperty(Object,\"assign\",{enumerable:!1,configurable:!0,writable:!0,value:function(e){if(void 0===e||null===e)throw new TypeError(\"Cannot convert first argument to object\");for(var t=Object(e),i=1;i<arguments.length;i++){var n=arguments[i];if(void 0!==n&&null!==n){n=Object(n);for(var s=Object.keys(n),r=0,o=s.length;r<o;r++){var a=s[r],l=Object.getOwnPropertyDescriptor(n,a);void 0!==l&&l.enumerable&&(t[a]=n[a])}}}return t}}),e})},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-select-dropdown el-popper\",class:[{\"is-multiple\":e.$parent.multiple},e.popperClass],style:{minWidth:e.minWidth}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},s=i(1),r=function(e){return e&&e.__esModule?e:{default:e}}(s),o=i(4);t.default={mixins:[r.default],name:\"ElOption\",componentName:\"ElOption\",inject:[\"select\"],props:{value:{required:!0},label:[String,Number],created:Boolean,disabled:{type:Boolean,default:!1}},data:function(){return{index:-1,groupDisabled:!1,visible:!0,hitState:!1,hover:!1}},computed:{isObject:function(){return\"[object object]\"===Object.prototype.toString.call(this.value).toLowerCase()},currentLabel:function(){return this.label||(this.isObject?\"\":this.value)},currentValue:function(){return this.value||this.label||\"\"},itemSelected:function(){return this.select.multiple?this.contains(this.select.value,this.value):this.isEqual(this.value,this.select.value)},limitReached:function(){return!!this.select.multiple&&(!this.itemSelected&&(this.select.value||[]).length>=this.select.multipleLimit&&this.select.multipleLimit>0)}},watch:{currentLabel:function(){this.created||this.select.remote||this.dispatch(\"ElSelect\",\"setSelected\")},value:function(e,t){var i=this.select,s=i.remote,r=i.valueKey;if(!this.created&&!s){if(r&&\"object\"===(void 0===e?\"undefined\":n(e))&&\"object\"===(void 0===t?\"undefined\":n(t))&&e[r]===t[r])return;this.dispatch(\"ElSelect\",\"setSelected\")}}},methods:{isEqual:function(e,t){if(this.isObject){var i=this.select.valueKey;return(0,o.getValueByPath)(e,i)===(0,o.getValueByPath)(t,i)}return e===t},contains:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=arguments[1];if(!this.isObject)return t.indexOf(i)>-1;var s=function(){var n=e.select.valueKey;return{v:t.some(function(e){return(0,o.getValueByPath)(e,n)===(0,o.getValueByPath)(i,n)})}}();return\"object\"===(void 0===s?\"undefined\":n(s))?s.v:void 0},handleGroupDisabled:function(e){this.groupDisabled=e},hoverItem:function(){this.disabled||this.groupDisabled||(this.select.hoverIndex=this.select.options.indexOf(this))},selectOptionClick:function(){!0!==this.disabled&&!0!==this.groupDisabled&&this.dispatch(\"ElSelect\",\"handleOptionClick\",[this,!0])},queryChange:function(e){this.visible=new RegExp((0,o.escapeRegexpString)(e),\"i\").test(this.currentLabel)||this.created,this.visible||this.select.filteredOptionsCount--}},created:function(){this.select.options.push(this),this.select.cachedOptions.push(this),this.select.optionsCount++,this.select.filteredOptionsCount++,this.$on(\"queryChange\",this.queryChange),this.$on(\"handleGroupDisabled\",this.handleGroupDisabled)},beforeDestroy:function(){this.select.onOptionDestroy(this.select.options.indexOf(this))}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"li\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-select-dropdown__item\",class:{selected:e.itemSelected,\"is-disabled\":e.disabled||e.groupDisabled||e.limitReached,hover:e.hover},on:{mouseenter:e.hoverItem,click:function(t){t.stopPropagation(),e.selectOptionClick(t)}}},[e._t(\"default\",[i(\"span\",[e._v(e._s(e.currentLabel))])])],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(117),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElTag\",props:{text:String,closable:Boolean,type:String,hit:Boolean,disableTransitions:Boolean,color:String,size:String},methods:{handleClose:function(e){e.stopPropagation(),this.$emit(\"close\",e)}},computed:{tagSize:function(){return this.size||(this.$ELEMENT||{}).size}},render:function(e){var t=[\"el-tag\",this.type?\"el-tag--\"+this.type:\"\",this.tagSize?\"el-tag--\"+this.tagSize:\"\",{\"is-hit\":this.hit}],i=e(\"span\",{class:t,style:{backgroundColor:this.color}},[this.$slots.default,this.closable&&e(\"i\",{class:\"el-tag__close el-icon-close\",on:{click:this.handleClose}},[])]);return this.disableTransitions?i:e(\"transition\",{attrs:{name:\"el-zoom-in-center\"}},[i])}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(27),r=i(44),o=n(r),a=i(4),l=i(121),u=n(l);t.default={name:\"ElScrollbar\",components:{Bar:u.default},props:{native:Boolean,wrapStyle:{},wrapClass:{},viewClass:{},viewStyle:{},noresize:Boolean,tag:{type:String,default:\"div\"}},data:function(){return{sizeWidth:\"0\",sizeHeight:\"0\",moveX:0,moveY:0}},computed:{wrap:function(){return this.$refs.wrap}},render:function(e){var t=(0,o.default)(),i=this.wrapStyle;if(t){var n=\"-\"+t+\"px\",s=\"margin-bottom: \"+n+\"; margin-right: \"+n+\";\";Array.isArray(this.wrapStyle)?(i=(0,a.toObject)(this.wrapStyle),i.marginRight=i.marginBottom=n):\"string\"==typeof this.wrapStyle?i+=s:i=s}var r=e(this.tag,{class:[\"el-scrollbar__view\",this.viewClass],style:this.viewStyle,ref:\"resize\"},this.$slots.default),l=e(\"div\",{ref:\"wrap\",style:i,on:{scroll:this.handleScroll},class:[this.wrapClass,\"el-scrollbar__wrap\",t?\"\":\"el-scrollbar__wrap--hidden-default\"]},[[r]]),c=void 0;return c=this.native?[e(\"div\",{ref:\"wrap\",class:[this.wrapClass,\"el-scrollbar__wrap\"],style:i},[[r]])]:[l,e(u.default,{attrs:{move:this.moveX,size:this.sizeWidth}},[]),e(u.default,{attrs:{vertical:!0,move:this.moveY,size:this.sizeHeight}},[])],e(\"div\",{class:\"el-scrollbar\"},c)},methods:{handleScroll:function(){var e=this.wrap;this.moveY=100*e.scrollTop/e.clientHeight,this.moveX=100*e.scrollLeft/e.clientWidth},update:function(){var e=void 0,t=void 0,i=this.wrap;i&&(e=100*i.clientHeight/i.scrollHeight,t=100*i.clientWidth/i.scrollWidth,this.sizeHeight=e<100?e+\"%\":\"\",this.sizeWidth=t<100?t+\"%\":\"\")}},mounted:function(){this.native||(this.$nextTick(this.update),!this.noresize&&(0,s.addResizeListener)(this.$refs.resize,this.update))},beforeDestroy:function(){this.native||!this.noresize&&(0,s.removeResizeListener)(this.$refs.resize,this.update)}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){function i(e){return parseFloat(e)||0}function n(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return t.reduce(function(t,n){return t+i(e[\"border-\"+n+\"-width\"])},0)}function s(e){for(var t=[\"top\",\"right\",\"bottom\",\"left\"],n={},s=0,r=t;s<r.length;s+=1){var o=r[s],a=e[\"padding-\"+o];n[o]=i(a)}return n}function r(e){var t=e.getBBox();return c(0,0,t.width,t.height)}function o(e){var t=e.clientWidth,r=e.clientHeight;if(!t&&!r)return x;var o=C(e).getComputedStyle(e),l=s(o),u=l.left+l.right,d=l.top+l.bottom,h=i(o.width),f=i(o.height);if(\"border-box\"===o.boxSizing&&(Math.round(h+u)!==t&&(h-=n(o,\"left\",\"right\")+u),Math.round(f+d)!==r&&(f-=n(o,\"top\",\"bottom\")+d)),!a(e)){var p=Math.round(h+u)-t,m=Math.round(f+d)-r;1!==Math.abs(p)&&(h-=p),1!==Math.abs(m)&&(f-=m)}return c(l.left,l.top,h,f)}function a(e){return e===C(e).document.documentElement}function l(e){return h?w(e)?r(e):o(e):x}function u(e){var t=e.x,i=e.y,n=e.width,s=e.height,r=\"undefined\"!=typeof DOMRectReadOnly?DOMRectReadOnly:Object,o=Object.create(r.prototype);return _(o,{x:t,y:i,width:n,height:s,top:i,right:t+n,bottom:s+i,left:t}),o}function c(e,t,i,n){return{x:e,y:t,width:i,height:n}}var d=function(){function e(e,t){var i=-1;return e.some(function(e,n){return e[0]===t&&(i=n,!0)}),i}return\"undefined\"!=typeof Map?Map:function(){function t(){this.__entries__=[]}var i={size:{configurable:!0}};return i.size.get=function(){return this.__entries__.length},t.prototype.get=function(t){var i=e(this.__entries__,t),n=this.__entries__[i];return n&&n[1]},t.prototype.set=function(t,i){var n=e(this.__entries__,t);~n?this.__entries__[n][1]=i:this.__entries__.push([t,i])},t.prototype.delete=function(t){var i=this.__entries__,n=e(i,t);~n&&i.splice(n,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){var i=this;void 0===t&&(t=null);for(var n=0,s=i.__entries__;n<s.length;n+=1){var r=s[n];e.call(t,r[1],r[0])}},Object.defineProperties(t.prototype,i),t}()}(),h=\"undefined\"!=typeof window&&\"undefined\"!=typeof document&&window.document===document,f=function(){return void 0!==e&&e.Math===Math?e:\"undefined\"!=typeof self&&self.Math===Math?self:\"undefined\"!=typeof window&&window.Math===Math?window:Function(\"return this\")()}(),p=function(){return\"function\"==typeof requestAnimationFrame?requestAnimationFrame.bind(f):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)}}(),m=2,v=function(e,t){function i(){r&&(r=!1,e()),o&&s()}function n(){p(i)}function s(){var e=Date.now();if(r){if(e-a<m)return;o=!0}else r=!0,o=!1,setTimeout(n,t);a=e}var r=!1,o=!1,a=0;return s},g=[\"top\",\"right\",\"bottom\",\"left\",\"width\",\"height\",\"size\",\"weight\"],b=\"undefined\"!=typeof MutationObserver,y=function(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=v(this.refresh.bind(this),20)};y.prototype.addObserver=function(e){~this.observers_.indexOf(e)||this.observers_.push(e),this.connected_||this.connect_()},y.prototype.removeObserver=function(e){var t=this.observers_,i=t.indexOf(e);~i&&t.splice(i,1),!t.length&&this.connected_&&this.disconnect_()},y.prototype.refresh=function(){this.updateObservers_()&&this.refresh()},y.prototype.updateObservers_=function(){var e=this.observers_.filter(function(e){return e.gatherActive(),e.hasActive()});return e.forEach(function(e){return e.broadcastActive()}),e.length>0},y.prototype.connect_=function(){h&&!this.connected_&&(document.addEventListener(\"transitionend\",this.onTransitionEnd_),window.addEventListener(\"resize\",this.refresh),b?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener(\"DOMSubtreeModified\",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},y.prototype.disconnect_=function(){h&&this.connected_&&(document.removeEventListener(\"transitionend\",this.onTransitionEnd_),window.removeEventListener(\"resize\",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener(\"DOMSubtreeModified\",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},y.prototype.onTransitionEnd_=function(e){var t=e.propertyName;void 0===t&&(t=\"\"),g.some(function(e){return!!~t.indexOf(e)})&&this.refresh()},y.getInstance=function(){return this.instance_||(this.instance_=new y),this.instance_},y.instance_=null;var _=function(e,t){for(var i=0,n=Object.keys(t);i<n.length;i+=1){var s=n[i];Object.defineProperty(e,s,{value:t[s],enumerable:!1,writable:!1,configurable:!0})}return e},C=function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||f},x=c(0,0,0,0),w=function(){return\"undefined\"!=typeof SVGGraphicsElement?function(e){return e instanceof C(e).SVGGraphicsElement}:function(e){return e instanceof C(e).SVGElement&&\"function\"==typeof e.getBBox}}(),k=function(e){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=c(0,0,0,0),this.target=e};k.prototype.isActive=function(){var e=l(this.target);return this.contentRect_=e,e.width!==this.broadcastWidth||e.height!==this.broadcastHeight},k.prototype.broadcastRect=function(){var e=this.contentRect_;return this.broadcastWidth=e.width,this.broadcastHeight=e.height,e};var S=function(e,t){var i=u(t);_(this,{target:e,contentRect:i})},M=function(e,t,i){if(this.activeObservations_=[],this.observations_=new d,\"function\"!=typeof e)throw new TypeError(\"The callback provided as parameter 1 is not a function.\");this.callback_=e,this.controller_=t,this.callbackCtx_=i};M.prototype.observe=function(e){if(!arguments.length)throw new TypeError(\"1 argument required, but only 0 present.\");if(\"undefined\"!=typeof Element&&Element instanceof Object){if(!(e instanceof C(e).Element))throw new TypeError('parameter 1 is not of type \"Element\".');var t=this.observations_;t.has(e)||(t.set(e,new k(e)),this.controller_.addObserver(this),this.controller_.refresh())}},M.prototype.unobserve=function(e){if(!arguments.length)throw new TypeError(\"1 argument required, but only 0 present.\");if(\"undefined\"!=typeof Element&&Element instanceof Object){if(!(e instanceof C(e).Element))throw new TypeError('parameter 1 is not of type \"Element\".');var t=this.observations_;t.has(e)&&(t.delete(e),t.size||this.controller_.removeObserver(this))}},M.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},M.prototype.gatherActive=function(){var e=this;this.clearActive(),this.observations_.forEach(function(t){t.isActive()&&e.activeObservations_.push(t)})},M.prototype.broadcastActive=function(){if(this.hasActive()){var e=this.callbackCtx_,t=this.activeObservations_.map(function(e){return new S(e.target,e.broadcastRect())});this.callback_.call(e,t,e),this.clearActive()}},M.prototype.clearActive=function(){this.activeObservations_.splice(0)},M.prototype.hasActive=function(){return this.activeObservations_.length>0};var $=\"undefined\"!=typeof WeakMap?new WeakMap:new d,E=function(e){if(!(this instanceof E))throw new TypeError(\"Cannot call a class as a function.\");if(!arguments.length)throw new TypeError(\"1 argument required, but only 0 present.\");var t=y.getInstance(),i=new M(e,t,this);$.set(this,i)};[\"observe\",\"unobserve\",\"disconnect\"].forEach(function(e){E.prototype[e]=function(){return(t=$.get(this))[e].apply(t,arguments);var t}});var D=function(){return void 0!==f.ResizeObserver?f.ResizeObserver:E}();t.default=D}.call(t,i(120))},function(e,t){var i;i=function(){return this}();try{i=i||Function(\"return this\")()||(0,eval)(\"this\")}catch(e){\"object\"==typeof window&&(i=window)}e.exports=i},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(5),s=i(122);t.default={name:\"Bar\",props:{vertical:Boolean,size:String,move:Number},computed:{bar:function(){return s.BAR_MAP[this.vertical?\"vertical\":\"horizontal\"]},wrap:function(){return this.$parent.wrap}},render:function(e){var t=this.size,i=this.move,n=this.bar;return e(\"div\",{class:[\"el-scrollbar__bar\",\"is-\"+n.key],on:{mousedown:this.clickTrackHandler}},[e(\"div\",{ref:\"thumb\",class:\"el-scrollbar__thumb\",on:{mousedown:this.clickThumbHandler},style:(0,s.renderThumbStyle)({size:t,move:i,bar:n})},[])])},methods:{clickThumbHandler:function(e){this.startDrag(e),this[this.bar.axis]=e.currentTarget[this.bar.offset]-(e[this.bar.client]-e.currentTarget.getBoundingClientRect()[this.bar.direction])},clickTrackHandler:function(e){var t=Math.abs(e.target.getBoundingClientRect()[this.bar.direction]-e[this.bar.client]),i=this.$refs.thumb[this.bar.offset]/2,n=100*(t-i)/this.$el[this.bar.offset];this.wrap[this.bar.scroll]=n*this.wrap[this.bar.scrollSize]/100},startDrag:function(e){e.stopImmediatePropagation(),this.cursorDown=!0,(0,n.on)(document,\"mousemove\",this.mouseMoveDocumentHandler),(0,n.on)(document,\"mouseup\",this.mouseUpDocumentHandler),document.onselectstart=function(){return!1}},mouseMoveDocumentHandler:function(e){if(!1!==this.cursorDown){var t=this[this.bar.axis];if(t){var i=-1*(this.$el.getBoundingClientRect()[this.bar.direction]-e[this.bar.client]),n=this.$refs.thumb[this.bar.offset]-t,s=100*(i-n)/this.$el[this.bar.offset];this.wrap[this.bar.scroll]=s*this.wrap[this.bar.scrollSize]/100}}},mouseUpDocumentHandler:function(e){this.cursorDown=!1,this[this.bar.axis]=0,(0,n.off)(document,\"mousemove\",this.mouseMoveDocumentHandler),document.onselectstart=null}},destroyed:function(){(0,n.off)(document,\"mouseup\",this.mouseUpDocumentHandler)}}},function(e,t,i){\"use strict\";function n(e){var t=e.move,i=e.size,n=e.bar,s={},r=\"translate\"+n.axis+\"(\"+t+\"%)\";return s[n.size]=i,s.transform=r,s.msTransform=r,s.webkitTransform=r,s}t.__esModule=!0,t.renderThumbStyle=n;t.BAR_MAP={vertical:{offset:\"offsetHeight\",scroll:\"scrollTop\",scrollSize:\"scrollHeight\",size:\"height\",key:\"vertical\",axis:\"Y\",client:\"clientY\",direction:\"top\"},horizontal:{offset:\"offsetWidth\",scroll:\"scrollLeft\",scrollSize:\"scrollWidth\",size:\"width\",key:\"horizontal\",axis:\"X\",client:\"clientX\",direction:\"left\"}}},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={data:function(){return{hoverOption:-1}},computed:{optionsAllDisabled:function(){return this.options.filter(function(e){return e.visible}).every(function(e){return e.disabled})}},watch:{hoverIndex:function(e){var t=this;\"number\"==typeof e&&e>-1&&(this.hoverOption=this.options[e]||{}),this.options.forEach(function(e){e.hover=t.hoverOption===e})}},methods:{navigateOptions:function(e){var t=this;if(!this.visible)return void(this.visible=!0);if(0!==this.options.length&&0!==this.filteredOptionsCount&&!this.optionsAllDisabled){\"next\"===e?++this.hoverIndex===this.options.length&&(this.hoverIndex=0):\"prev\"===e&&--this.hoverIndex<0&&(this.hoverIndex=this.options.length-1);var i=this.options[this.hoverIndex];!0!==i.disabled&&!0!==i.groupDisabled&&i.visible||this.navigateOptions(e),this.$nextTick(function(){return t.scrollToOption(t.hoverOption)})}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleClose,expression:\"handleClose\"}],staticClass:\"el-select\",class:[e.selectSize?\"el-select--\"+e.selectSize:\"\"],on:{click:function(t){t.stopPropagation(),e.toggleMenu(t)}}},[e.multiple?i(\"div\",{ref:\"tags\",staticClass:\"el-select__tags\",style:{\"max-width\":e.inputWidth-32+\"px\",width:\"100%\"}},[e.collapseTags&&e.selected.length?i(\"span\",[i(\"el-tag\",{attrs:{closable:!e.selectDisabled,size:e.collapseTagSize,hit:e.selected[0].hitState,type:\"info\",\"disable-transitions\":\"\"},on:{close:function(t){e.deleteTag(t,e.selected[0])}}},[i(\"span\",{staticClass:\"el-select__tags-text\"},[e._v(e._s(e.selected[0].currentLabel))])]),e.selected.length>1?i(\"el-tag\",{attrs:{closable:!1,size:e.collapseTagSize,type:\"info\",\"disable-transitions\":\"\"}},[i(\"span\",{staticClass:\"el-select__tags-text\"},[e._v(\"+ \"+e._s(e.selected.length-1))])]):e._e()],1):e._e(),e.collapseTags?e._e():i(\"transition-group\",{on:{\"after-leave\":e.resetInputHeight}},e._l(e.selected,function(t){return i(\"el-tag\",{key:e.getValueKey(t),attrs:{closable:!e.selectDisabled,size:e.collapseTagSize,hit:t.hitState,type:\"info\",\"disable-transitions\":\"\"},on:{close:function(i){e.deleteTag(i,t)}}},[i(\"span\",{staticClass:\"el-select__tags-text\"},[e._v(e._s(t.currentLabel))])])})),e.filterable?i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.query,expression:\"query\"}],ref:\"input\",staticClass:\"el-select__input\",class:[e.selectSize?\"is-\"+e.selectSize:\"\"],style:{\"flex-grow\":\"1\",width:e.inputLength/(e.inputWidth-32)+\"%\",\"max-width\":e.inputWidth-42+\"px\"},attrs:{type:\"text\",disabled:e.selectDisabled,autocomplete:e.autoComplete||e.autocomplete},domProps:{value:e.query},on:{focus:e.handleFocus,blur:function(t){e.softFocus=!1},click:function(e){e.stopPropagation()},keyup:e.managePlaceholder,keydown:[e.resetInputState,function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"down\",40,t.key))return null;t.preventDefault(),e.navigateOptions(\"next\")},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"up\",38,t.key))return null;t.preventDefault(),e.navigateOptions(\"prev\")},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;t.preventDefault(),e.selectOption(t)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"esc\",27,t.key))return null;t.stopPropagation(),t.preventDefault(),e.visible=!1},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"delete\",[8,46],t.key))return null;e.deletePrevTag(t)}],compositionstart:e.handleComposition,compositionupdate:e.handleComposition,compositionend:e.handleComposition,input:[function(t){t.target.composing||(e.query=t.target.value)},e.debouncedQueryChange]}}):e._e()],1):e._e(),i(\"el-input\",{ref:\"reference\",class:{\"is-focus\":e.visible},attrs:{type:\"text\",placeholder:e.currentPlaceholder,name:e.name,id:e.id,autocomplete:e.autoComplete||e.autocomplete,size:e.selectSize,disabled:e.selectDisabled,readonly:e.readonly,\"validate-event\":!1},on:{focus:e.handleFocus,blur:e.handleBlur},nativeOn:{keyup:function(t){e.debouncedOnInputChange(t)},keydown:[function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"down\",40,t.key))return null;t.stopPropagation(),t.preventDefault(),e.navigateOptions(\"next\")},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"up\",38,t.key))return null;t.stopPropagation(),t.preventDefault(),e.navigateOptions(\"prev\")},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;t.preventDefault(),e.selectOption(t)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"esc\",27,t.key))return null;t.stopPropagation(),t.preventDefault(),e.visible=!1},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"tab\",9,t.key))return null;e.visible=!1}],paste:function(t){e.debouncedOnInputChange(t)},mouseenter:function(t){e.inputHovering=!0},mouseleave:function(t){e.inputHovering=!1}},model:{value:e.selectedLabel,callback:function(t){e.selectedLabel=t},expression:\"selectedLabel\"}},[e.$slots.prefix?i(\"template\",{attrs:{slot:\"prefix\"},slot:\"prefix\"},[e._t(\"prefix\")],2):e._e(),i(\"template\",{attrs:{slot:\"suffix\"},slot:\"suffix\"},[i(\"i\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.showClose,expression:\"!showClose\"}],class:[\"el-select__caret\",\"el-input__icon\",\"el-icon-\"+e.iconClass]}),e.showClose?i(\"i\",{staticClass:\"el-select__caret el-input__icon el-icon-circle-close\",on:{click:e.handleClearClick}}):e._e()])],2),i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"before-enter\":e.handleMenuEnter,\"after-leave\":e.doDestroy}},[i(\"el-select-menu\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible&&!1!==e.emptyText,expression:\"visible && emptyText !== false\"}],ref:\"popper\",attrs:{\"append-to-body\":e.popperAppendToBody}},[i(\"el-scrollbar\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.options.length>0&&!e.loading,expression:\"options.length > 0 && !loading\"}],ref:\"scrollbar\",class:{\"is-empty\":!e.allowCreate&&e.query&&0===e.filteredOptionsCount},attrs:{tag:\"ul\",\"wrap-class\":\"el-select-dropdown__wrap\",\"view-class\":\"el-select-dropdown__list\"}},[e.showNewOption?i(\"el-option\",{attrs:{value:e.query,created:\"\"}}):e._e(),e._t(\"default\")],2),e.emptyText&&(!e.allowCreate||e.loading||e.allowCreate&&0===e.options.length)?i(\"p\",{staticClass:\"el-select-dropdown__empty\"},[e._v(\"\\n        \"+e._s(e.emptyText)+\"\\n      \")]):e._e()],1)],1)],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(126),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(127),s=i.n(n),r=i(128),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(14),r=n(s),o=i(9),a=n(o),l=i(1),u=n(l);t.default={name:\"ElDialog\",mixins:[r.default,u.default,a.default],props:{title:{type:String,default:\"\"},modal:{type:Boolean,default:!0},modalAppendToBody:{type:Boolean,default:!0},appendToBody:{type:Boolean,default:!1},lockScroll:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},width:String,fullscreen:Boolean,customClass:{type:String,default:\"\"},top:{type:String,default:\"15vh\"},beforeClose:Function,center:{type:Boolean,default:!1}},data:function(){return{closed:!1}},watch:{visible:function(e){var t=this;e?(this.closed=!1,this.$emit(\"open\"),this.$el.addEventListener(\"scroll\",this.updatePopper),this.$nextTick(function(){t.$refs.dialog.scrollTop=0}),this.appendToBody&&document.body.appendChild(this.$el)):(this.$el.removeEventListener(\"scroll\",this.updatePopper),this.closed||this.$emit(\"close\"))}},computed:{style:function(){var e={};return this.fullscreen||(e.marginTop=this.top,this.width&&(e.width=this.width)),e}},methods:{getMigratingConfig:function(){return{props:{size:\"size is removed.\"}}},handleWrapperClick:function(){this.closeOnClickModal&&this.handleClose()},handleClose:function(){\"function\"==typeof this.beforeClose?this.beforeClose(this.hide):this.hide()},hide:function(e){!1!==e&&(this.$emit(\"update:visible\",!1),this.$emit(\"close\"),this.closed=!0)},updatePopper:function(){this.broadcast(\"ElSelectDropdown\",\"updatePopper\"),this.broadcast(\"ElDropdownMenu\",\"updatePopper\")},afterEnter:function(){this.$emit(\"opened\")},afterLeave:function(){this.$emit(\"closed\")}},mounted:function(){this.visible&&(this.rendered=!0,this.open(),this.appendToBody&&document.body.appendChild(this.$el))},destroyed:function(){this.appendToBody&&this.$el&&this.$el.parentNode&&this.$el.parentNode.removeChild(this.$el)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"dialog-fade\"},on:{\"after-enter\":e.afterEnter,\"after-leave\":e.afterLeave}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-dialog__wrapper\",on:{click:function(t){if(t.target!==t.currentTarget)return null;e.handleWrapperClick(t)}}},[i(\"div\",{ref:\"dialog\",staticClass:\"el-dialog\",class:[{\"is-fullscreen\":e.fullscreen,\"el-dialog--center\":e.center},e.customClass],style:e.style,attrs:{role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":e.title||\"dialog\"}},[i(\"div\",{staticClass:\"el-dialog__header\"},[e._t(\"title\",[i(\"span\",{staticClass:\"el-dialog__title\"},[e._v(e._s(e.title))])]),e.showClose?i(\"button\",{staticClass:\"el-dialog__headerbtn\",attrs:{type:\"button\",\"aria-label\":\"Close\"},on:{click:e.handleClose}},[i(\"i\",{staticClass:\"el-dialog__close el-icon el-icon-close\"})]):e._e()],2),e.rendered?i(\"div\",{staticClass:\"el-dialog__body\"},[e._t(\"default\")],2):e._e(),e.$slots.footer?i(\"div\",{staticClass:\"el-dialog__footer\"},[e._t(\"footer\")],2):e._e()])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(130),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(131),s=i.n(n),r=i(135),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(18),r=n(s),o=i(8),a=n(o),l=i(12),u=n(l),c=i(132),d=n(c),h=i(1),f=n(h),p=i(9),m=n(p),v=i(4),g=i(30),b=n(g);t.default={name:\"ElAutocomplete\",mixins:[f.default,(0,b.default)(\"input\"),m.default],inheritAttrs:!1,componentName:\"ElAutocomplete\",components:{ElInput:a.default,ElAutocompleteSuggestions:d.default},directives:{Clickoutside:u.default},props:{valueKey:{type:String,default:\"value\"},popperClass:String,popperOptions:Object,placeholder:String,clearable:{type:Boolean,default:!1},disabled:Boolean,name:String,size:String,value:String,maxlength:Number,minlength:Number,autofocus:Boolean,fetchSuggestions:Function,triggerOnFocus:{type:Boolean,default:!0},customItem:String,selectWhenUnmatched:{type:Boolean,default:!1},prefixIcon:String,suffixIcon:String,label:String,debounce:{type:Number,default:300},placement:{type:String,default:\"bottom-start\"},hideLoading:Boolean,popperAppendToBody:{type:Boolean,default:!0}},data:function(){return{activated:!1,suggestions:[],loading:!1,highlightedIndex:-1,suggestionDisabled:!1}},computed:{suggestionVisible:function(){var e=this.suggestions;return(Array.isArray(e)&&e.length>0||this.loading)&&this.activated},id:function(){return\"el-autocomplete-\"+(0,v.generateId)()}},watch:{suggestionVisible:function(e){this.broadcast(\"ElAutocompleteSuggestions\",\"visible\",[e,this.$refs.input.$refs.input.offsetWidth])}},methods:{getMigratingConfig:function(){return{props:{\"custom-item\":\"custom-item is removed, use scoped slot instead.\",props:\"props is removed, use value-key instead.\"}}},getData:function(e){var t=this;this.suggestionDisabled||(this.loading=!0,this.fetchSuggestions(e,function(e){t.loading=!1,t.suggestionDisabled||(Array.isArray(e)?t.suggestions=e:console.error(\"[Element Error][Autocomplete]autocomplete suggestions must be an array\"))}))},handleChange:function(e){if(this.$emit(\"input\",e),this.suggestionDisabled=!1,!this.triggerOnFocus&&!e)return this.suggestionDisabled=!0,void(this.suggestions=[]);this.debouncedGetData(e)},handleFocus:function(e){this.activated=!0,this.$emit(\"focus\",e),this.triggerOnFocus&&this.debouncedGetData(this.value)},handleBlur:function(e){this.$emit(\"blur\",e)},handleClear:function(){this.activated=!1,this.$emit(\"clear\")},close:function(e){this.activated=!1},handleKeyEnter:function(e){var t=this;this.suggestionVisible&&this.highlightedIndex>=0&&this.highlightedIndex<this.suggestions.length?(e.preventDefault(),this.select(this.suggestions[this.highlightedIndex])):this.selectWhenUnmatched&&(this.$emit(\"select\",{value:this.value}),this.$nextTick(function(e){t.suggestions=[],t.highlightedIndex=-1}))},select:function(e){var t=this;this.$emit(\"input\",e[this.valueKey]),this.$emit(\"select\",e),this.$nextTick(function(e){t.suggestions=[],t.highlightedIndex=-1})},highlight:function(e){if(this.suggestionVisible&&!this.loading){if(e<0)return void(this.highlightedIndex=-1);e>=this.suggestions.length&&(e=this.suggestions.length-1);var t=this.$refs.suggestions.$el.querySelector(\".el-autocomplete-suggestion__wrap\"),i=t.querySelectorAll(\".el-autocomplete-suggestion__list li\"),n=i[e],s=t.scrollTop,r=n.offsetTop;r+n.scrollHeight>s+t.clientHeight&&(t.scrollTop+=n.scrollHeight),r<s&&(t.scrollTop-=n.scrollHeight),this.highlightedIndex=e,this.$el.querySelector(\".el-input__inner\").setAttribute(\"aria-activedescendant\",this.id+\"-item-\"+this.highlightedIndex)}}},mounted:function(){var e=this;this.debouncedGetData=(0,r.default)(this.debounce,this.getData),this.$on(\"item-click\",function(t){e.select(t)});var t=this.$el.querySelector(\".el-input__inner\");t.setAttribute(\"role\",\"textbox\"),t.setAttribute(\"aria-autocomplete\",\"list\"),t.setAttribute(\"aria-controls\",\"id\"),t.setAttribute(\"aria-activedescendant\",this.id+\"-item-\"+this.highlightedIndex)},beforeDestroy:function(){this.$refs.suggestions.$destroy()}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(133),s=i.n(n),r=i(134),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(11),r=n(s),o=i(1),a=n(o),l=i(26),u=n(l);t.default={components:{ElScrollbar:u.default},mixins:[r.default,a.default],componentName:\"ElAutocompleteSuggestions\",data:function(){return{parent:this.$parent,dropdownWidth:\"\"}},props:{options:{default:function(){return{gpuAcceleration:!1}}},id:String},methods:{select:function(e){this.dispatch(\"ElAutocomplete\",\"item-click\",e)}},updated:function(){var e=this;this.$nextTick(function(t){e.popperJS&&e.updatePopper()})},mounted:function(){this.$parent.popperElm=this.popperElm=this.$el,this.referenceElm=this.$parent.$refs.input.$refs.input,this.referenceList=this.$el.querySelector(\".el-autocomplete-suggestion__list\"),this.referenceList.setAttribute(\"role\",\"listbox\"),this.referenceList.setAttribute(\"id\",this.id)},created:function(){var e=this;this.$on(\"visible\",function(t,i){e.dropdownWidth=i+\"px\",e.showPopper=t})}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":e.doDestroy}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showPopper,expression:\"showPopper\"}],staticClass:\"el-autocomplete-suggestion el-popper\",class:{\"is-loading\":!e.parent.hideLoading&&e.parent.loading},style:{width:e.dropdownWidth},attrs:{role:\"region\"}},[i(\"el-scrollbar\",{attrs:{tag:\"ul\",\"wrap-class\":\"el-autocomplete-suggestion__wrap\",\"view-class\":\"el-autocomplete-suggestion__list\"}},[!e.parent.hideLoading&&e.parent.loading?i(\"li\",[i(\"i\",{staticClass:\"el-icon-loading\"})]):e._t(\"default\")],2)],1)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.close,expression:\"close\"}],staticClass:\"el-autocomplete\",attrs:{\"aria-haspopup\":\"listbox\",role:\"combobox\",\"aria-expanded\":e.suggestionVisible,\"aria-owns\":e.id}},[i(\"el-input\",e._b({ref:\"input\",on:{input:e.handleChange,focus:e.handleFocus,blur:e.handleBlur,clear:e.handleClear},nativeOn:{keydown:[function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"up\",38,t.key))return null;t.preventDefault(),e.highlight(e.highlightedIndex-1)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"down\",40,t.key))return null;t.preventDefault(),e.highlight(e.highlightedIndex+1)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleKeyEnter(t)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"tab\",9,t.key))return null;e.close(t)}]}},\"el-input\",[e.$props,e.$attrs],!1),[e.$slots.prepend?i(\"template\",{attrs:{slot:\"prepend\"},slot:\"prepend\"},[e._t(\"prepend\")],2):e._e(),e.$slots.append?i(\"template\",{attrs:{slot:\"append\"},slot:\"append\"},[e._t(\"append\")],2):e._e(),e.$slots.prefix?i(\"template\",{attrs:{slot:\"prefix\"},slot:\"prefix\"},[e._t(\"prefix\")],2):e._e(),e.$slots.suffix?i(\"template\",{attrs:{slot:\"suffix\"},slot:\"suffix\"},[e._t(\"suffix\")],2):e._e()],2),i(\"el-autocomplete-suggestions\",{ref:\"suggestions\",class:[e.popperClass?e.popperClass:\"\"],attrs:{\"visible-arrow\":\"\",\"popper-options\":e.popperOptions,\"append-to-body\":e.popperAppendToBody,placement:e.placement,id:e.id}},e._l(e.suggestions,function(t,n){return i(\"li\",{key:n,class:{highlighted:e.highlightedIndex===n},attrs:{id:e.id+\"-item-\"+n,role:\"option\",\"aria-selected\":e.highlightedIndex===n},on:{click:function(i){e.select(t)}}},[e._t(\"default\",[e._v(\"\\n        \"+e._s(t[e.valueKey])+\"\\n      \")],{item:t})],2)}))],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(137),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(138),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(12),r=n(s),o=i(1),a=n(o),l=i(9),u=n(l),c=i(19),d=n(c),h=i(70),f=n(h),p=i(4);t.default={name:\"ElDropdown\",componentName:\"ElDropdown\",mixins:[a.default,u.default],directives:{Clickoutside:r.default},components:{ElButton:d.default,ElButtonGroup:f.default},provide:function(){return{dropdown:this}},props:{trigger:{type:String,default:\"hover\"},type:String,size:{type:String,default:\"\"},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},placement:{type:String,default:\"bottom-end\"},visibleArrow:{default:!0},showTimeout:{type:Number,default:250},hideTimeout:{type:Number,default:150}},data:function(){return{timeout:null,visible:!1,triggerElm:null,menuItems:null,menuItemsArray:null,dropdownElm:null,focusing:!1,listId:\"dropdown-menu-\"+(0,p.generateId)()}},computed:{dropdownSize:function(){return this.size||(this.$ELEMENT||{}).size}},mounted:function(){this.$on(\"menu-item-click\",this.handleMenuItemClick),this.initEvent(),this.initAria()},watch:{visible:function(e){this.broadcast(\"ElDropdownMenu\",\"visible\",e),this.$emit(\"visible-change\",e)},focusing:function(e){var t=this.$el.querySelector(\".el-dropdown-selfdefine\");t&&(e?t.className+=\" focusing\":t.className=t.className.replace(\"focusing\",\"\"))}},methods:{getMigratingConfig:function(){return{props:{\"menu-align\":\"menu-align is renamed to placement.\"}}},show:function(){var e=this;this.triggerElm.disabled||(clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.visible=!0},\"click\"===this.trigger?0:this.showTimeout))},hide:function(){var e=this;this.triggerElm.disabled||(this.removeTabindex(),this.resetTabindex(this.triggerElm),clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.visible=!1},\"click\"===this.trigger?0:this.hideTimeout))},handleClick:function(){this.triggerElm.disabled||(this.visible?this.hide():this.show())},handleTriggerKeyDown:function(e){var t=e.keyCode;[38,40].indexOf(t)>-1?(this.removeTabindex(),this.resetTabindex(this.menuItems[0]),this.menuItems[0].focus(),e.preventDefault(),e.stopPropagation()):13===t?this.handleClick():[9,27].indexOf(t)>-1&&this.hide()},handleItemKeyDown:function(e){var t=e.keyCode,i=e.target,n=this.menuItemsArray.indexOf(i),s=this.menuItemsArray.length-1,r=void 0;[38,40].indexOf(t)>-1?(r=38===t?0!==n?n-1:0:n<s?n+1:s,this.removeTabindex(),this.resetTabindex(this.menuItems[r]),this.menuItems[r].focus(),e.preventDefault(),e.stopPropagation()):13===t?(this.triggerElm.focus(),i.click(),this.hideOnClick&&(this.visible=!1)):[9,27].indexOf(t)>-1&&(this.hide(),this.triggerElm.focus())},resetTabindex:function(e){this.removeTabindex(),e.setAttribute(\"tabindex\",\"0\")},removeTabindex:function(){this.triggerElm.setAttribute(\"tabindex\",\"-1\"),this.menuItemsArray.forEach(function(e){e.setAttribute(\"tabindex\",\"-1\")})},initAria:function(){this.dropdownElm.setAttribute(\"id\",this.listId),this.triggerElm.setAttribute(\"aria-haspopup\",\"list\"),this.triggerElm.setAttribute(\"aria-controls\",this.listId),this.menuItems=this.dropdownElm.querySelectorAll(\"[tabindex='-1']\"),this.menuItemsArray=Array.prototype.slice.call(this.menuItems),this.splitButton||(this.triggerElm.setAttribute(\"role\",\"button\"),this.triggerElm.setAttribute(\"tabindex\",\"0\"),this.triggerElm.setAttribute(\"class\",(this.triggerElm.getAttribute(\"class\")||\"\")+\" el-dropdown-selfdefine\"))},initEvent:function(){var e=this,t=this.trigger,i=this.show,n=this.hide,s=this.handleClick,r=this.splitButton,o=this.handleTriggerKeyDown,a=this.handleItemKeyDown;this.triggerElm=r?this.$refs.trigger.$el:this.$slots.default[0].elm;var l=this.dropdownElm=this.$slots.dropdown[0].elm;this.triggerElm.addEventListener(\"keydown\",o),l.addEventListener(\"keydown\",a,!0),r||(this.triggerElm.addEventListener(\"focus\",function(){e.focusing=!0}),this.triggerElm.addEventListener(\"blur\",function(){e.focusing=!1}),this.triggerElm.addEventListener(\"click\",function(){e.focusing=!1})),\"hover\"===t?(this.triggerElm.addEventListener(\"mouseenter\",i),this.triggerElm.addEventListener(\"mouseleave\",n),l.addEventListener(\"mouseenter\",i),l.addEventListener(\"mouseleave\",n)):\"click\"===t&&this.triggerElm.addEventListener(\"click\",s)},handleMenuItemClick:function(e,t){this.hideOnClick&&(this.visible=!1),this.$emit(\"command\",e,t)},focus:function(){this.triggerElm.focus&&this.triggerElm.focus()}},render:function(e){var t=this,i=this.hide,n=this.splitButton,s=this.type,r=this.dropdownSize,o=function(e){t.$emit(\"click\",e),i()},a=n?e(\"el-button-group\",null,[e(\"el-button\",{attrs:{type:s,size:r},nativeOn:{click:o}},[this.$slots.default]),e(\"el-button\",{ref:\"trigger\",attrs:{type:s,size:r},class:\"el-dropdown__caret-button\"},[e(\"i\",{class:\"el-dropdown__icon el-icon-arrow-down\"},[])])]):this.$slots.default;return e(\"div\",{class:\"el-dropdown\",directives:[{name:\"clickoutside\",value:i}]},[a,this.$slots.dropdown])}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(140),s=i.n(n),r=i(141),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElButton\",inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},props:{type:{type:String,default:\"default\"},size:String,icon:{type:String,default:\"\"},nativeType:{type:String,default:\"button\"},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},buttonSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},buttonDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},methods:{handleClick:function(e){this.$emit(\"click\",e)}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"button\",{staticClass:\"el-button\",class:[e.type?\"el-button--\"+e.type:\"\",e.buttonSize?\"el-button--\"+e.buttonSize:\"\",{\"is-disabled\":e.buttonDisabled,\"is-loading\":e.loading,\"is-plain\":e.plain,\"is-round\":e.round,\"is-circle\":e.circle}],attrs:{disabled:e.buttonDisabled||e.loading,autofocus:e.autofocus,type:e.nativeType},on:{click:e.handleClick}},[e.loading?i(\"i\",{staticClass:\"el-icon-loading\"}):e._e(),e.icon&&!e.loading?i(\"i\",{class:e.icon}):e._e(),e.$slots.default?i(\"span\",[e._t(\"default\")],2):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(143),s=i.n(n),r=i(144),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElButtonGroup\"}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-button-group\"},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(146),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(147),s=i.n(n),r=i(148),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(11),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElDropdownMenu\",componentName:\"ElDropdownMenu\",mixins:[s.default],props:{visibleArrow:{type:Boolean,default:!0},arrowOffset:{type:Number,default:0}},data:function(){return{size:this.dropdown.dropdownSize}},inject:[\"dropdown\"],created:function(){var e=this;this.$on(\"updatePopper\",function(){e.showPopper&&e.updatePopper()}),this.$on(\"visible\",function(t){e.showPopper=t})},mounted:function(){this.$parent.popperElm=this.popperElm=this.$el,this.referenceElm=this.$parent.$el},watch:{\"dropdown.placement\":{immediate:!0,handler:function(e){this.currentPlacement=e}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":e.doDestroy}},[i(\"ul\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showPopper,expression:\"showPopper\"}],staticClass:\"el-dropdown-menu el-popper\",class:[e.size&&\"el-dropdown-menu--\"+e.size]},[e._t(\"default\")],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(150),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(151),s=i.n(n),r=i(152),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElDropdownItem\",mixins:[s.default],props:{command:{},disabled:Boolean,divided:Boolean},methods:{handleClick:function(e){this.dispatch(\"ElDropdown\",\"menu-item-click\",[this.command,this])}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"li\",{staticClass:\"el-dropdown-menu__item\",class:{\"is-disabled\":e.disabled,\"el-dropdown-menu__item--divided\":e.divided},attrs:{\"aria-disabled\":e.disabled,tabindex:e.disabled?null:-1},on:{click:e.handleClick}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(154),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(155),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(1),r=n(s),o=i(9),a=n(o),l=i(156),u=n(l),c=i(5);t.default={name:\"ElMenu\",render:function(e){var t=e(\"ul\",{attrs:{role:\"menubar\"},key:+this.collapse,style:{backgroundColor:this.backgroundColor||\"\"},class:{\"el-menu--horizontal\":\"horizontal\"===this.mode,\"el-menu--collapse\":this.collapse,\"el-menu\":!0}},[this.$slots.default]);return this.collapseTransition?e(\"el-menu-collapse-transition\",null,[t]):t},componentName:\"ElMenu\",mixins:[r.default,a.default],provide:function(){return{rootMenu:this}},components:{\"el-menu-collapse-transition\":{functional:!0,render:function(e,t){return e(\"transition\",{props:{mode:\"out-in\"},on:{beforeEnter:function(e){e.style.opacity=.2},enter:function(e){(0,c.addClass)(e,\"el-opacity-transition\"),e.style.opacity=1},afterEnter:function(e){(0,c.removeClass)(e,\"el-opacity-transition\"),e.style.opacity=\"\"},beforeLeave:function(e){e.dataset||(e.dataset={}),(0,c.hasClass)(e,\"el-menu--collapse\")?((0,c.removeClass)(e,\"el-menu--collapse\"),e.dataset.oldOverflow=e.style.overflow,e.dataset.scrollWidth=e.clientWidth,(0,c.addClass)(e,\"el-menu--collapse\")):((0,c.addClass)(e,\"el-menu--collapse\"),e.dataset.oldOverflow=e.style.overflow,e.dataset.scrollWidth=e.clientWidth,(0,c.removeClass)(e,\"el-menu--collapse\")),e.style.width=e.scrollWidth+\"px\",e.style.overflow=\"hidden\"},leave:function(e){(0,c.addClass)(e,\"horizontal-collapse-transition\"),e.style.width=e.dataset.scrollWidth+\"px\"}}},t.children)}}},props:{mode:{type:String,default:\"vertical\"},defaultActive:{type:String,default:\"\"},defaultOpeneds:Array,uniqueOpened:Boolean,router:Boolean,menuTrigger:{type:String,default:\"hover\"},collapse:Boolean,backgroundColor:String,textColor:String,activeTextColor:String,collapseTransition:{type:Boolean,default:!0}},data:function(){return{activeIndex:this.defaultActive,openedMenus:this.defaultOpeneds&&!this.collapse?this.defaultOpeneds.slice(0):[],items:{},submenus:{}}},computed:{hoverBackground:function(){return this.backgroundColor?this.mixColor(this.backgroundColor,.2):\"\"},isMenuPopup:function(){return\"horizontal\"===this.mode||\"vertical\"===this.mode&&this.collapse}},watch:{defaultActive:\"updateActiveIndex\",defaultOpeneds:function(e){this.collapse||(this.openedMenus=e)},collapse:function(e){e&&(this.openedMenus=[]),this.broadcast(\"ElSubmenu\",\"toggle-collapse\",e)}},methods:{updateActiveIndex:function(e){var t=this.items[e]||this.items[this.activeIndex]||this.items[this.defaultActive];t?(this.activeIndex=t.index,this.initOpenedMenu()):this.activeIndex=null},getMigratingConfig:function(){return{props:{theme:\"theme is removed.\"}}},getColorChannels:function(e){if(e=e.replace(\"#\",\"\"),/^[0-9a-fA-F]{3}$/.test(e)){e=e.split(\"\");for(var t=2;t>=0;t--)e.splice(t,0,e[t]);e=e.join(\"\")}return/^[0-9a-fA-F]{6}$/.test(e)?{red:parseInt(e.slice(0,2),16),green:parseInt(e.slice(2,4),16),blue:parseInt(e.slice(4,6),16)}:{red:255,green:255,blue:255}},mixColor:function(e,t){var i=this.getColorChannels(e),n=i.red,s=i.green,r=i.blue;return t>0?(n*=1-t,s*=1-t,r*=1-t):(n+=(255-n)*t,s+=(255-s)*t,r+=(255-r)*t),\"rgb(\"+Math.round(n)+\", \"+Math.round(s)+\", \"+Math.round(r)+\")\"},addItem:function(e){this.$set(this.items,e.index,e)},removeItem:function(e){delete this.items[e.index]},addSubmenu:function(e){this.$set(this.submenus,e.index,e)},removeSubmenu:function(e){delete this.submenus[e.index]},openMenu:function(e,t){var i=this.openedMenus;-1===i.indexOf(e)&&(this.uniqueOpened&&(this.openedMenus=i.filter(function(e){return-1!==t.indexOf(e)})),this.openedMenus.push(e))},closeMenu:function(e){var t=this.openedMenus.indexOf(e);-1!==t&&this.openedMenus.splice(t,1)},handleSubmenuClick:function(e){var t=e.index,i=e.indexPath;-1!==this.openedMenus.indexOf(t)?(this.closeMenu(t),this.$emit(\"close\",t,i)):(this.openMenu(t,i),this.$emit(\"open\",t,i))},handleItemClick:function(e){var t=this,i=e.index,n=e.indexPath,s=this.activeIndex;this.activeIndex=e.index,this.$emit(\"select\",i,n,e),(\"horizontal\"===this.mode||this.collapse)&&(this.openedMenus=[]),this.router&&this.routeToItem(e,function(e){t.activeIndex=s,e&&console.error(e)})},initOpenedMenu:function(){var e=this,t=this.activeIndex,i=this.items[t];if(i&&\"horizontal\"!==this.mode&&!this.collapse){i.indexPath.forEach(function(t){var i=e.submenus[t];i&&e.openMenu(t,i.indexPath)})}},routeToItem:function(e,t){var i=e.route||e.index;try{this.$router.push(i,function(){},t)}catch(e){console.error(e)}},open:function(e){var t=this,i=this.submenus[e.toString()].indexPath;i.forEach(function(e){return t.openMenu(e,i)})},close:function(e){this.closeMenu(e)}},mounted:function(){this.initOpenedMenu(),this.$on(\"item-click\",this.handleItemClick),this.$on(\"submenu-click\",this.handleSubmenuClick),\"horizontal\"===this.mode&&new u.default(this.$el),this.$watch(\"items\",this.updateActiveIndex)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(157),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=function(e){this.domNode=e,this.init()};r.prototype.init=function(){var e=this.domNode.childNodes;[].filter.call(e,function(e){return 1===e.nodeType}).forEach(function(e){new s.default(e)})},t.default=r},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(46),r=n(s),o=i(158),a=n(o),l=function(e){this.domNode=e,this.submenu=null,this.init()};l.prototype.init=function(){this.domNode.setAttribute(\"tabindex\",\"0\");var e=this.domNode.querySelector(\".el-menu\");e&&(this.submenu=new a.default(this,e)),this.addListeners()},l.prototype.addListeners=function(){var e=this,t=r.default.keys;this.domNode.addEventListener(\"keydown\",function(i){var n=!1;switch(i.keyCode){case t.down:r.default.triggerEvent(i.currentTarget,\"mouseenter\"),e.submenu&&e.submenu.gotoSubIndex(0),n=!0;break;case t.up:r.default.triggerEvent(i.currentTarget,\"mouseenter\"),e.submenu&&e.submenu.gotoSubIndex(e.submenu.subMenuItems.length-1),n=!0;break;case t.tab:r.default.triggerEvent(i.currentTarget,\"mouseleave\");break;case t.enter:case t.space:n=!0,i.currentTarget.click()}n&&i.preventDefault()})},t.default=l},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(46),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=function(e,t){this.domNode=t,this.parent=e,this.subMenuItems=[],this.subIndex=0,this.init()};r.prototype.init=function(){this.subMenuItems=this.domNode.querySelectorAll(\"li\"),this.addListeners()},r.prototype.gotoSubIndex=function(e){e===this.subMenuItems.length?e=0:e<0&&(e=this.subMenuItems.length-1),this.subMenuItems[e].focus(),this.subIndex=e},r.prototype.addListeners=function(){var e=this,t=s.default.keys,i=this.parent.domNode;Array.prototype.forEach.call(this.subMenuItems,function(n){n.addEventListener(\"keydown\",function(n){var r=!1;switch(n.keyCode){case t.down:e.gotoSubIndex(e.subIndex+1),r=!0;break;case t.up:e.gotoSubIndex(e.subIndex-1),r=!0;break;case t.tab:s.default.triggerEvent(i,\"mouseleave\");break;case t.enter:case t.space:r=!0,n.currentTarget.click()}return r&&(n.preventDefault(),n.stopPropagation()),!1})})},t.default=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(160),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(161),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(32),r=n(s),o=i(71),a=n(o),l=i(1),u=n(l),c=i(11),d=n(c),h=i(12),f=n(h),p={props:{transformOrigin:{type:[Boolean,String],default:!1},offset:d.default.props.offset,boundariesPadding:d.default.props.boundariesPadding,popperOptions:d.default.props.popperOptions},data:d.default.data,methods:d.default.methods,beforeDestroy:d.default.beforeDestroy,deactivated:d.default.deactivated};t.default={name:\"ElSubmenu\",componentName:\"ElSubmenu\",mixins:[a.default,u.default,p],components:{ElCollapseTransition:r.default},directives:{Clickoutside:f.default},props:{index:{type:String,required:!0},showTimeout:{type:Number,default:300},hideTimeout:{type:Number,default:300},popperClass:String,disabled:Boolean,popperAppendToBody:{type:Boolean,default:void 0}},data:function(){return{popperJS:null,timeout:null,items:{},submenus:{},mouseInChild:!1}},watch:{opened:function(e){var t=this;this.isMenuPopup&&this.$nextTick(function(e){t.updatePopper()})}},computed:{appendToBody:function(){return void 0===this.popperAppendToBody?this.isFirstLevel:this.popperAppendToBody},menuTransitionName:function(){return this.rootMenu.collapse?\"el-zoom-in-left\":\"el-zoom-in-top\"},opened:function(){return this.rootMenu.openedMenus.indexOf(this.index)>-1},active:function(){var e=!1,t=this.submenus,i=this.items;return Object.keys(i).forEach(function(t){i[t].active&&(e=!0)}),Object.keys(t).forEach(function(i){t[i].active&&(e=!0)}),e},hoverBackground:function(){return this.rootMenu.hoverBackground},backgroundColor:function(){return this.rootMenu.backgroundColor||\"\"},activeTextColor:function(){return this.rootMenu.activeTextColor||\"\"},textColor:function(){return this.rootMenu.textColor||\"\"},mode:function(){return this.rootMenu.mode},isMenuPopup:function(){return this.rootMenu.isMenuPopup},titleStyle:function(){return\"horizontal\"!==this.mode?{color:this.textColor}:{borderBottomColor:this.active?this.rootMenu.activeTextColor?this.activeTextColor:\"\":\"transparent\",color:this.active?this.activeTextColor:this.textColor}},isFirstLevel:function(){for(var e=!0,t=this.$parent;t&&t!==this.rootMenu;){if([\"ElSubmenu\",\"ElMenuItemGroup\"].indexOf(t.$options.componentName)>-1){e=!1;break}t=t.$parent}return e}},methods:{handleCollapseToggle:function(e){e?this.initPopper():this.doDestroy()},addItem:function(e){this.$set(this.items,e.index,e)},removeItem:function(e){delete this.items[e.index]},addSubmenu:function(e){this.$set(this.submenus,e.index,e)},removeSubmenu:function(e){delete this.submenus[e.index]},handleClick:function(){var e=this.rootMenu,t=this.disabled;\"hover\"===e.menuTrigger&&\"horizontal\"===e.mode||e.collapse&&\"vertical\"===e.mode||t||this.dispatch(\"ElMenu\",\"submenu-click\",this)},handleMouseenter:function(){var e=this,t=this.rootMenu,i=this.disabled;\"click\"===t.menuTrigger&&\"horizontal\"===t.mode||!t.collapse&&\"vertical\"===t.mode||i||(this.dispatch(\"ElSubmenu\",\"mouse-enter-child\"),clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.rootMenu.openMenu(e.index,e.indexPath)},this.showTimeout))},handleMouseleave:function(){var e=this,t=this.rootMenu;\"click\"===t.menuTrigger&&\"horizontal\"===t.mode||!t.collapse&&\"vertical\"===t.mode||(this.dispatch(\"ElSubmenu\",\"mouse-leave-child\"),clearTimeout(this.timeout),this.timeout=setTimeout(function(){!e.mouseInChild&&e.rootMenu.closeMenu(e.index)},this.hideTimeout))},handleTitleMouseenter:function(){if(\"horizontal\"!==this.mode||this.rootMenu.backgroundColor){var e=this.$refs[\"submenu-title\"];e&&(e.style.backgroundColor=this.rootMenu.hoverBackground)}},handleTitleMouseleave:function(){if(\"horizontal\"!==this.mode||this.rootMenu.backgroundColor){var e=this.$refs[\"submenu-title\"];e&&(e.style.backgroundColor=this.rootMenu.backgroundColor||\"\")}},updatePlacement:function(){this.currentPlacement=\"horizontal\"===this.mode&&this.isFirstLevel?\"bottom-start\":\"right-start\"},initPopper:function(){this.referenceElm=this.$el,this.popperElm=this.$refs.menu,this.updatePlacement()},close:function(){var e=this;this.$nextTick(function(){e.opened&&e.rootMenu.closeMenu(e.index)})}},created:function(){var e=this;this.$on(\"toggle-collapse\",this.handleCollapseToggle),this.$on(\"mouse-enter-child\",function(){e.mouseInChild=!0,clearTimeout(e.timeout)}),this.$on(\"mouse-leave-child\",function(){e.mouseInChild=!1,clearTimeout(e.timeout)})},mounted:function(){this.parentMenu.addSubmenu(this),this.rootMenu.addSubmenu(this),this.initPopper()},beforeDestroy:function(){this.parentMenu.removeSubmenu(this),this.rootMenu.removeSubmenu(this)},render:function(e){var t=this.active,i=this.opened,n=this.paddingStyle,s=this.titleStyle,r=this.backgroundColor,o=this.rootMenu,a=this.currentPlacement,l=this.menuTransitionName,u=this.mode,c=this.disabled,d=this.popperClass,h=this.$slots,f=this.isFirstLevel,p=e(\"transition\",{attrs:{name:l}},[e(\"div\",{ref:\"menu\",directives:[{name:\"show\",value:i}],class:[\"el-menu--\"+u,d],on:{mouseenter:this.handleMouseenter,mouseleave:this.handleMouseleave,focus:this.handleMouseenter}},[e(\"ul\",{attrs:{role:\"menu\"},class:[\"el-menu el-menu--popup\",\"el-menu--popup-\"+a],style:{backgroundColor:o.backgroundColor||\"\"}},[h.default])])]),m=e(\"el-collapse-transition\",null,[e(\"ul\",{attrs:{role:\"menu\"},class:\"el-menu el-menu--inline\",directives:[{name:\"show\",value:i}],style:{backgroundColor:o.backgroundColor||\"\"}},[h.default])]),v=\"horizontal\"===o.mode&&f||\"vertical\"===o.mode&&!o.collapse?\"el-icon-arrow-down\":\"el-icon-arrow-right\";return e(\"li\",{class:{\"el-submenu\":!0,\"is-active\":t,\"is-opened\":i,\"is-disabled\":c},attrs:{role:\"menuitem\",\"aria-haspopup\":\"true\",\"aria-expanded\":i},on:{mouseenter:this.handleMouseenter,mouseleave:this.handleMouseleave,focus:this.handleMouseenter}/*,directives:[{name:\"clickoutside\",value:this.close}]*/},[e(\"div\",{class:\"el-submenu__title\",ref:\"submenu-title\",on:{click:this.handleClick,mouseenter:this.handleTitleMouseenter,mouseleave:this.handleTitleMouseleave},style:[n,s,{backgroundColor:r}]},[h.title,e(\"i\",{class:[\"el-submenu__icon-arrow\",v]},[])]),this.isMenuPopup?p:m])}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(163),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(164),s=i.n(n),r=i(166),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(71),r=n(s),o=i(33),a=n(o),l=i(1),u=n(l);t.default={name:\"ElMenuItem\",componentName:\"ElMenuItem\",mixins:[r.default,u.default],components:{ElTooltip:a.default},props:{index:{type:String,required:!0},route:[String,Object],disabled:Boolean},computed:{active:function(){return this.index===this.rootMenu.activeIndex},hoverBackground:function(){return this.rootMenu.hoverBackground},backgroundColor:function(){return this.rootMenu.backgroundColor||\"\"},activeTextColor:function(){return this.rootMenu.activeTextColor||\"\"},textColor:function(){return this.rootMenu.textColor||\"\"},mode:function(){return this.rootMenu.mode},itemStyle:function(){var e={color:this.active?this.activeTextColor:this.textColor};return\"horizontal\"!==this.mode||this.isNested||(e.borderBottomColor=this.active?this.rootMenu.activeTextColor?this.activeTextColor:\"\":\"transparent\"),e},isNested:function(){return this.parentMenu!==this.rootMenu}},methods:{onMouseEnter:function(){(\"horizontal\"!==this.mode||this.rootMenu.backgroundColor)&&(this.$el.style.backgroundColor=this.hoverBackground)},onMouseLeave:function(){(\"horizontal\"!==this.mode||this.rootMenu.backgroundColor)&&(this.$el.style.backgroundColor=this.backgroundColor)},handleClick:function(){this.disabled||(this.dispatch(\"ElMenu\",\"item-click\",this),this.$emit(\"click\",this))}},mounted:function(){this.parentMenu.addItem(this),this.rootMenu.addItem(this)},beforeDestroy:function(){this.parentMenu.removeItem(this),this.rootMenu.removeItem(this)}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(11),r=n(s),o=i(18),a=n(o),l=i(5),u=i(34),c=i(4),d=i(2),h=n(d);t.default={name:\"ElTooltip\",mixins:[r.default],props:{openDelay:{type:Number,default:0},disabled:Boolean,manual:Boolean,effect:{type:String,default:\"dark\"},arrowOffset:{type:Number,default:0},popperClass:String,content:String,visibleArrow:{default:!0},transition:{type:String,default:\"el-fade-in-linear\"},popperOptions:{default:function(){return{boundariesPadding:10,gpuAcceleration:!1}}},enterable:{type:Boolean,default:!0},hideAfter:{type:Number,default:0}},data:function(){return{timeoutPending:null,focusing:!1}},computed:{tooltipId:function(){return\"el-tooltip-\"+(0,c.generateId)()}},beforeCreate:function(){var e=this;this.$isServer||(this.popperVM=new h.default({data:{node:\"\"},render:function(e){return this.node}}).$mount(),this.debounceClose=(0,a.default)(200,function(){return e.handleClosePopper()}))},render:function(e){var t=this;if(this.popperVM&&(this.popperVM.node=e(\"transition\",{attrs:{name:this.transition},on:{afterLeave:this.doDestroy}},[e(\"div\",{on:{mouseleave:function(){t.setExpectedState(!1),t.debounceClose()},mouseenter:function(){t.setExpectedState(!0)}},ref:\"popper\",attrs:{role:\"tooltip\",id:this.tooltipId,\"aria-hidden\":this.disabled||!this.showPopper?\"true\":\"false\"},directives:[{name:\"show\",value:!this.disabled&&this.showPopper}],class:[\"el-tooltip__popper\",\"is-\"+this.effect,this.popperClass]},[this.$slots.content||this.content])])),!this.$slots.default||!this.$slots.default.length)return this.$slots.default;var i=(0,u.getFirstComponentChild)(this.$slots.default);if(!i)return i;var n=i.data=i.data||{};return n.staticClass=this.concatClass(n.staticClass,\"el-tooltip\"),i},mounted:function(){var e=this;this.referenceElm=this.$el,1===this.$el.nodeType&&(this.$el.setAttribute(\"aria-describedby\",this.tooltipId),this.$el.setAttribute(\"tabindex\",0),(0,l.on)(this.referenceElm,\"mouseenter\",this.show),(0,l.on)(this.referenceElm,\"mouseleave\",this.hide),(0,l.on)(this.referenceElm,\"focus\",function(){if(!e.$slots.default||!e.$slots.default.length)return void e.handleFocus();var t=e.$slots.default[0].componentInstance;t&&t.focus?t.focus():e.handleFocus()}),(0,l.on)(this.referenceElm,\"blur\",this.handleBlur),(0,l.on)(this.referenceElm,\"click\",this.removeFocusing))},watch:{focusing:function(e){e?(0,l.addClass)(this.referenceElm,\"focusing\"):(0,l.removeClass)(this.referenceElm,\"focusing\")}},methods:{show:function(){this.setExpectedState(!0),this.handleShowPopper()},hide:function(){this.setExpectedState(!1),this.debounceClose()},handleFocus:function(){this.focusing=!0,this.show()},handleBlur:function(){this.focusing=!1,this.hide()},removeFocusing:function(){this.focusing=!1},concatClass:function(e,t){return e&&e.indexOf(t)>-1?e:e?t?e+\" \"+t:e:t||\"\"},handleShowPopper:function(){var e=this;this.expectedState&&!this.manual&&(clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.showPopper=!0},this.openDelay),this.hideAfter>0&&(this.timeoutPending=setTimeout(function(){e.showPopper=!1},this.hideAfter)))},handleClosePopper:function(){this.enterable&&this.expectedState||this.manual||(clearTimeout(this.timeout),this.timeoutPending&&clearTimeout(this.timeoutPending),this.showPopper=!1,this.disabled&&this.doDestroy())},setExpectedState:function(e){!1===e&&clearTimeout(this.timeoutPending),this.expectedState=e}},destroyed:function(){var e=this.referenceElm;(0,l.off)(e,\"mouseenter\",this.show),(0,l.off)(e,\"mouseleave\",this.hide),(0,l.off)(e,\"focus\",this.handleFocus),(0,l.off)(e,\"blur\",this.handleBlur),(0,l.off)(e,\"click\",this.removeFocusing)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"li\",{staticClass:\"el-menu-item\",class:{\"is-active\":e.active,\"is-disabled\":e.disabled},style:[e.paddingStyle,e.itemStyle,{backgroundColor:e.backgroundColor}],attrs:{role:\"menuitem\",tabindex:\"-1\"},on:{click:e.handleClick,mouseenter:e.onMouseEnter,focus:e.onMouseEnter,blur:e.onMouseLeave,mouseleave:e.onMouseLeave}},[\"ElMenu\"===e.parentMenu.$options.componentName&&e.rootMenu.collapse&&e.$slots.title?i(\"el-tooltip\",{attrs:{effect:\"dark\",placement:\"right\"}},[i(\"div\",{attrs:{slot:\"content\"},slot:\"content\"},[e._t(\"title\")],2),i(\"div\",{staticStyle:{position:\"absolute\",left:\"0\",top:\"0\",height:\"100%\",width:\"100%\",display:\"inline-block\",\"box-sizing\":\"border-box\",padding:\"0 20px\"}},[e._t(\"default\")],2)]):[e._t(\"default\"),e._t(\"title\")]],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(168),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(169),s=i.n(n),r=i(170),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElMenuItemGroup\",componentName:\"ElMenuItemGroup\",inject:[\"rootMenu\"],props:{title:{type:String}},data:function(){return{paddingLeft:20}},computed:{levelPadding:function(){var e=20,t=this.$parent;if(this.rootMenu.collapse)return 20;for(;t&&\"ElMenu\"!==t.$options.componentName;)\"ElSubmenu\"===t.$options.componentName&&(e+=20),t=t.$parent;return e}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"li\",{staticClass:\"el-menu-item-group\"},[i(\"div\",{staticClass:\"el-menu-item-group__title\",style:{paddingLeft:e.levelPadding+\"px\"}},[e.$slots.title?e._t(\"title\"):[e._v(e._s(e.title))]],2),i(\"ul\",[e._t(\"default\")],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(172),s=i.n(n),r=i(173),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(8),r=n(s),o=i(30),a=n(o),l=i(73),u=n(l);t.default={name:\"ElInputNumber\",mixins:[(0,a.default)(\"input\")],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},directives:{repeatClick:u.default},components:{ElInput:r.default},props:{step:{type:Number,default:1},max:{type:Number,default:1/0},min:{type:Number,default:-1/0},value:{},disabled:Boolean,size:String,controls:{type:Boolean,default:!0},controlsPosition:{type:String,default:\"\"},name:String,label:String,placeholder:String,precision:{type:Number,validator:function(e){return e>=0&&e===parseInt(e,10)}}},data:function(){return{currentValue:0}},watch:{value:{immediate:!0,handler:function(e){var t=void 0===e?e:Number(e);if(void 0!==t){if(isNaN(t))return;void 0!==this.precision&&(t=this.toPrecision(t,this.precision))}t>=this.max&&(t=this.max),t<=this.min&&(t=this.min),this.currentValue=t,this.$emit(\"input\",t)}}},computed:{minDisabled:function(){return this._decrease(this.value,this.step)<this.min},maxDisabled:function(){return this._increase(this.value,this.step)>this.max},numPrecision:function(){var e=this.value,t=this.step,i=this.getPrecision,n=this.precision,s=i(t);return void 0!==n?(s>n&&console.warn(\"[Element Warn][InputNumber]precision should not be less than the decimal places of step\"),n):Math.max(i(e),s)},controlsAtRight:function(){return this.controls&&\"right\"===this.controlsPosition},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},inputNumberSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},inputNumberDisabled:function(){return this.disabled||(this.elForm||{}).disabled},currentInputValue:function(){var e=this.currentValue;return\"number\"==typeof e&&void 0!==this.precision?e.toFixed(this.precision):e}},methods:{toPrecision:function(e,t){return void 0===t&&(t=this.numPrecision),parseFloat(parseFloat(Number(e).toFixed(t)))},getPrecision:function(e){if(void 0===e)return 0;var t=e.toString(),i=t.indexOf(\".\"),n=0;return-1!==i&&(n=t.length-i-1),n},_increase:function(e,t){if(\"number\"!=typeof e&&void 0!==e)return this.currentValue;var i=Math.pow(10,this.numPrecision);return this.toPrecision((i*e+i*t)/i)},_decrease:function(e,t){if(\"number\"!=typeof e&&void 0!==e)return this.currentValue;var i=Math.pow(10,this.numPrecision);return this.toPrecision((i*e-i*t)/i)},increase:function(){if(!this.inputNumberDisabled&&!this.maxDisabled){var e=this.value||0,t=this._increase(e,this.step);this.setCurrentValue(t)}},decrease:function(){if(!this.inputNumberDisabled&&!this.minDisabled){var e=this.value||0,t=this._decrease(e,this.step);this.setCurrentValue(t)}},handleBlur:function(e){this.$emit(\"blur\",e),this.$refs.input.setCurrentValue(this.currentInputValue)},handleFocus:function(e){this.$emit(\"focus\",e)},setCurrentValue:function(e){var t=this.currentValue;if(\"number\"==typeof e&&void 0!==this.precision&&(e=this.toPrecision(e,this.precision)),e>=this.max&&(e=this.max),e<=this.min&&(e=this.min),t===e)return void this.$refs.input.setCurrentValue(this.currentInputValue);this.$emit(\"input\",e),this.$emit(\"change\",e,t),this.currentValue=e},handleInputChange:function(e){var t=\"\"===e?void 0:Number(e);isNaN(t)&&\"\"!==e||this.setCurrentValue(t)},select:function(){this.$refs.input.select()}},mounted:function(){var e=this.$refs.input.$refs.input;e.setAttribute(\"role\",\"spinbutton\"),e.setAttribute(\"aria-valuemax\",this.max),e.setAttribute(\"aria-valuemin\",this.min),e.setAttribute(\"aria-valuenow\",this.currentValue),e.setAttribute(\"aria-disabled\",this.inputNumberDisabled)},updated:function(){if(this.$refs&&this.$refs.input){this.$refs.input.$refs.input.setAttribute(\"aria-valuenow\",this.currentValue)}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{class:[\"el-input-number\",e.inputNumberSize?\"el-input-number--\"+e.inputNumberSize:\"\",{\"is-disabled\":e.inputNumberDisabled},{\"is-without-controls\":!e.controls},{\"is-controls-right\":e.controlsAtRight}],on:{dragstart:function(e){e.preventDefault()}}},[e.controls?i(\"span\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.decrease,expression:\"decrease\"}],staticClass:\"el-input-number__decrease\",class:{\"is-disabled\":e.minDisabled},attrs:{role:\"button\"},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.decrease(t)}}},[i(\"i\",{class:\"el-icon-\"+(e.controlsAtRight?\"arrow-down\":\"minus\")})]):e._e(),e.controls?i(\"span\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.increase,expression:\"increase\"}],staticClass:\"el-input-number__increase\",class:{\"is-disabled\":e.maxDisabled},attrs:{role:\"button\"},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.increase(t)}}},[i(\"i\",{class:\"el-icon-\"+(e.controlsAtRight?\"arrow-up\":\"plus\")})]):e._e(),i(\"el-input\",{ref:\"input\",attrs:{value:e.currentInputValue,placeholder:e.placeholder,disabled:e.inputNumberDisabled,size:e.inputNumberSize,max:e.max,min:e.min,name:e.name,label:e.label},on:{blur:e.handleBlur,focus:e.handleFocus,change:e.handleInputChange},nativeOn:{keydown:[function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"up\",38,t.key))return null;t.preventDefault(),e.increase(t)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"down\",40,t.key))return null;t.preventDefault(),e.decrease(t)}]}})],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(175),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(176),s=i.n(n),r=i(177),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElRadio\",mixins:[s.default],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},componentName:\"ElRadio\",props:{value:{},label:{},disabled:Boolean,name:String,border:Boolean,size:String},data:function(){return{focus:!1}},computed:{isGroup:function(){for(var e=this.$parent;e;){if(\"ElRadioGroup\"===e.$options.componentName)return this._radioGroup=e,!0;e=e.$parent}return!1},model:{get:function(){return this.isGroup?this._radioGroup.value:this.value},set:function(e){this.isGroup?this.dispatch(\"ElRadioGroup\",\"input\",[e]):this.$emit(\"input\",e)}},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},radioSize:function(){var e=this.size||this._elFormItemSize||(this.$ELEMENT||{}).size;return this.isGroup?this._radioGroup.radioGroupSize||e:e},isDisabled:function(){return this.isGroup?this._radioGroup.disabled||this.disabled||(this.elForm||{}).disabled:this.disabled||(this.elForm||{}).disabled},tabIndex:function(){return this.isDisabled||this.isGroup&&this.model!==this.label?-1:0}},methods:{handleChange:function(){var e=this;this.$nextTick(function(){e.$emit(\"change\",e.model),e.isGroup&&e.dispatch(\"ElRadioGroup\",\"handleChange\",e.model)})}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"label\",{staticClass:\"el-radio\",class:[e.border&&e.radioSize?\"el-radio--\"+e.radioSize:\"\",{\"is-disabled\":e.isDisabled},{\"is-focus\":e.focus},{\"is-bordered\":e.border},{\"is-checked\":e.model===e.label}],attrs:{role:\"radio\",\"aria-checked\":e.model===e.label,\"aria-disabled\":e.isDisabled,tabindex:e.tabIndex},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"space\",32,t.key))return null;t.stopPropagation(),t.preventDefault(),e.model=e.isDisabled?e.model:e.label}}},[i(\"span\",{staticClass:\"el-radio__input\",class:{\"is-disabled\":e.isDisabled,\"is-checked\":e.model===e.label}},[i(\"span\",{staticClass:\"el-radio__inner\"}),i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.model,expression:\"model\"}],staticClass:\"el-radio__original\",attrs:{type:\"radio\",\"aria-hidden\":\"true\",name:e.name,disabled:e.isDisabled,tabindex:\"-1\"},domProps:{value:e.label,checked:e._q(e.model,e.label)},on:{focus:function(t){e.focus=!0},blur:function(t){e.focus=!1},change:[function(t){e.model=e.label},e.handleChange]}})]),i(\"span\",{staticClass:\"el-radio__label\",on:{keydown:function(e){e.stopPropagation()}}},[e._t(\"default\"),e.$slots.default?e._e():[e._v(e._s(e.label))]],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(179),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(180),s=i.n(n),r=i(181),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=Object.freeze({LEFT:37,UP:38,RIGHT:39,DOWN:40});t.default={name:\"ElRadioGroup\",componentName:\"ElRadioGroup\",inject:{elFormItem:{default:\"\"}},mixins:[s.default],props:{value:{},size:String,fill:String,textColor:String,disabled:Boolean},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},radioGroupSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size}},created:function(){var e=this;this.$on(\"handleChange\",function(t){e.$emit(\"change\",t)})},mounted:function(){var e=this.$el.querySelectorAll(\"[type=radio]\"),t=this.$el.querySelectorAll(\"[role=radio]\")[0];![].some.call(e,function(e){return e.checked})&&t&&(t.tabIndex=0)},methods:{handleKeydown:function(e){var t=e.target,i=\"INPUT\"===t.nodeName?\"[type=radio]\":\"[role=radio]\",n=this.$el.querySelectorAll(i),s=n.length,o=[].indexOf.call(n,t),a=this.$el.querySelectorAll(\"[role=radio]\");switch(e.keyCode){case r.LEFT:case r.UP:e.stopPropagation(),e.preventDefault(),0===o?(a[s-1].click(),a[s-1].focus()):(a[o-1].click(),a[o-1].focus());break;case r.RIGHT:case r.DOWN:o===s-1?(e.stopPropagation(),e.preventDefault(),a[0].click(),a[0].focus()):(a[o+1].click(),a[o+1].focus())}}},watch:{value:function(e){this.dispatch(\"ElFormItem\",\"el.form.change\",[this.value])}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-radio-group\",attrs:{role:\"radiogroup\"},on:{keydown:e.handleKeydown}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(183),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(184),s=i.n(n),r=i(185),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElRadioButton\",mixins:[s.default],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},props:{label:{},disabled:Boolean,name:String},data:function(){return{focus:!1}},computed:{value:{get:function(){return this._radioGroup.value},set:function(e){this._radioGroup.$emit(\"input\",e)}},_radioGroup:function(){for(var e=this.$parent;e;){if(\"ElRadioGroup\"===e.$options.componentName)return e;e=e.$parent}return!1},activeStyle:function(){return{backgroundColor:this._radioGroup.fill||\"\",borderColor:this._radioGroup.fill||\"\",boxShadow:this._radioGroup.fill?\"-1px 0 0 0 \"+this._radioGroup.fill:\"\",color:this._radioGroup.textColor||\"\"}},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},size:function(){return this._radioGroup.radioGroupSize||this._elFormItemSize||(this.$ELEMENT||{}).size},isDisabled:function(){return this.disabled||this._radioGroup.disabled||(this.elForm||{}).disabled},tabIndex:function(){return this.isDisabled||this._radioGroup&&this.value!==this.label?-1:0}},methods:{handleChange:function(){var e=this;this.$nextTick(function(){e.dispatch(\"ElRadioGroup\",\"handleChange\",e.value)})}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"label\",{staticClass:\"el-radio-button\",class:[e.size?\"el-radio-button--\"+e.size:\"\",{\"is-active\":e.value===e.label},{\"is-disabled\":e.isDisabled},{\"is-focus\":e.focus}],attrs:{role:\"radio\",\"aria-checked\":e.value===e.label,\"aria-disabled\":e.isDisabled,tabindex:e.tabIndex},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"space\",32,t.key))return null;t.stopPropagation(),t.preventDefault(),e.value=e.isDisabled?e.value:e.label}}},[i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.value,expression:\"value\"}],staticClass:\"el-radio-button__orig-radio\",attrs:{type:\"radio\",name:e.name,disabled:e.isDisabled,tabindex:\"-1\"},domProps:{value:e.label,checked:e._q(e.value,e.label)},on:{change:[function(t){e.value=e.label},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}),i(\"span\",{staticClass:\"el-radio-button__inner\",style:e.value===e.label?e.activeStyle:null,on:{keydown:function(e){e.stopPropagation()}}},[e._t(\"default\"),e.$slots.default?e._e():[e._v(e._s(e.label))]],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(187),s=i.n(n),r=i(188),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElCheckbox\",mixins:[s.default],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},componentName:\"ElCheckbox\",data:function(){return{selfModel:!1,focus:!1,isLimitExceeded:!1}},computed:{model:{get:function(){return this.isGroup?this.store:void 0!==this.value?this.value:this.selfModel},set:function(e){this.isGroup?(this.isLimitExceeded=!1,void 0!==this._checkboxGroup.min&&e.length<this._checkboxGroup.min&&(this.isLimitExceeded=!0),void 0!==this._checkboxGroup.max&&e.length>this._checkboxGroup.max&&(this.isLimitExceeded=!0),!1===this.isLimitExceeded&&this.dispatch(\"ElCheckboxGroup\",\"input\",[e])):(this.$emit(\"input\",e),this.selfModel=e)}},isChecked:function(){return\"[object Boolean]\"==={}.toString.call(this.model)?this.model:Array.isArray(this.model)?this.model.indexOf(this.label)>-1:null!==this.model&&void 0!==this.model?this.model===this.trueLabel:void 0},isGroup:function(){for(var e=this.$parent;e;){if(\"ElCheckboxGroup\"===e.$options.componentName)return this._checkboxGroup=e,!0;e=e.$parent}return!1},store:function(){return this._checkboxGroup?this._checkboxGroup.value:this.value},isDisabled:function(){return this.isGroup?this._checkboxGroup.disabled||this.disabled||(this.elForm||{}).disabled:this.disabled||(this.elForm||{}).disabled},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},checkboxSize:function(){var e=this.size||this._elFormItemSize||(this.$ELEMENT||{}).size;return this.isGroup?this._checkboxGroup.checkboxGroupSize||e:e}},props:{value:{},label:{},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:String,trueLabel:[String,Number],falseLabel:[String,Number],id:String,controls:String,border:Boolean,size:String},methods:{addToStore:function(){Array.isArray(this.model)&&-1===this.model.indexOf(this.label)?this.model.push(this.label):this.model=this.trueLabel||!0},handleChange:function(e){var t=this;if(!this.isLimitExceeded){var i=void 0;i=e.target.checked?void 0===this.trueLabel||this.trueLabel:void 0!==this.falseLabel&&this.falseLabel,this.$emit(\"change\",i,e),this.$nextTick(function(){t.isGroup&&t.dispatch(\"ElCheckboxGroup\",\"change\",[t._checkboxGroup.value])})}}},created:function(){this.checked&&this.addToStore()},mounted:function(){this.indeterminate&&this.$el.setAttribute(\"aria-controls\",this.controls)},watch:{value:function(e){this.dispatch(\"ElFormItem\",\"el.form.change\",e)}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"label\",{staticClass:\"el-checkbox\",class:[e.border&&e.checkboxSize?\"el-checkbox--\"+e.checkboxSize:\"\",{\"is-disabled\":e.isDisabled},{\"is-bordered\":e.border},{\"is-checked\":e.isChecked}],attrs:{role:\"checkbox\",\"aria-checked\":e.indeterminate?\"mixed\":e.isChecked,\"aria-disabled\":e.isDisabled,id:e.id}},[i(\"span\",{staticClass:\"el-checkbox__input\",class:{\"is-disabled\":e.isDisabled,\"is-checked\":e.isChecked,\"is-indeterminate\":e.indeterminate,\"is-focus\":e.focus},attrs:{\"aria-checked\":\"mixed\"}},[i(\"span\",{staticClass:\"el-checkbox__inner\"}),e.trueLabel||e.falseLabel?i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.model,expression:\"model\"}],staticClass:\"el-checkbox__original\",attrs:{type:\"checkbox\",\"aria-hidden\":\"true\",name:e.name,disabled:e.isDisabled,\"true-value\":e.trueLabel,\"false-value\":e.falseLabel},domProps:{checked:Array.isArray(e.model)?e._i(e.model,null)>-1:e._q(e.model,e.trueLabel)},on:{change:[function(t){var i=e.model,n=t.target,s=n.checked?e.trueLabel:e.falseLabel;if(Array.isArray(i)){var r=e._i(i,null);n.checked?r<0&&(e.model=i.concat([null])):r>-1&&(e.model=i.slice(0,r).concat(i.slice(r+1)))}else e.model=s},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}):i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.model,expression:\"model\"}],staticClass:\"el-checkbox__original\",attrs:{type:\"checkbox\",\"aria-hidden\":\"true\",disabled:e.isDisabled,name:e.name},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var i=e.model,n=t.target,s=!!n.checked;if(Array.isArray(i)){var r=e.label,o=e._i(i,r);n.checked?o<0&&(e.model=i.concat([r])):o>-1&&(e.model=i.slice(0,o).concat(i.slice(o+1)))}else e.model=s},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}})]),e.$slots.default||e.label?i(\"span\",{staticClass:\"el-checkbox__label\"},[e._t(\"default\"),e.$slots.default?e._e():[e._v(e._s(e.label))]],2):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(190),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(191),s=i.n(n),r=i(192),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElCheckboxButton\",mixins:[s.default],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},data:function(){return{selfModel:!1,focus:!1,isLimitExceeded:!1}},props:{value:{},label:{},disabled:Boolean,checked:Boolean,name:String,trueLabel:[String,Number],falseLabel:[String,Number]},computed:{model:{get:function(){return this._checkboxGroup?this.store:void 0!==this.value?this.value:this.selfModel},set:function(e){this._checkboxGroup?(this.isLimitExceeded=!1,void 0!==this._checkboxGroup.min&&e.length<this._checkboxGroup.min&&(this.isLimitExceeded=!0),void 0!==this._checkboxGroup.max&&e.length>this._checkboxGroup.max&&(this.isLimitExceeded=!0),!1===this.isLimitExceeded&&this.dispatch(\"ElCheckboxGroup\",\"input\",[e])):void 0!==this.value?this.$emit(\"input\",e):this.selfModel=e}},isChecked:function(){return\"[object Boolean]\"==={}.toString.call(this.model)?this.model:Array.isArray(this.model)?this.model.indexOf(this.label)>-1:null!==this.model&&void 0!==this.model?this.model===this.trueLabel:void 0},_checkboxGroup:function(){for(var e=this.$parent;e;){if(\"ElCheckboxGroup\"===e.$options.componentName)return e;e=e.$parent}return!1},store:function(){return this._checkboxGroup?this._checkboxGroup.value:this.value},activeStyle:function(){return{backgroundColor:this._checkboxGroup.fill||\"\",borderColor:this._checkboxGroup.fill||\"\",color:this._checkboxGroup.textColor||\"\",\"box-shadow\":\"-1px 0 0 0 \"+this._checkboxGroup.fill}},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},size:function(){return this._checkboxGroup.checkboxGroupSize||this._elFormItemSize||(this.$ELEMENT||{}).size},isDisabled:function(){return this._checkboxGroup?this._checkboxGroup.disabled||this.disabled||(this.elForm||{}).disabled:this.disabled||(this.elForm||{}).disabled}},methods:{addToStore:function(){Array.isArray(this.model)&&-1===this.model.indexOf(this.label)?this.model.push(this.label):this.model=this.trueLabel||!0},handleChange:function(e){var t=this;if(!this.isLimitExceeded){var i=void 0;i=e.target.checked?void 0===this.trueLabel||this.trueLabel:void 0!==this.falseLabel&&this.falseLabel,this.$emit(\"change\",i,e),this.$nextTick(function(){t._checkboxGroup&&t.dispatch(\"ElCheckboxGroup\",\"change\",[t._checkboxGroup.value])})}}},created:function(){this.checked&&this.addToStore()}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"label\",{staticClass:\"el-checkbox-button\",class:[e.size?\"el-checkbox-button--\"+e.size:\"\",{\"is-disabled\":e.isDisabled},{\"is-checked\":e.isChecked},{\"is-focus\":e.focus}],attrs:{role:\"checkbox\",\"aria-checked\":e.isChecked,\"aria-disabled\":e.isDisabled}},[e.trueLabel||e.falseLabel?i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.model,expression:\"model\"}],staticClass:\"el-checkbox-button__original\",attrs:{type:\"checkbox\",name:e.name,disabled:e.isDisabled,\"true-value\":e.trueLabel,\"false-value\":e.falseLabel},domProps:{checked:Array.isArray(e.model)?e._i(e.model,null)>-1:e._q(e.model,e.trueLabel)},on:{change:[function(t){var i=e.model,n=t.target,s=n.checked?e.trueLabel:e.falseLabel;if(Array.isArray(i)){var r=e._i(i,null);n.checked?r<0&&(e.model=i.concat([null])):r>-1&&(e.model=i.slice(0,r).concat(i.slice(r+1)))}else e.model=s},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}):i(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.model,expression:\"model\"}],staticClass:\"el-checkbox-button__original\",attrs:{type:\"checkbox\",name:e.name,disabled:e.isDisabled},domProps:{value:e.label,checked:Array.isArray(e.model)?e._i(e.model,e.label)>-1:e.model},on:{change:[function(t){var i=e.model,n=t.target,s=!!n.checked;if(Array.isArray(i)){var r=e.label,o=e._i(i,r);n.checked?o<0&&(e.model=i.concat([r])):o>-1&&(e.model=i.slice(0,o).concat(i.slice(o+1)))}else e.model=s},e.handleChange],focus:function(t){e.focus=!0},blur:function(t){e.focus=!1}}}),e.$slots.default||e.label?i(\"span\",{staticClass:\"el-checkbox-button__inner\",style:e.isChecked?e.activeStyle:null},[e._t(\"default\",[e._v(e._s(e.label))])],2):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(194),s=i.n(n),r=i(195),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElCheckboxGroup\",componentName:\"ElCheckboxGroup\",mixins:[s.default],inject:{elFormItem:{default:\"\"}},props:{value:{},disabled:Boolean,min:Number,max:Number,size:String,fill:String,textColor:String},computed:{_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},checkboxGroupSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size}},watch:{value:function(e){this.dispatch(\"ElFormItem\",\"el.form.change\",[e])}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-checkbox-group\",attrs:{role:\"group\",\"aria-label\":\"checkbox-group\"}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(197),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(198),s=i.n(n),r=i(199),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(30),r=n(s),o=i(9),a=n(o);t.default={name:\"ElSwitch\",mixins:[(0,r.default)(\"input\"),a.default],inject:{elForm:{default:\"\"}},props:{value:{type:[Boolean,String,Number],default:!1},disabled:{type:Boolean,default:!1},width:{type:Number,default:40},activeIconClass:{type:String,default:\"\"},inactiveIconClass:{type:String,default:\"\"},activeText:String,inactiveText:String,activeColor:{type:String,default:\"\"},inactiveColor:{type:String,default:\"\"},activeValue:{type:[Boolean,String,Number],default:!0},inactiveValue:{type:[Boolean,String,Number],default:!1},name:{type:String,default:\"\"},id:String},data:function(){return{coreWidth:this.width}},created:function(){~[this.activeValue,this.inactiveValue].indexOf(this.value)||this.$emit(\"input\",this.inactiveValue)},computed:{checked:function(){return this.value===this.activeValue},switchDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},watch:{checked:function(){this.$refs.input.checked=this.checked,(this.activeColor||this.inactiveColor)&&this.setBackgroundColor()}},methods:{handleChange:function(e){var t=this;this.$emit(\"input\",this.checked?this.inactiveValue:this.activeValue),this.$emit(\"change\",this.checked?this.inactiveValue:this.activeValue),this.$nextTick(function(){t.$refs.input.checked=t.checked})},setBackgroundColor:function(){var e=this.checked?this.activeColor:this.inactiveColor;this.$refs.core.style.borderColor=e,this.$refs.core.style.backgroundColor=e},switchValue:function(){!this.switchDisabled&&this.handleChange()},getMigratingConfig:function(){return{props:{\"on-color\":\"on-color is renamed to active-color.\",\"off-color\":\"off-color is renamed to inactive-color.\",\"on-text\":\"on-text is renamed to active-text.\",\"off-text\":\"off-text is renamed to inactive-text.\",\"on-value\":\"on-value is renamed to active-value.\",\"off-value\":\"off-value is renamed to inactive-value.\",\"on-icon-class\":\"on-icon-class is renamed to active-icon-class.\",\"off-icon-class\":\"off-icon-class is renamed to inactive-icon-class.\"}}}},mounted:function(){this.coreWidth=this.width||40,(this.activeColor||this.inactiveColor)&&this.setBackgroundColor(),this.$refs.input.checked=this.checked}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-switch\",class:{\"is-disabled\":e.switchDisabled,\"is-checked\":e.checked},attrs:{role:\"switch\",\"aria-checked\":e.checked,\"aria-disabled\":e.switchDisabled},on:{click:e.switchValue}},[i(\"input\",{ref:\"input\",staticClass:\"el-switch__input\",attrs:{type:\"checkbox\",id:e.id,name:e.name,\"true-value\":e.activeValue,\"false-value\":e.inactiveValue,disabled:e.switchDisabled},on:{change:e.handleChange,keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.switchValue(t)}}}),e.inactiveIconClass||e.inactiveText?i(\"span\",{class:[\"el-switch__label\",\"el-switch__label--left\",e.checked?\"\":\"is-active\"]},[e.inactiveIconClass?i(\"i\",{class:[e.inactiveIconClass]}):e._e(),!e.inactiveIconClass&&e.inactiveText?i(\"span\",{attrs:{\"aria-hidden\":e.checked}},[e._v(e._s(e.inactiveText))]):e._e()]):e._e(),i(\"span\",{ref:\"core\",staticClass:\"el-switch__core\",style:{width:e.coreWidth+\"px\"}}),e.activeIconClass||e.activeText?i(\"span\",{class:[\"el-switch__label\",\"el-switch__label--right\",e.checked?\"is-active\":\"\"]},[e.activeIconClass?i(\"i\",{class:[e.activeIconClass]}):e._e(),!e.activeIconClass&&e.activeText?i(\"span\",{attrs:{\"aria-hidden\":!e.checked}},[e._v(e._s(e.activeText))]):e._e()]):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(201),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(202),s=i.n(n),r=i(203),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(1),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={mixins:[s.default],name:\"ElOptionGroup\",componentName:\"ElOptionGroup\",props:{label:String,disabled:{type:Boolean,default:!1}},data:function(){return{visible:!0}},watch:{disabled:function(e){this.broadcast(\"ElOption\",\"handleGroupDisabled\",e)}},methods:{queryChange:function(){this.visible=this.$children&&Array.isArray(this.$children)&&this.$children.some(function(e){return!0===e.visible})}},created:function(){this.$on(\"queryChange\",this.queryChange)},mounted:function(){this.disabled&&this.broadcast(\"ElOption\",\"handleGroupDisabled\",this.disabled)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"ul\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-select-group__wrap\"},[i(\"li\",{staticClass:\"el-select-group__title\"},[e._v(e._s(e.label))]),i(\"li\",[i(\"ul\",{staticClass:\"el-select-group\"},[e._t(\"default\")],2)])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(205),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(206),s=i.n(n),r=i(222),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(15),r=n(s),o=i(18),a=n(o),l=i(27),u=i(207),c=n(u),d=i(6),h=n(d),f=i(9),p=n(f),m=i(213),v=n(m),g=i(214),b=n(g),y=i(215),_=n(y),C=i(216),x=n(C),w=i(221),k=n(w),S=1;t.default={name:\"ElTable\",mixins:[h.default,p.default],directives:{Mousewheel:c.default},props:{data:{type:Array,default:function(){return[]}},size:String,width:[String,Number],height:[String,Number],maxHeight:[String,Number],fit:{type:Boolean,default:!0},stripe:Boolean,border:Boolean,rowKey:[String,Function],context:{},showHeader:{type:Boolean,default:!0},showSummary:Boolean,sumText:String,summaryMethod:Function,rowClassName:[String,Function],rowStyle:[Object,Function],cellClassName:[String,Function],cellStyle:[Object,Function],headerRowClassName:[String,Function],headerRowStyle:[Object,Function],headerCellClassName:[String,Function],headerCellStyle:[Object,Function],highlightCurrentRow:Boolean,currentRowKey:[String,Number],emptyText:String,expandRowKeys:Array,defaultExpandAll:Boolean,defaultSort:Object,tooltipEffect:String,spanMethod:Function,selectOnIndeterminate:{type:Boolean,default:!0}},components:{TableHeader:x.default,TableFooter:k.default,TableBody:_.default,ElCheckbox:r.default},methods:{getMigratingConfig:function(){return{events:{expand:\"expand is renamed to expand-change\"}}},setCurrentRow:function(e){this.store.commit(\"setCurrentRow\",e)},toggleRowSelection:function(e,t){this.store.toggleRowSelection(e,t),this.store.updateAllSelected()},toggleRowExpansion:function(e,t){this.store.toggleRowExpansion(e,t)},clearSelection:function(){this.store.clearSelection()},clearFilter:function(e){this.store.clearFilter(e)},clearSort:function(){this.store.clearSort()},handleMouseLeave:function(){this.store.commit(\"setHoverRow\",null),this.hoverState&&(this.hoverState=null)},updateScrollY:function(){this.layout.updateScrollY(),this.layout.updateColumnsWidth()},handleFixedMousewheel:function(e,t){var i=this.bodyWrapper;if(Math.abs(t.spinY)>0){var n=i.scrollTop;t.pixelY<0&&0!==n&&e.preventDefault(),t.pixelY>0&&i.scrollHeight-i.clientHeight>n&&e.preventDefault(),i.scrollTop+=Math.ceil(t.pixelY/5)}else i.scrollLeft+=Math.ceil(t.pixelX/5)},handleHeaderFooterMousewheel:function(e,t){var i=t.pixelX,n=t.pixelY;Math.abs(i)>=Math.abs(n)&&(e.preventDefault(),this.bodyWrapper.scrollLeft+=t.pixelX/5)},bindEvents:function(){var e=this.$refs,t=e.headerWrapper,i=e.footerWrapper,n=this.$refs,s=this;this.bodyWrapper.addEventListener(\"scroll\",function(){t&&(t.scrollLeft=this.scrollLeft),i&&(i.scrollLeft=this.scrollLeft),n.fixedBodyWrapper&&(n.fixedBodyWrapper.scrollTop=this.scrollTop),n.rightFixedBodyWrapper&&(n.rightFixedBodyWrapper.scrollTop=this.scrollTop);var e=this.scrollWidth-this.offsetWidth-1,r=this.scrollLeft;s.scrollPosition=r>=e?\"right\":0===r?\"left\":\"middle\"}),this.fit&&(0,l.addResizeListener)(this.$el,this.resizeListener)},resizeListener:function(){if(this.$ready){var e=!1,t=this.$el,i=this.resizeState,n=i.width,s=i.height,r=t.offsetWidth;n!==r&&(e=!0);var o=t.offsetHeight;(this.height||this.shouldUpdateHeight)&&s!==o&&(e=!0),e&&(this.resizeState.width=r,this.resizeState.height=o,this.doLayout())}},doLayout:function(){this.layout.updateColumnsWidth(),this.shouldUpdateHeight&&this.layout.updateElsHeight()},sort:function(e,t){this.store.commit(\"sort\",{prop:e,order:t})},toggleAllSelection:function(){this.store.commit(\"toggleAllSelection\")}},created:function(){var e=this;this.tableId=\"el-table_\"+S++,this.debouncedUpdateLayout=(0,a.default)(50,function(){return e.doLayout()})},computed:{tableSize:function(){return this.size||(this.$ELEMENT||{}).size},bodyWrapper:function(){return this.$refs.bodyWrapper},shouldUpdateHeight:function(){return this.height||this.maxHeight||this.fixedColumns.length>0||this.rightFixedColumns.length>0},selection:function(){return this.store.states.selection},columns:function(){return this.store.states.columns},tableData:function(){return this.store.states.data},fixedColumns:function(){return this.store.states.fixedColumns},rightFixedColumns:function(){return this.store.states.rightFixedColumns},bodyWidth:function(){var e=this.layout,t=e.bodyWidth,i=e.scrollY,n=e.gutterWidth;return t?t-(i?n:0)+\"px\":\"\"},bodyHeight:function(){return this.height?{height:this.layout.bodyHeight?this.layout.bodyHeight+\"px\":\"\"}:this.maxHeight?{\"max-height\":(this.showHeader?this.maxHeight-this.layout.headerHeight-this.layout.footerHeight:this.maxHeight-this.layout.footerHeight)+\"px\"}:{}},fixedBodyHeight:function(){if(this.height)return{height:this.layout.fixedBodyHeight?this.layout.fixedBodyHeight+\"px\":\"\"};if(this.maxHeight){var e=this.layout.scrollX?this.maxHeight-this.layout.gutterWidth:this.maxHeight;return this.showHeader&&(e-=this.layout.headerHeight),e-=this.layout.footerHeight,{\"max-height\":e+\"px\"}}return{}},fixedHeight:function(){return this.maxHeight?this.showSummary?{bottom:0}:{bottom:this.layout.scrollX&&this.data.length?this.layout.gutterWidth+\"px\":\"\"}:this.showSummary?{height:this.layout.tableHeight?this.layout.tableHeight+\"px\":\"\"}:{height:this.layout.viewportHeight?this.layout.viewportHeight+\"px\":\"\"}}},watch:{height:{immediate:!0,handler:function(e){this.layout.setHeight(e)}},maxHeight:{immediate:!0,handler:function(e){this.layout.setMaxHeight(e)}},currentRowKey:function(e){this.store.setCurrentRowKey(e)},data:{immediate:!0,handler:function(e){var t=this;this.store.commit(\"setData\",e),this.$ready&&this.$nextTick(function(){t.doLayout()})}},expandRowKeys:{immediate:!0,handler:function(e){e&&this.store.setExpandRowKeys(e)}}},destroyed:function(){this.resizeListener&&(0,l.removeResizeListener)(this.$el,this.resizeListener)},mounted:function(){var e=this;this.bindEvents(),this.store.updateColumns(),this.doLayout(),this.resizeState={width:this.$el.offsetWidth,height:this.$el.offsetHeight},this.store.states.columns.forEach(function(t){t.filteredValue&&t.filteredValue.length&&e.store.commit(\"filterChange\",{column:t,values:t.filteredValue,silent:!0})}),this.$ready=!0},data:function(){var e=new v.default(this,{rowKey:this.rowKey,defaultExpandAll:this.defaultExpandAll,selectOnIndeterminate:this.selectOnIndeterminate});return{layout:new b.default({store:e,table:this,fit:this.fit,showHeader:this.showHeader}),store:e,isHidden:!1,renderExpanded:null,resizeProxyVisible:!1,resizeState:{width:null,height:null},isGroup:!1,scrollPosition:\"left\"}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(208),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=\"undefined\"!=typeof navigator&&navigator.userAgent.toLowerCase().indexOf(\"firefox\")>-1,o=function(e,t){e&&e.addEventListener&&e.addEventListener(r?\"DOMMouseScroll\":\"mousewheel\",function(e){var i=(0,s.default)(e);t&&t.apply(this,[e,i])})};t.default={bind:function(e,t){o(e,t.value)}}},function(e,t,i){e.exports=i(209)},function(e,t,i){\"use strict\";function n(e){var t=0,i=0,n=0,s=0;return\"detail\"in e&&(i=e.detail),\"wheelDelta\"in e&&(i=-e.wheelDelta/120),\"wheelDeltaY\"in e&&(i=-e.wheelDeltaY/120),\"wheelDeltaX\"in e&&(t=-e.wheelDeltaX/120),\"axis\"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=i,i=0),n=t*o,s=i*o,\"deltaY\"in e&&(s=e.deltaY),\"deltaX\"in e&&(n=e.deltaX),(n||s)&&e.deltaMode&&(1==e.deltaMode?(n*=a,s*=a):(n*=l,s*=l)),n&&!t&&(t=n<1?-1:1),s&&!i&&(i=s<1?-1:1),{spinX:t,spinY:i,pixelX:n,pixelY:s}}var s=i(210),r=i(211),o=10,a=40,l=800;n.getEventType=function(){return s.firefox()?\"DOMMouseScroll\":r(\"wheel\")?\"wheel\":\"mousewheel\"},e.exports=n},function(e,t){function i(){if(!b){b=!0;var e=navigator.userAgent,t=/(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))|(?:Trident\\/\\d+\\.\\d+.*rv:(\\d+\\.\\d+))/.exec(e),i=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(p=/\\b(iPhone|iP[ao]d)/.exec(e),m=/\\b(iP[ao]d)/.exec(e),h=/Android/i.exec(e),v=/FBAN\\/\\w+;/i.exec(e),g=/Mobile/i.exec(e),f=!!/Win64/.exec(e),t){n=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,n&&document&&document.documentMode&&(n=document.documentMode);var y=/(?:Trident\\/(\\d+.\\d+))/.exec(e);l=y?parseFloat(y[1])+4:n,s=t[2]?parseFloat(t[2]):NaN,r=t[3]?parseFloat(t[3]):NaN,o=t[4]?parseFloat(t[4]):NaN,o?(t=/(?:Chrome\\/(\\d+\\.\\d+))/.exec(e),a=t&&t[1]?parseFloat(t[1]):NaN):a=NaN}else n=s=r=a=o=NaN;if(i){if(i[1]){var _=/(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(e);u=!_||parseFloat(_[1].replace(\"_\",\".\"))}else u=!1;c=!!i[2],d=!!i[3]}else u=c=d=!1}}var n,s,r,o,a,l,u,c,d,h,f,p,m,v,g,b=!1,y={ie:function(){return i()||n},ieCompatibilityMode:function(){return i()||l>n},ie64:function(){return y.ie()&&f},firefox:function(){return i()||s},opera:function(){return i()||r},webkit:function(){return i()||o},safari:function(){return y.webkit()},chrome:function(){return i()||a},windows:function(){return i()||c},osx:function(){return i()||u},linux:function(){return i()||d},iphone:function(){return i()||p},mobile:function(){return i()||p||m||h||g},nativeApp:function(){return i()||v},android:function(){return i()||h},ipad:function(){return i()||m}};e.exports=y},function(e,t,i){\"use strict\";function n(e,t){if(!r.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var i=\"on\"+e,n=i in document;if(!n){var o=document.createElement(\"div\");o.setAttribute(i,\"return;\"),n=\"function\"==typeof o[i]}return!n&&s&&\"wheel\"===e&&(n=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),n}var s,r=i(212);r.canUseDOM&&(s=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature(\"\",\"\")),e.exports=n},function(e,t,i){\"use strict\";var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),s={canUseDOM:n,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen,isInWorker:!n};e.exports=s},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(18),a=n(o),l=i(10),u=n(l),c=i(5),d=i(74),h=function(e,t){var i=t.sortingColumn;return i&&\"string\"!=typeof i.sortable?(0,d.orderBy)(e,t.sortProp,t.sortOrder,i.sortMethod,i.sortBy):e},f=function(e,t){var i={};return(e||[]).forEach(function(e,n){i[(0,d.getRowIdentity)(e,t)]={row:e,index:n}}),i},p=function(e,t,i){var n=!1,s=e.selection,r=s.indexOf(t);return void 0===i?-1===r?(s.push(t),n=!0):(s.splice(r,1),n=!0):i&&-1===r?(s.push(t),n=!0):!i&&r>-1&&(s.splice(r,1),n=!0),n},m=function(e,t,i){var n=!1,s=e.expandRows;if(void 0!==i){var r=s.indexOf(t);i?-1===r&&(s.push(t),n=!0):-1!==r&&(s.splice(r,1),n=!0)}else{var o=s.indexOf(t);-1===o?(s.push(t),n=!0):(s.splice(o,1),n=!0)}return n},v=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e)throw new Error(\"Table is required.\");this.table=e,this.states={rowKey:null,_columns:[],originColumns:[],columns:[],fixedColumns:[],rightFixedColumns:[],leafColumns:[],fixedLeafColumns:[],rightFixedLeafColumns:[],leafColumnsLength:0,fixedLeafColumnsLength:0,rightFixedLeafColumnsLength:0,isComplex:!1,filteredData:null,data:null,sortingColumn:null,sortProp:null,sortOrder:null,isAllSelected:!1,selection:[],reserveSelection:!1,selectable:null,currentRow:null,hoverRow:null,filters:{},expandRows:[],defaultExpandAll:!1,selectOnIndeterminate:!1};for(var i in t)t.hasOwnProperty(i)&&this.states.hasOwnProperty(i)&&(this.states[i]=t[i])};v.prototype.mutations={setData:function(e,t){var i=this,n=e._data!==t;e._data=t,Object.keys(e.filters).forEach(function(n){var s=e.filters[n];if(s&&0!==s.length){var r=(0,d.getColumnById)(i.states,n);r&&r.filterMethod&&(t=t.filter(function(e){return s.some(function(t){return r.filterMethod.call(null,t,e,r)})}))}}),e.filteredData=t,e.data=h(t||[],e),this.updateCurrentRow();var s=e.rowKey;if(e.reserveSelection?s?function(){var t=e.selection,n=f(t,s);e.data.forEach(function(e){var i=(0,d.getRowIdentity)(e,s),r=n[i];r&&(t[r.index]=e)}),i.updateAllSelected()}():console.warn(\"WARN: rowKey is required when reserve-selection is enabled.\"):(n?this.clearSelection():this.cleanSelection(),this.updateAllSelected()),e.defaultExpandAll)this.states.expandRows=(e.data||[]).slice(0);else if(s){for(var o=f(this.states.expandRows,s),a=[],l=e.data,u=Array.isArray(l),c=0,l=u?l:l[Symbol.iterator]();;){var p;if(u){if(c>=l.length)break;p=l[c++]}else{if(c=l.next(),c.done)break;p=c.value}var m=p,v=(0,d.getRowIdentity)(m,s);o[v]&&a.push(m)}this.states.expandRows=a}else this.states.expandRows=[];r.default.nextTick(function(){return i.table.updateScrollY()})},changeSortCondition:function(e,t){var i=this;e.data=h(e.filteredData||e._data||[],e);var n=this.table,s=n.$el,o=n.highlightCurrentRow;if(s&&o){var a=e.data,l=s.querySelector(\"tbody\").children,u=[].filter.call(l,function(e){return(0,c.hasClass)(e,\"el-table__row\")}),d=u[a.indexOf(e.currentRow)];[].forEach.call(u,function(e){return(0,c.removeClass)(e,\"current-row\")}),(0,c.addClass)(d,\"current-row\")}t&&t.silent||this.table.$emit(\"sort-change\",{column:this.states.sortingColumn,prop:this.states.sortProp,order:this.states.sortOrder}),r.default.nextTick(function(){return i.table.updateScrollY()})},sort:function(e,t){var i=this,n=t.prop,s=t.order;n&&(e.sortProp=n,e.sortOrder=s||\"ascending\",r.default.nextTick(function(){for(var t=0,n=e.columns.length;t<n;t++){var s=e.columns[t];if(s.property===e.sortProp){s.order=e.sortOrder,e.sortingColumn=s;break}}e.sortingColumn&&i.commit(\"changeSortCondition\")}))},filterChange:function(e,t){var i=this,n=t.column,s=t.values,o=t.silent,a=t.multi;s&&!Array.isArray(s)&&(s=[s]);var l={};if(a)n.forEach(function(t){e.filters[t.id]=s,l[t.columnKey||t.id]=s});else{n.property&&(e.filters[n.id]=s,l[n.columnKey||n.id]=s)}var u=e._data;Object.keys(e.filters).forEach(function(t){var n=e.filters[t];if(n&&0!==n.length){var s=(0,d.getColumnById)(i.states,t);s&&s.filterMethod&&(u=u.filter(function(e){return n.some(function(t){return s.filterMethod.call(null,t,e,s)})}))}}),e.filteredData=u,e.data=h(u,e),o||this.table.$emit(\"filter-change\",l),r.default.nextTick(function(){return i.table.updateScrollY()})},insertColumn:function(e,t,i,n){var s=e._columns;n&&((s=n.children)||(s=n.children=[])),void 0!==i?s.splice(i,0,t):s.push(t),\"selection\"===t.type&&(e.selectable=t.selectable,e.reserveSelection=t.reserveSelection),this.table.$ready&&(this.updateColumns(),this.scheduleLayout())},removeColumn:function(e,t,i){var n=e._columns;i&&((n=i.children)||(n=i.children=[])),n&&n.splice(n.indexOf(t),1),this.table.$ready&&(this.updateColumns(),this.scheduleLayout())},setHoverRow:function(e,t){e.hoverRow=t},setCurrentRow:function(e,t){var i=e.currentRow;e.currentRow=t,i!==t&&this.table.$emit(\"current-change\",t,i)},rowSelectedChanged:function(e,t){var i=p(e,t),n=e.selection;if(i){var s=this.table;s.$emit(\"selection-change\",n?n.slice():[]),s.$emit(\"select\",n,t)}this.updateAllSelected()},toggleAllSelection:(0,a.default)(10,function(e){var t=e.data||[];if(0!==t.length){var i=this.states.selection,n=e.selectOnIndeterminate?!e.isAllSelected:!(e.isAllSelected||i.length),s=!1;t.forEach(function(t,i){e.selectable?e.selectable.call(null,t,i)&&p(e,t,n)&&(s=!0):p(e,t,n)&&(s=!0)});var r=this.table;s&&r.$emit(\"selection-change\",i?i.slice():[]),r.$emit(\"select-all\",i),e.isAllSelected=n}})};var g=function e(t){var i=[];return t.forEach(function(t){t.children?i.push.apply(i,e(t.children)):i.push(t)}),i};v.prototype.updateColumns=function(){var e=this.states,t=e._columns||[];e.fixedColumns=t.filter(function(e){return!0===e.fixed||\"left\"===e.fixed}),e.rightFixedColumns=t.filter(function(e){return\"right\"===e.fixed}),e.fixedColumns.length>0&&t[0]&&\"selection\"===t[0].type&&!t[0].fixed&&(t[0].fixed=!0,e.fixedColumns.unshift(t[0]));var i=t.filter(function(e){return!e.fixed});e.originColumns=[].concat(e.fixedColumns).concat(i).concat(e.rightFixedColumns);var n=g(i),s=g(e.fixedColumns),r=g(e.rightFixedColumns);e.leafColumnsLength=n.length,e.fixedLeafColumnsLength=s.length,e.rightFixedLeafColumnsLength=r.length,e.columns=[].concat(s).concat(n).concat(r),e.isComplex=e.fixedColumns.length>0||e.rightFixedColumns.length>0},v.prototype.isSelected=function(e){return(this.states.selection||[]).indexOf(e)>-1},v.prototype.clearSelection=function(){var e=this.states;e.isAllSelected=!1;var t=e.selection;e.selection.length&&(e.selection=[]),t.length>0&&this.table.$emit(\"selection-change\",e.selection?e.selection.slice():[])},v.prototype.setExpandRowKeys=function(e){var t=[],i=this.states.data,n=this.states.rowKey;if(!n)throw new Error(\"[Table] prop row-key should not be empty.\");var s=f(i,n);e.forEach(function(e){var i=s[e];i&&t.push(i.row)}),this.states.expandRows=t},v.prototype.toggleRowSelection=function(e,t){p(this.states,e,t)&&this.table.$emit(\"selection-change\",this.states.selection?this.states.selection.slice():[])},v.prototype.toggleRowExpansion=function(e,t){m(this.states,e,t)&&(this.table.$emit(\"expand-change\",e,this.states.expandRows),this.scheduleLayout())},v.prototype.isRowExpanded=function(e){var t=this.states,i=t.expandRows,n=void 0===i?[]:i,s=t.rowKey;if(s){return!!f(n,s)[(0,d.getRowIdentity)(e,s)]}return-1!==n.indexOf(e)},v.prototype.cleanSelection=function(){var e=this.states.selection||[],t=this.states.data,i=this.states.rowKey,n=void 0;if(i){n=[];var s=f(e,i),r=f(t,i);for(var o in s)s.hasOwnProperty(o)&&!r[o]&&n.push(s[o].row)}else n=e.filter(function(e){return-1===t.indexOf(e)});n.forEach(function(t){e.splice(e.indexOf(t),1)}),n.length&&this.table.$emit(\"selection-change\",e?e.slice():[])},v.prototype.clearFilter=function(e){var t=this,i=this.states,n=this.table.$refs,s=n.tableHeader,r=n.fixedTableHeader,o=n.rightFixedTableHeader,a={};s&&(a=(0,u.default)(a,s.filterPanels)),r&&(a=(0,u.default)(a,r.filterPanels)),o&&(a=(0,u.default)(a,o.filterPanels));var l=Object.keys(a);l.length&&(\"string\"==typeof e&&(e=[e]),Array.isArray(e)?function(){var n=e.map(function(e){return(0,d.getColumnByKey)(i,e)});l.forEach(function(e){n.find(function(t){return t.id===e})&&(a[e].filteredValue=[])}),t.commit(\"filterChange\",{column:n,value:[],silent:!0,multi:!0})}():(l.forEach(function(e){a[e].filteredValue=[]}),i.filters={},this.commit(\"filterChange\",{column:{},values:[],silent:!0})))},v.prototype.clearSort=function(){var e=this.states;e.sortingColumn&&(e.sortingColumn.order=null,e.sortProp=null,e.sortOrder=null,this.commit(\"changeSortCondition\",{silent:!0}))},v.prototype.updateAllSelected=function(){var e=this.states,t=e.selection,i=e.rowKey,n=e.selectable,s=e.data;if(!s||0===s.length)return void(e.isAllSelected=!1);var r=void 0;i&&(r=f(e.selection,i));for(var o=!0,a=0,l=0,u=s.length;l<u;l++){var c=s[l],h=n&&n.call(null,c,l);if(function(e){return r?!!r[(0,d.getRowIdentity)(e,i)]:-1!==t.indexOf(e)}(c))a++;else if(!n||h){o=!1;break}}0===a&&(o=!1),e.isAllSelected=o},v.prototype.scheduleLayout=function(e){e&&this.updateColumns(),this.table.debouncedUpdateLayout()},v.prototype.setCurrentRowKey=function(e){var t=this.states,i=t.rowKey;if(!i)throw new Error(\"[Table] row-key should not be empty.\");var n=t.data||[],s=f(n,i),r=s[e];t.currentRow=r?r.row:null},v.prototype.updateCurrentRow=function(){var e=this.states,t=this.table,i=e.data||[],n=e.currentRow;if(-1===i.indexOf(n)){if(e.rowKey&&n){for(var s=null,r=0;r<i.length;r++){var o=i[r];if(o&&o[e.rowKey]===n[e.rowKey]){s=o;break}}if(s)return void(e.currentRow=s)}e.currentRow=null,e.currentRow!==n&&t.$emit(\"current-change\",null,n)}},v.prototype.commit=function(e){var t=this.mutations;if(!t[e])throw new Error(\"Action not found: \"+e);for(var i=arguments.length,n=Array(i>1?i-1:0),s=1;s<i;s++)n[s-1]=arguments[s];t[e].apply(this,[this.states].concat(n))},t.default=v},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}function s(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var r=i(44),o=n(r),a=i(2),l=n(a),u=function(){function e(t){s(this,e),this.observers=[],this.table=null,this.store=null,this.columns=null,this.fit=!0,this.showHeader=!0,this.height=null,this.scrollX=!1,this.scrollY=!1,this.bodyWidth=null,this.fixedWidth=null,this.rightFixedWidth=null,this.tableHeight=null,this.headerHeight=44,this.appendHeight=0,this.footerHeight=44,this.viewportHeight=null,this.bodyHeight=null,this.fixedBodyHeight=null,this.gutterWidth=(0,o.default)();for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i]);if(!this.table)throw new Error(\"table is required for Table Layout\");if(!this.store)throw new Error(\"store is required for Table Layout\")}return e.prototype.updateScrollY=function(){var e=this.height;if(\"string\"==typeof e||\"number\"==typeof e){var t=this.table.bodyWrapper;if(this.table.$el&&t){var i=t.querySelector(\".el-table__body\");this.scrollY=i.offsetHeight>this.bodyHeight}}},e.prototype.setHeight=function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"height\";if(!l.default.prototype.$isServer){var n=this.table.$el;if(\"string\"==typeof e&&/^\\d+$/.test(e)&&(e=Number(e)),this.height=e,!n&&(e||0===e))return l.default.nextTick(function(){return t.setHeight(e,i)});\"number\"==typeof e?(n.style[i]=e+\"px\",this.updateElsHeight()):\"string\"==typeof e&&(n.style[i]=e,this.updateElsHeight())}},e.prototype.setMaxHeight=function(e){return this.setHeight(e,\"max-height\")},e.prototype.updateElsHeight=function(){var e=this;if(!this.table.$ready)return l.default.nextTick(function(){return e.updateElsHeight()});var t=this.table.$refs,i=t.headerWrapper,n=t.appendWrapper,s=t.footerWrapper;if(this.appendHeight=n?n.offsetHeight:0,!this.showHeader||i){var r=this.headerHeight=this.showHeader?i.offsetHeight:0;if(this.showHeader&&i.offsetWidth>0&&(this.table.columns||[]).length>0&&r<2)return l.default.nextTick(function(){return e.updateElsHeight()});var o=this.tableHeight=this.table.$el.clientHeight;if(null!==this.height&&(!isNaN(this.height)||\"string\"==typeof this.height)){var a=this.footerHeight=s?s.offsetHeight:0;this.bodyHeight=o-r-a+(s?1:0)}this.fixedBodyHeight=this.scrollX?this.bodyHeight-this.gutterWidth:this.bodyHeight;var u=!this.table.data||0===this.table.data.length;this.viewportHeight=this.scrollX?o-(u?0:this.gutterWidth):o,this.updateScrollY(),this.notifyObservers(\"scrollable\")}},e.prototype.getFlattenColumns=function(){var e=[];return this.table.columns.forEach(function(t){t.isColumnGroup?e.push.apply(e,t.columns):e.push(t)}),e},e.prototype.updateColumnsWidth=function(){if(!l.default.prototype.$isServer){var e=this.fit,t=this.table.$el.clientWidth,i=0,n=this.getFlattenColumns(),s=n.filter(function(e){return\"number\"!=typeof e.width});if(n.forEach(function(e){\"number\"==typeof e.width&&e.realWidth&&(e.realWidth=null)}),s.length>0&&e){n.forEach(function(e){i+=e.width||e.minWidth||80});var r=this.scrollY?this.gutterWidth:0;if(i<=t-r){this.scrollX=!1;var o=t-r-i;1===s.length?s[0].realWidth=(s[0].minWidth||80)+o:function(){var e=s.reduce(function(e,t){return e+(t.minWidth||80)},0),t=o/e,i=0;s.forEach(function(e,n){if(0!==n){var s=Math.floor((e.minWidth||80)*t);i+=s,e.realWidth=(e.minWidth||80)+s}}),s[0].realWidth=(s[0].minWidth||80)+o-i}()}else this.scrollX=!0,s.forEach(function(e){e.realWidth=e.minWidth});this.bodyWidth=Math.max(i,t),this.table.resizeState.width=this.bodyWidth}else n.forEach(function(e){e.width||e.minWidth?e.realWidth=e.width||e.minWidth:e.realWidth=80,i+=e.realWidth}),this.scrollX=i>t,this.bodyWidth=i;var a=this.store.states.fixedColumns;if(a.length>0){var u=0;a.forEach(function(e){u+=e.realWidth||e.width}),this.fixedWidth=u}var c=this.store.states.rightFixedColumns;if(c.length>0){var d=0;c.forEach(function(e){d+=e.realWidth||e.width}),this.rightFixedWidth=d}this.notifyObservers(\"columns\")}},e.prototype.addObserver=function(e){this.observers.push(e)},e.prototype.removeObserver=function(e){var t=this.observers.indexOf(e);-1!==t&&this.observers.splice(t,1)},e.prototype.notifyObservers=function(e){var t=this;this.observers.forEach(function(i){switch(e){case\"columns\":i.onColumnsChange(t);break;case\"scrollable\":i.onScrollableChange(t);break;default:throw new Error(\"Table Layout don't have event \"+e+\".\")}})},e}();t.default=u},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=i(74),o=i(5),a=i(15),l=n(a),u=i(33),c=n(u),d=i(18),h=n(d),f=i(48),p=n(f);t.default={name:\"ElTableBody\",mixins:[p.default],components:{ElCheckbox:l.default,ElTooltip:c.default},props:{store:{required:!0},stripe:Boolean,context:{},rowClassName:[String,Function],rowStyle:[Object,Function],fixed:String,highlight:Boolean},render:function(e){var t=this,i=this.columns.map(function(e,i){return t.isColumnHidden(i)});return e(\"table\",{class:\"el-table__body\",attrs:{cellspacing:\"0\",cellpadding:\"0\",border:\"0\"}},[e(\"colgroup\",null,[this._l(this.columns,function(t){return e(\"col\",{attrs:{name:t.id}},[])})]),e(\"tbody\",null,[this._l(this.data,function(n,s){return[e(\"tr\",{style:t.rowStyle?t.getRowStyle(n,s):null,key:t.table.rowKey?t.getKeyOfRow(n,s):s,on:{dblclick:function(e){return t.handleDoubleClick(e,n)},click:function(e){return t.handleClick(e,n)},contextmenu:function(e){return t.handleContextMenu(e,n)},mouseenter:function(e){return t.handleMouseEnter(s)},mouseleave:function(e){return t.handleMouseLeave()}},class:[t.getRowClass(n,s)]},[t._l(t.columns,function(r,o){var a=t.getSpan(n,r,s,o),l=a.rowspan,u=a.colspan;return l&&u?e(\"td\",{style:t.getCellStyle(s,o,n,r),class:t.getCellClass(s,o,n,r),attrs:{rowspan:l,colspan:u},on:{mouseenter:function(e){return t.handleCellMouseEnter(e,n)},mouseleave:t.handleCellMouseLeave}},[r.renderCell.call(t._renderProxy,e,{row:n,column:r,$index:s,store:t.store,_self:t.context||t.table.$vnode.context},i[o])]):\"\"})]),t.store.isRowExpanded(n)?e(\"tr\",null,[e(\"td\",{attrs:{colspan:t.columns.length},class:\"el-table__expanded-cell\"},[t.table.renderExpanded?t.table.renderExpanded(e,{row:n,$index:s,store:t.store}):\"\"])]):\"\"]}).concat(e(\"el-tooltip\",{attrs:{effect:this.table.tooltipEffect,placement:\"top\",content:this.tooltipContent},ref:\"tooltip\"},[]))])])},watch:{\"store.states.hoverRow\":function(e,t){if(this.store.states.isComplex){var i=this.$el;if(i){var n=i.querySelector(\"tbody\").children,s=[].filter.call(n,function(e){return(0,o.hasClass)(e,\"el-table__row\")}),r=s[t],a=s[e];r&&(0,o.removeClass)(r,\"hover-row\"),a&&(0,o.addClass)(a,\"hover-row\")}}},\"store.states.currentRow\":function(e,t){if(this.highlight){var i=this.$el;if(i){var n=this.store.states.data,s=i.querySelector(\"tbody\").children,r=[].filter.call(s,function(e){return(0,o.hasClass)(e,\"el-table__row\")}),a=r[n.indexOf(t)],l=r[n.indexOf(e)];a?(0,o.removeClass)(a,\"current-row\"):[].forEach.call(r,function(e){return(0,o.removeClass)(e,\"current-row\")}),l&&(0,o.addClass)(l,\"current-row\")}}}},computed:{table:function(){return this.$parent},data:function(){return this.store.states.data},columnsCount:function(){return this.store.states.columns.length},leftFixedLeafCount:function(){return this.store.states.fixedLeafColumnsLength},rightFixedLeafCount:function(){return this.store.states.rightFixedLeafColumnsLength},leftFixedCount:function(){return this.store.states.fixedColumns.length},rightFixedCount:function(){return this.store.states.rightFixedColumns.length},columns:function(){return this.store.states.columns}},data:function(){return{tooltipContent:\"\"}},created:function(){this.activateTooltip=(0,h.default)(50,function(e){return e.handleShowPopper()})},methods:{getKeyOfRow:function(e,t){var i=this.table.rowKey;return i?(0,r.getRowIdentity)(e,i):t},isColumnHidden:function(e){return!0===this.fixed||\"left\"===this.fixed?e>=this.leftFixedLeafCount:\"right\"===this.fixed?e<this.columnsCount-this.rightFixedLeafCount:e<this.leftFixedLeafCount||e>=this.columnsCount-this.rightFixedLeafCount},getSpan:function(e,t,i,n){var r=1,o=1,a=this.table.spanMethod;if(\"function\"==typeof a){var l=a({row:e,column:t,rowIndex:i,columnIndex:n});Array.isArray(l)?(r=l[0],o=l[1]):\"object\"===(void 0===l?\"undefined\":s(l))&&(r=l.rowspan,o=l.colspan)}return{rowspan:r,colspan:o}},getRowStyle:function(e,t){var i=this.table.rowStyle;return\"function\"==typeof i?i.call(null,{row:e,rowIndex:t}):i},getRowClass:function(e,t){var i=[\"el-table__row\"];this.table.highlightCurrentRow&&e===this.store.states.currentRow&&i.push(\"current-row\"),this.stripe&&t%2==1&&i.push(\"el-table__row--striped\");var n=this.table.rowClassName;return\"string\"==typeof n?i.push(n):\"function\"==typeof n&&i.push(n.call(null,{row:e,rowIndex:t})),this.store.states.expandRows.indexOf(e)>-1&&i.push(\"expanded\"),i.join(\" \")},getCellStyle:function(e,t,i,n){var s=this.table.cellStyle;return\"function\"==typeof s?s.call(null,{rowIndex:e,columnIndex:t,row:i,column:n}):s},getCellClass:function(e,t,i,n){var s=[n.id,n.align,n.className];this.isColumnHidden(t)&&s.push(\"is-hidden\");var r=this.table.cellClassName;return\"string\"==typeof r?s.push(r):\"function\"==typeof r&&s.push(r.call(null,{rowIndex:e,columnIndex:t,row:i,column:n})),s.join(\" \")},handleCellMouseEnter:function(e,t){var i=this.table,n=(0,r.getCell)(e);if(n){var s=(0,r.getColumnByCell)(i,n),a=i.hoverState={cell:n,column:s,row:t};i.$emit(\"cell-mouse-enter\",a.row,a.column,a.cell,e)}var l=e.target.querySelector(\".cell\");if((0,o.hasClass)(l,\"el-tooltip\")&&l.childNodes.length){var u=document.createRange();u.setStart(l,0),u.setEnd(l,l.childNodes.length);if((u.getBoundingClientRect().width+((parseInt((0,o.getStyle)(l,\"paddingLeft\"),10)||0)+(parseInt((0,o.getStyle)(l,\"paddingRight\"),10)||0))>l.offsetWidth||l.scrollWidth>l.offsetWidth)&&this.$refs.tooltip){var c=this.$refs.tooltip;this.tooltipContent=n.innerText||n.textContent,c.referenceElm=n,c.$refs.popper&&(c.$refs.popper.style.display=\"none\"),c.doDestroy(),c.setExpectedState(!0),this.activateTooltip(c)}}},handleCellMouseLeave:function(e){var t=this.$refs.tooltip;if(t&&(t.setExpectedState(!1),t.handleClosePopper()),(0,r.getCell)(e)){var i=this.table.hoverState||{};this.table.$emit(\"cell-mouse-leave\",i.row,i.column,i.cell,e)}},handleMouseEnter:function(e){this.store.commit(\"setHoverRow\",e)},handleMouseLeave:function(){this.store.commit(\"setHoverRow\",null)},handleContextMenu:function(e,t){this.handleEvent(e,t,\"contextmenu\")},handleDoubleClick:function(e,t){this.handleEvent(e,t,\"dblclick\")},handleClick:function(e,t){this.store.commit(\"setCurrentRow\",t),this.handleEvent(e,t,\"click\")},handleEvent:function(e,t,i){var n=this.table,s=(0,r.getCell)(e),o=void 0;s&&(o=(0,r.getColumnByCell)(n,s))&&n.$emit(\"cell-\"+i,t,o,s,e),n.$emit(\"row-\"+i,t,e,o)},handleExpandClick:function(e,t){t.stopPropagation(),this.store.toggleRowExpansion(e)}}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(5),r=i(15),o=n(r),a=i(31),l=n(a),u=i(2),c=n(u),d=i(217),h=n(d),f=i(48),p=n(f),m=function e(t){var i=[];return t.forEach(function(t){t.children?(i.push(t),i.push.apply(i,e(t.children))):i.push(t)}),i},v=function(e){var t=1,i=function e(i,n){if(n&&(i.level=n.level+1,t<i.level&&(t=i.level)),i.children){var s=0;i.children.forEach(function(t){e(t,i),s+=t.colSpan}),i.colSpan=s}else i.colSpan=1};e.forEach(function(e){e.level=1,i(e)});for(var n=[],s=0;s<t;s++)n.push([]);return m(e).forEach(function(e){e.children?e.rowSpan=1:e.rowSpan=t-e.level+1,n[e.level-1].push(e)}),n};t.default={name:\"ElTableHeader\",mixins:[p.default],render:function(e){var t=this,i=this.store.states.originColumns,n=v(i,this.columns),s=n.length>1;return s&&(this.$parent.isGroup=!0),e(\"table\",{class:\"el-table__header\",attrs:{cellspacing:\"0\",cellpadding:\"0\",border:\"0\"}},[e(\"colgroup\",null,[this._l(this.columns,function(t){return e(\"col\",{attrs:{name:t.id}},[])}),this.hasGutter?e(\"col\",{attrs:{name:\"gutter\"}},[]):\"\"]),e(\"thead\",{class:[{\"is-group\":s,\"has-gutter\":this.hasGutter}]},[this._l(n,function(i,n){return e(\"tr\",{style:t.getHeaderRowStyle(n),class:t.getHeaderRowClass(n)},[t._l(i,function(s,r){return e(\"th\",{attrs:{colspan:s.colSpan,rowspan:s.rowSpan},on:{mousemove:function(e){return t.handleMouseMove(e,s)},mouseout:t.handleMouseOut,mousedown:function(e){return t.handleMouseDown(e,s)},click:function(e){return t.handleHeaderClick(e,s)},contextmenu:function(e){return t.handleHeaderContextMenu(e,s)}},style:t.getHeaderCellStyle(n,r,i,s),class:t.getHeaderCellClass(n,r,i,s),key:s.id},[e(\"div\",{class:[\"cell\",s.filteredValue&&s.filteredValue.length>0?\"highlight\":\"\",s.labelClassName]},[s.renderHeader?s.renderHeader.call(t._renderProxy,e,{column:s,$index:r,store:t.store,_self:t.$parent.$vnode.context}):s.label,s.sortable?e(\"span\",{class:\"caret-wrapper\",on:{click:function(e){return t.handleSortClick(e,s)}}},[e(\"i\",{class:\"sort-caret ascending\",on:{click:function(e){return t.handleSortClick(e,s,\"ascending\")}}},[]),e(\"i\",{class:\"sort-caret descending\",on:{click:function(e){return t.handleSortClick(e,s,\"descending\")}}},[])]):\"\",s.filterable?e(\"span\",{class:\"el-table__column-filter-trigger\",on:{click:function(e){return t.handleFilterClick(e,s)}}},[e(\"i\",{class:[\"el-icon-arrow-down\",s.filterOpened?\"el-icon-arrow-up\":\"\"]},[])]):\"\"])])}),t.hasGutter?e(\"th\",{class:\"gutter\"},[]):\"\"])})])])},props:{fixed:String,store:{required:!0},border:Boolean,defaultSort:{type:Object,default:function(){return{prop:\"\",order:\"\"}}}},components:{ElCheckbox:o.default,ElTag:l.default},computed:{table:function(){return this.$parent},isAllSelected:function(){return this.store.states.isAllSelected},columnsCount:function(){return this.store.states.columns.length},leftFixedCount:function(){return this.store.states.fixedColumns.length},rightFixedCount:function(){return this.store.states.rightFixedColumns.length},leftFixedLeafCount:function(){return this.store.states.fixedLeafColumnsLength},rightFixedLeafCount:function(){return this.store.states.rightFixedLeafColumnsLength},columns:function(){return this.store.states.columns},hasGutter:function(){return!this.fixed&&this.tableLayout.gutterWidth}},created:function(){this.filterPanels={}},mounted:function(){var e=this.defaultSort,t=e.prop,i=e.order;this.store.commit(\"sort\",{prop:t,order:i})},beforeDestroy:function(){var e=this.filterPanels;for(var t in e)e.hasOwnProperty(t)&&e[t]&&e[t].$destroy(!0)},methods:{isCellHidden:function(e,t){for(var i=0,n=0;n<e;n++)i+=t[n].colSpan;var s=i+t[e].colSpan-1;return!0===this.fixed||\"left\"===this.fixed?s>=this.leftFixedLeafCount:\"right\"===this.fixed?i<this.columnsCount-this.rightFixedLeafCount:s<this.leftFixedLeafCount||i>=this.columnsCount-this.rightFixedLeafCount},getHeaderRowStyle:function(e){var t=this.table.headerRowStyle;return\"function\"==typeof t?t.call(null,{rowIndex:e}):t},getHeaderRowClass:function(e){var t=[],i=this.table.headerRowClassName;return\"string\"==typeof i?t.push(i):\"function\"==typeof i&&t.push(i.call(null,{rowIndex:e})),t.join(\" \")},getHeaderCellStyle:function(e,t,i,n){var s=this.table.headerCellStyle;return\"function\"==typeof s?s.call(null,{rowIndex:e,columnIndex:t,row:i,column:n}):s},getHeaderCellClass:function(e,t,i,n){var s=[n.id,n.order,n.headerAlign,n.className,n.labelClassName];0===e&&this.isCellHidden(t,i)&&s.push(\"is-hidden\"),n.children||s.push(\"is-leaf\"),n.sortable&&s.push(\"is-sortable\");var r=this.table.headerCellClassName;return\"string\"==typeof r?s.push(r):\"function\"==typeof r&&s.push(r.call(null,{rowIndex:e,columnIndex:t,row:i,column:n})),s.join(\" \")},toggleAllSelection:function(e){e.stopPropagation(),this.store.commit(\"toggleAllSelection\")},handleFilterClick:function(e,t){e.stopPropagation();var i=e.target,n=\"TH\"===i.tagName?i:i.parentNode;n=n.querySelector(\".el-table__column-filter-trigger\")||n;var s=this.$parent,r=this.filterPanels[t.id];if(r&&t.filterOpened)return void(r.showPopper=!1);r||(r=new c.default(h.default),this.filterPanels[t.id]=r,t.filterPlacement&&(r.placement=t.filterPlacement),r.table=s,r.cell=n,r.column=t,!this.$isServer&&r.$mount(document.createElement(\"div\"))),setTimeout(function(){r.showPopper=!0},16)},handleHeaderClick:function(e,t){!t.filters&&t.sortable?this.handleSortClick(e,t):t.filterable&&!t.sortable&&this.handleFilterClick(e,t),this.$parent.$emit(\"header-click\",t,e)},handleHeaderContextMenu:function(e,t){this.$parent.$emit(\"header-contextmenu\",t,e)},handleMouseDown:function(e,t){var i=this;this.$isServer||t.children&&t.children.length>0||this.draggingColumn&&this.border&&function(){i.dragging=!0,i.$parent.resizeProxyVisible=!0;var n=i.$parent,r=n.$el,o=r.getBoundingClientRect().left,a=i.$el.querySelector(\"th.\"+t.id),l=a.getBoundingClientRect(),u=l.left-o+30;(0,s.addClass)(a,\"noclick\"),i.dragState={startMouseLeft:e.clientX,startLeft:l.right-o,startColumnLeft:l.left-o,tableLeft:o};var c=n.$refs.resizeProxy;c.style.left=i.dragState.startLeft+\"px\",document.onselectstart=function(){return!1},document.ondragstart=function(){return!1};var d=function(e){var t=e.clientX-i.dragState.startMouseLeft,n=i.dragState.startLeft+t;c.style.left=Math.max(u,n)+\"px\"},h=function r(){if(i.dragging){var o=i.dragState,l=o.startColumnLeft,u=o.startLeft,h=parseInt(c.style.left,10),f=h-l;t.width=t.realWidth=f,n.$emit(\"header-dragend\",t.width,u-l,t,e),i.store.scheduleLayout(),document.body.style.cursor=\"\",i.dragging=!1,i.draggingColumn=null,i.dragState={},n.resizeProxyVisible=!1}document.removeEventListener(\"mousemove\",d),document.removeEventListener(\"mouseup\",r),document.onselectstart=null,document.ondragstart=null,setTimeout(function(){(0,s.removeClass)(a,\"noclick\")},0)};document.addEventListener(\"mousemove\",d),document.addEventListener(\"mouseup\",h)}()},handleMouseMove:function(e,t){if(!(t.children&&t.children.length>0)){for(var i=e.target;i&&\"TH\"!==i.tagName;)i=i.parentNode;if(t&&t.resizable&&!this.dragging&&this.border){var n=i.getBoundingClientRect(),r=document.body.style;n.width>12&&n.right-e.pageX<8?(r.cursor=\"col-resize\",(0,s.hasClass)(i,\"is-sortable\")&&(i.style.cursor=\"col-resize\"),this.draggingColumn=t):this.dragging||(r.cursor=\"\",(0,s.hasClass)(i,\"is-sortable\")&&(i.style.cursor=\"pointer\"),this.draggingColumn=null)}}},handleMouseOut:function(){this.$isServer||(document.body.style.cursor=\"\")},toggleOrder:function(e){var t=e.order,i=e.sortOrders;if(\"\"===t)return i[0];var n=i.indexOf(t||null);return i[n>i.length-2?0:n+1]},handleSortClick:function(e,t,i){e.stopPropagation();for(var n=i||this.toggleOrder(t),r=e.target;r&&\"TH\"!==r.tagName;)r=r.parentNode;if(r&&\"TH\"===r.tagName&&(0,s.hasClass)(r,\"noclick\"))return void(0,s.removeClass)(r,\"noclick\");if(t.sortable){var o=this.store.states,a=o.sortProp,l=void 0,u=o.sortingColumn;(u!==t||u===t&&null===u.order)&&(u&&(u.order=null),o.sortingColumn=t,a=t.property),n?l=t.order=n:(l=t.order=null,o.sortingColumn=null,a=null),o.sortProp=a,o.sortOrder=l,this.store.commit(\"changeSortCondition\")}}},data:function(){return{draggingColumn:null,dragging:!1,dragState:{}}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(218),s=i.n(n),r=i(220),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(11),r=n(s),o=i(14),a=i(6),l=n(a),u=i(12),c=n(u),d=i(219),h=n(d),f=i(15),p=n(f),m=i(47),v=n(m);t.default={name:\"ElTableFilterPanel\",mixins:[r.default,l.default],directives:{Clickoutside:c.default},components:{ElCheckbox:p.default,ElCheckboxGroup:v.default},props:{placement:{type:String,default:\"bottom-end\"}},customRender:function(e){return e(\"div\",{class:\"el-table-filter\"},[e(\"div\",{class:\"el-table-filter__content\"},[]),e(\"div\",{class:\"el-table-filter__bottom\"},[e(\"button\",{on:{click:this.handleConfirm}},[this.t(\"el.table.confirmFilter\")]),e(\"button\",{on:{click:this.handleReset}},[this.t(\"el.table.resetFilter\")])])])},methods:{isActive:function(e){return e.value===this.filterValue},handleOutsideClick:function(){var e=this;setTimeout(function(){e.showPopper=!1},16)},handleConfirm:function(){this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleReset:function(){this.filteredValue=[],this.confirmFilter(this.filteredValue),this.handleOutsideClick()},handleSelect:function(e){this.filterValue=e,void 0!==e&&null!==e?this.confirmFilter(this.filteredValue):this.confirmFilter([]),this.handleOutsideClick()},confirmFilter:function(e){this.table.store.commit(\"filterChange\",{column:this.column,values:e}),this.table.store.updateAllSelected()}},data:function(){return{table:null,cell:null,column:null}},computed:{filters:function(){return this.column&&this.column.filters},filterValue:{get:function(){return(this.column.filteredValue||[])[0]},set:function(e){this.filteredValue&&(void 0!==e&&null!==e?this.filteredValue.splice(0,1,e):this.filteredValue.splice(0,1))}},filteredValue:{get:function(){return this.column?this.column.filteredValue||[]:[]},set:function(e){this.column&&(this.column.filteredValue=e)}},multiple:function(){return!this.column||this.column.filterMultiple}},mounted:function(){var e=this;this.popperElm=this.$el,this.referenceElm=this.cell,this.table.bodyWrapper.addEventListener(\"scroll\",function(){e.updatePopper()}),this.$watch(\"showPopper\",function(t){e.column&&(e.column.filterOpened=t),t?h.default.open(e):h.default.close(e)})},watch:{showPopper:function(e){!0===e&&parseInt(this.popperJS._popper.style.zIndex,10)<o.PopupManager.zIndex&&(this.popperJS._popper.style.zIndex=o.PopupManager.nextZIndex())}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(2),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=[];!s.default.prototype.$isServer&&document.addEventListener(\"click\",function(e){r.forEach(function(t){var i=e.target;t&&t.$el&&(i===t.$el||t.$el.contains(i)||t.handleOutsideClick&&t.handleOutsideClick(e))})}),t.default={open:function(e){e&&r.push(e)},close:function(e){-1!==r.indexOf(e)&&r.splice(e,1)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"}},[e.multiple?i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleOutsideClick,expression:\"handleOutsideClick\"},{name:\"show\",rawName:\"v-show\",value:e.showPopper,expression:\"showPopper\"}],staticClass:\"el-table-filter\"},[i(\"div\",{staticClass:\"el-table-filter__content\"},[i(\"el-scrollbar\",{attrs:{\"wrap-class\":\"el-table-filter__wrap\"}},[i(\"el-checkbox-group\",{staticClass:\"el-table-filter__checkbox-group\",model:{value:e.filteredValue,callback:function(t){e.filteredValue=t},expression:\"filteredValue\"}},e._l(e.filters,function(t){return i(\"el-checkbox\",{key:t.value,attrs:{label:t.value}},[e._v(e._s(t.text))])}))],1)],1),i(\"div\",{staticClass:\"el-table-filter__bottom\"},[i(\"button\",{class:{\"is-disabled\":0===e.filteredValue.length},attrs:{disabled:0===e.filteredValue.length},on:{click:e.handleConfirm}},[e._v(e._s(e.t(\"el.table.confirmFilter\")))]),i(\"button\",{on:{click:e.handleReset}},[e._v(e._s(e.t(\"el.table.resetFilter\")))])])]):i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleOutsideClick,expression:\"handleOutsideClick\"},{name:\"show\",rawName:\"v-show\",value:e.showPopper,expression:\"showPopper\"}],staticClass:\"el-table-filter\"},[i(\"ul\",{staticClass:\"el-table-filter__list\"},[i(\"li\",{staticClass:\"el-table-filter__list-item\",class:{\"is-active\":void 0===e.filterValue||null===e.filterValue},on:{click:function(t){e.handleSelect(null)}}},[e._v(e._s(e.t(\"el.table.clearFilter\")))]),e._l(e.filters,function(t){return i(\"li\",{key:t.value,staticClass:\"el-table-filter__list-item\",class:{\"is-active\":e.isActive(t)},attrs:{label:t.value},on:{click:function(i){e.handleSelect(t.value)}}},[e._v(e._s(t.text))])})],2)])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(48),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElTableFooter\",mixins:[s.default],render:function(e){var t=this,i=[];return this.summaryMethod?i=this.summaryMethod({columns:this.columns,data:this.store.states.data}):this.columns.forEach(function(e,n){if(0===n)return void(i[n]=t.sumText);var s=t.store.states.data.map(function(t){return Number(t[e.property])}),r=[],o=!0;s.forEach(function(e){if(!isNaN(e)){o=!1;var t=(\"\"+e).split(\".\")[1];r.push(t?t.length:0)}});var a=Math.max.apply(null,r);i[n]=o?\"\":s.reduce(function(e,t){var i=Number(t);return isNaN(i)?e:parseFloat((e+t).toFixed(Math.min(a,20)))},0)}),e(\"table\",{class:\"el-table__footer\",attrs:{cellspacing:\"0\",cellpadding:\"0\",border:\"0\"}},[e(\"colgroup\",null,[this._l(this.columns,function(t){return e(\"col\",{attrs:{name:t.id}},[])}),this.hasGutter?e(\"col\",{attrs:{name:\"gutter\"}},[]):\"\"]),e(\"tbody\",{class:[{\"has-gutter\":this.hasGutter}]},[e(\"tr\",null,[this._l(this.columns,function(n,s){return e(\"td\",{attrs:{colspan:n.colSpan,rowspan:n.rowSpan},class:[n.id,n.headerAlign,n.className||\"\",t.isCellHidden(s,t.columns)?\"is-hidden\":\"\",n.children?\"\":\"is-leaf\",n.labelClassName]},[e(\"div\",{class:[\"cell\",n.labelClassName]},[i[s]])])}),this.hasGutter?e(\"th\",{class:\"gutter\"},[]):\"\"])])])},props:{fixed:String,store:{required:!0},summaryMethod:Function,sumText:String,border:Boolean,defaultSort:{type:Object,default:function(){return{prop:\"\",order:\"\"}}}},computed:{table:function(){return this.$parent},isAllSelected:function(){return this.store.states.isAllSelected},columnsCount:function(){return this.store.states.columns.length},leftFixedCount:function(){return this.store.states.fixedColumns.length},rightFixedCount:function(){return this.store.states.rightFixedColumns.length},columns:function(){return this.store.states.columns},hasGutter:function(){return!this.fixed&&this.tableLayout.gutterWidth}},methods:{isCellHidden:function(e,t){if(!0===this.fixed||\"left\"===this.fixed)return e>=this.leftFixedCount;if(\"right\"===this.fixed){for(var i=0,n=0;n<e;n++)i+=t[n].colSpan;return i<this.columnsCount-this.rightFixedCount}return e<this.leftFixedCount||e>=this.columnsCount-this.rightFixedCount}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-table\",class:[{\"el-table--fit\":e.fit,\"el-table--striped\":e.stripe,\"el-table--border\":e.border||e.isGroup,\"el-table--hidden\":e.isHidden,\"el-table--group\":e.isGroup,\"el-table--fluid-height\":e.maxHeight,\"el-table--scrollable-x\":e.layout.scrollX,\"el-table--scrollable-y\":e.layout.scrollY,\"el-table--enable-row-hover\":!e.store.states.isComplex,\"el-table--enable-row-transition\":0!==(e.store.states.data||[]).length&&(e.store.states.data||[]).length<100},e.tableSize?\"el-table--\"+e.tableSize:\"\"],on:{mouseleave:function(t){e.handleMouseLeave(t)}}},[i(\"div\",{ref:\"hiddenColumns\",staticClass:\"hidden-columns\"},[e._t(\"default\")],2),e.showHeader?i(\"div\",{directives:[{name:\"mousewheel\",rawName:\"v-mousewheel\",value:e.handleHeaderFooterMousewheel,expression:\"handleHeaderFooterMousewheel\"}],ref:\"headerWrapper\",staticClass:\"el-table__header-wrapper\"},[i(\"table-header\",{ref:\"tableHeader\",style:{width:e.layout.bodyWidth?e.layout.bodyWidth+\"px\":\"\"},attrs:{store:e.store,border:e.border,\"default-sort\":e.defaultSort}})],1):e._e(),i(\"div\",{ref:\"bodyWrapper\",staticClass:\"el-table__body-wrapper\",class:[e.layout.scrollX?\"is-scrolling-\"+e.scrollPosition:\"is-scrolling-none\"],style:[e.bodyHeight]},[i(\"table-body\",{style:{width:e.bodyWidth},attrs:{context:e.context,store:e.store,stripe:e.stripe,\"row-class-name\":e.rowClassName,\"row-style\":e.rowStyle,highlight:e.highlightCurrentRow}}),e.data&&0!==e.data.length?e._e():i(\"div\",{ref:\"emptyBlock\",staticClass:\"el-table__empty-block\",style:{width:e.bodyWidth}},[i(\"span\",{staticClass:\"el-table__empty-text\"},[e._t(\"empty\",[e._v(e._s(e.emptyText||e.t(\"el.table.emptyText\")))])],2)]),e.$slots.append?i(\"div\",{ref:\"appendWrapper\",staticClass:\"el-table__append-wrapper\"},[e._t(\"append\")],2):e._e()],1),e.showSummary?i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.data&&e.data.length>0,expression:\"data && data.length > 0\"},{name:\"mousewheel\",rawName:\"v-mousewheel\",value:e.handleHeaderFooterMousewheel,expression:\"handleHeaderFooterMousewheel\"}],ref:\"footerWrapper\",staticClass:\"el-table__footer-wrapper\"},[i(\"table-footer\",{style:{width:e.layout.bodyWidth?e.layout.bodyWidth+\"px\":\"\"},attrs:{store:e.store,border:e.border,\"sum-text\":e.sumText||e.t(\"el.table.sumText\"),\"summary-method\":e.summaryMethod,\"default-sort\":e.defaultSort}})],1):e._e(),e.fixedColumns.length>0?i(\"div\",{directives:[{name:\"mousewheel\",rawName:\"v-mousewheel\",value:e.handleFixedMousewheel,expression:\"handleFixedMousewheel\"}],ref:\"fixedWrapper\",staticClass:\"el-table__fixed\",style:[{width:e.layout.fixedWidth?e.layout.fixedWidth+\"px\":\"\"},e.fixedHeight]},[e.showHeader?i(\"div\",{ref:\"fixedHeaderWrapper\",staticClass:\"el-table__fixed-header-wrapper\"},[i(\"table-header\",{ref:\"fixedTableHeader\",style:{width:e.bodyWidth},attrs:{fixed:\"left\",border:e.border,store:e.store}})],1):e._e(),i(\"div\",{ref:\"fixedBodyWrapper\",staticClass:\"el-table__fixed-body-wrapper\",style:[{top:e.layout.headerHeight+\"px\"},e.fixedBodyHeight]},[i(\"table-body\",{style:{width:e.bodyWidth},attrs:{fixed:\"left\",store:e.store,stripe:e.stripe,highlight:e.highlightCurrentRow,\"row-class-name\":e.rowClassName,\"row-style\":e.rowStyle}}),e.$slots.append?i(\"div\",{staticClass:\"el-table__append-gutter\",style:{height:e.layout.appendHeight+\"px\"}}):e._e()],1),e.showSummary?i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.data&&e.data.length>0,expression:\"data && data.length > 0\"}],ref:\"fixedFooterWrapper\",staticClass:\"el-table__fixed-footer-wrapper\"},[i(\"table-footer\",{style:{width:e.bodyWidth},attrs:{fixed:\"left\",border:e.border,\"sum-text\":e.sumText||e.t(\"el.table.sumText\"),\"summary-method\":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?i(\"div\",{directives:[{name:\"mousewheel\",rawName:\"v-mousewheel\",value:e.handleFixedMousewheel,expression:\"handleFixedMousewheel\"}],ref:\"rightFixedWrapper\",staticClass:\"el-table__fixed-right\",style:[{width:e.layout.rightFixedWidth?e.layout.rightFixedWidth+\"px\":\"\",right:e.layout.scrollY?(e.border?e.layout.gutterWidth:e.layout.gutterWidth||0)+\"px\":\"\"},e.fixedHeight]},[e.showHeader?i(\"div\",{ref:\"rightFixedHeaderWrapper\",staticClass:\"el-table__fixed-header-wrapper\"},[i(\"table-header\",{ref:\"rightFixedTableHeader\",style:{width:e.bodyWidth},attrs:{fixed:\"right\",border:e.border,store:e.store}})],1):e._e(),i(\"div\",{ref:\"rightFixedBodyWrapper\",staticClass:\"el-table__fixed-body-wrapper\",style:[{top:e.layout.headerHeight+\"px\"},e.fixedBodyHeight]},[i(\"table-body\",{style:{width:e.bodyWidth},attrs:{fixed:\"right\",store:e.store,stripe:e.stripe,\"row-class-name\":e.rowClassName,\"row-style\":e.rowStyle,highlight:e.highlightCurrentRow}})],1),e.showSummary?i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.data&&e.data.length>0,expression:\"data && data.length > 0\"}],ref:\"rightFixedFooterWrapper\",staticClass:\"el-table__fixed-footer-wrapper\"},[i(\"table-footer\",{style:{width:e.bodyWidth},attrs:{fixed:\"right\",border:e.border,\"sum-text\":e.sumText||e.t(\"el.table.sumText\"),\"summary-method\":e.summaryMethod,store:e.store}})],1):e._e()]):e._e(),e.rightFixedColumns.length>0?i(\"div\",{ref:\"rightFixedPatch\",staticClass:\"el-table__fixed-right-patch\",style:{width:e.layout.scrollY?e.layout.gutterWidth+\"px\":\"0\",height:e.layout.headerHeight+\"px\"}}):e._e(),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.resizeProxyVisible,expression:\"resizeProxyVisible\"}],ref:\"resizeProxy\",staticClass:\"el-table__column-resize-proxy\"})])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(224),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(15),r=n(s),o=i(31),a=n(o),l=i(10),u=n(l),c=i(4),d=1,h={default:{order:\"\"},selection:{width:48,minWidth:48,realWidth:48,order:\"\",className:\"el-table-column--selection\"},expand:{width:48,minWidth:48,realWidth:48,order:\"\"},index:{width:48,minWidth:48,realWidth:48,order:\"\"}},f={selection:{renderHeader:function(e,t){var i=t.store;return e(\"el-checkbox\",{attrs:{disabled:i.states.data&&0===i.states.data.length,indeterminate:i.states.selection.length>0&&!this.isAllSelected,value:this.isAllSelected},nativeOn:{click:this.toggleAllSelection}},[])},renderCell:function(e,t){var i=t.row,n=t.column,s=t.store,r=t.$index;return e(\"el-checkbox\",{nativeOn:{click:function(e){return e.stopPropagation()}},attrs:{value:s.isSelected(i),disabled:!!n.selectable&&!n.selectable.call(null,i,r)},on:{input:function(){s.commit(\"rowSelectedChanged\",i)}}},[])},sortable:!1,resizable:!1},index:{renderHeader:function(e,t){return t.column.label||\"#\"},renderCell:function(e,t){var i=t.$index,n=t.column,s=i+1,r=n.index;return\"number\"==typeof r?s=i+r:\"function\"==typeof r&&(s=r(i)),e(\"div\",null,[s])},sortable:!1},expand:{renderHeader:function(e,t){return t.column.label||\"\"},renderCell:function(e,t,i){var n=t.row;return e(\"div\",{class:\"el-table__expand-icon \"+(t.store.states.expandRows.indexOf(n)>-1?\"el-table__expand-icon--expanded\":\"\"),on:{click:function(e){return i.handleExpandClick(n,e)}}},[e(\"i\",{class:\"el-icon el-icon-arrow-right\"},[])])},sortable:!1,resizable:!1,className:\"el-table__expand-column\"}},p=function(e,t){var i={};(0,u.default)(i,h[e||\"default\"]);for(var n in t)if(t.hasOwnProperty(n)){var s=t[n];void 0!==s&&(i[n]=s)}return i.minWidth||(i.minWidth=80),i.realWidth=void 0===i.width?i.minWidth:i.width,i},m=function(e,t){var i=t.row,n=t.column,s=t.$index,r=n.property,o=r&&(0,c.getPropByPath)(i,r).v;return n&&n.formatter?n.formatter(i,n,o,s):o},v=function(e){return void 0!==e&&(e=parseInt(e,10),isNaN(e)&&(e=null)),e},g=function(e){return void 0!==e&&(e=parseInt(e,10),isNaN(e)&&(e=80)),e};t.default={name:\"ElTableColumn\",props:{type:{type:String,default:\"default\"},label:String,className:String,labelClassName:String,property:String,prop:String,width:{},minWidth:{},renderHeader:Function,sortable:{type:[String,Boolean],default:!1},sortMethod:Function,sortBy:[String,Function,Array],resizable:{type:Boolean,default:!0},context:{},columnKey:String,align:String,headerAlign:String,showTooltipWhenOverflow:Boolean,showOverflowTooltip:Boolean,fixed:[Boolean,String],formatter:Function,selectable:Function,reserveSelection:Boolean,filterMethod:Function,filteredValue:Array,filters:Array,filterPlacement:String,filterMultiple:{type:Boolean,default:!0},index:[Number,Function],sortOrders:{type:Array,default:function(){return[\"ascending\",\"descending\",null]},validator:function(e){return e.every(function(e){return[\"ascending\",\"descending\",null].indexOf(e)>-1})}}},data:function(){return{isSubColumn:!1,columns:[]}},beforeCreate:function(){this.row={},this.column={},this.$index=0},components:{ElCheckbox:r.default,ElTag:a.default},computed:{owner:function(){for(var e=this.$parent;e&&!e.tableId;)e=e.$parent;return e},columnOrTableParent:function(){for(var e=this.$parent;e&&!e.tableId&&!e.columnId;)e=e.$parent;return e}},created:function(){var e=this;this.customRender=this.$options.render,this.$options.render=function(t){return t(\"div\",e.$slots.default)};var t=this.columnOrTableParent,i=this.owner;this.isSubColumn=i!==t,this.columnId=(t.tableId||t.columnId)+\"_column_\"+d++;var n=this.type,s=v(this.width),r=g(this.minWidth),o=p(n,{id:this.columnId,columnKey:this.columnKey,label:this.label,className:this.className,labelClassName:this.labelClassName,property:this.prop||this.property,type:n,renderCell:null,renderHeader:this.renderHeader,minWidth:r,width:s,isColumnGroup:!1,context:this.context,align:this.align?\"is-\"+this.align:null,headerAlign:this.headerAlign?\"is-\"+this.headerAlign:this.align?\"is-\"+this.align:null,sortable:\"\"===this.sortable||this.sortable,sortMethod:this.sortMethod,sortBy:this.sortBy,resizable:this.resizable,showOverflowTooltip:this.showOverflowTooltip||this.showTooltipWhenOverflow,formatter:this.formatter,selectable:this.selectable,reserveSelection:this.reserveSelection,fixed:\"\"===this.fixed||this.fixed,filterMethod:this.filterMethod,filters:this.filters,filterable:this.filters||this.filterMethod,filterMultiple:this.filterMultiple,filterOpened:!1,filteredValue:this.filteredValue||[],filterPlacement:this.filterPlacement||\"\",index:this.index,sortOrders:this.sortOrders}),a=f[n]||{};Object.keys(a).forEach(function(e){var t=a[e];void 0!==t&&(\"renderHeader\"===e&&(\"selection\"===n&&o[e]?console.warn(\"[Element Warn][TableColumn]Selection column doesn't allow to set render-header function.\"):t=o[e]||t),o[e]=\"className\"===e?o[e]+\" \"+t:t)}),this.renderHeader&&console.warn(\"[Element Warn][TableColumn]Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header.\"),this.columnConfig=o;var l=o.renderCell,u=this;if(\"expand\"===n)return i.renderExpanded=function(e,t){return u.$scopedSlots.default?u.$scopedSlots.default(t):u.$slots.default},void(o.renderCell=function(e,t){return e(\"div\",{class:\"cell\"},[l(e,t,this._renderProxy)])});o.renderCell=function(e,t){return u.$scopedSlots.default&&(l=function(){return u.$scopedSlots.default(t)}),l||(l=m),u.showOverflowTooltip||u.showTooltipWhenOverflow?e(\"div\",{class:\"cell el-tooltip\",style:{width:(t.column.realWidth||t.column.width)-1+\"px\"}},[l(e,t)]):e(\"div\",{class:\"cell\"},[l(e,t)])}},destroyed:function(){if(this.$parent){var e=this.$parent;this.owner.store.commit(\"removeColumn\",this.columnConfig,this.isSubColumn?e.columnConfig:null)}},watch:{label:function(e){this.columnConfig&&(this.columnConfig.label=e)},prop:function(e){this.columnConfig&&(this.columnConfig.property=e)},property:function(e){this.columnConfig&&(this.columnConfig.property=e)},filters:function(e){this.columnConfig&&(this.columnConfig.filters=e)},filterMultiple:function(e){this.columnConfig&&(this.columnConfig.filterMultiple=e)},align:function(e){this.columnConfig&&(this.columnConfig.align=e?\"is-\"+e:null,this.headerAlign||(this.columnConfig.headerAlign=e?\"is-\"+e:null))},headerAlign:function(e){this.columnConfig&&(this.columnConfig.headerAlign=\"is-\"+(e||this.align))},width:function(e){this.columnConfig&&(this.columnConfig.width=v(e),this.owner.store.scheduleLayout())},minWidth:function(e){this.columnConfig&&(this.columnConfig.minWidth=g(e),this.owner.store.scheduleLayout())},fixed:function(e){this.columnConfig&&(this.columnConfig.fixed=e,this.owner.store.scheduleLayout(!0))},sortable:function(e){this.columnConfig&&(this.columnConfig.sortable=e)},index:function(e){this.columnConfig&&(this.columnConfig.index=e)},formatter:function(e){this.columnConfig&&(this.columnConfig.formatter=e)},className:function(e){this.columnConfig&&(this.columnConfig.className=e)},labelClassName:function(e){this.columnConfig&&(this.columnConfig.labelClassName=e)}},mounted:function(){var e=this,t=this.owner,i=this.columnOrTableParent,n=void 0;n=this.isSubColumn?[].indexOf.call(i.$el.children,this.$el):[].indexOf.call(i.$refs.hiddenColumns.children,this.$el),this.$scopedSlots.header&&(\"selection\"===this.type?console.warn(\"[Element Warn][TableColumn]Selection column doesn't allow to set scoped-slot header.\"):this.columnConfig.renderHeader=function(t,i){return e.$scopedSlots.header(i)}),t.store.commit(\"insertColumn\",this.columnConfig,n,this.isSubColumn?i.columnConfig:null)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(226),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(49),r=n(s),o=i(230),a=n(o),l=i(245),u=n(l),c=function(e){return\"daterange\"===e||\"datetimerange\"===e?u.default:a.default};t.default={mixins:[r.default],name:\"ElDatePicker\",props:{type:{type:String,default:\"date\"},timeArrowControl:Boolean},watch:{type:function(e){this.picker?(this.unmountPicker(),this.panel=c(e),this.mountPicker()):this.panel=c(e)}},created:function(){this.panel=c(this.type)}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(12),a=n(o),l=i(13),u=i(11),c=n(u),d=i(1),h=n(d),f=i(8),p=n(f),m=i(10),v=n(m),g={props:{appendToBody:c.default.props.appendToBody,offset:c.default.props.offset,boundariesPadding:c.default.props.boundariesPadding,arrowOffset:c.default.props.arrowOffset},methods:c.default.methods,data:function(){return(0,v.default)({visibleArrow:!0},c.default.data)},beforeDestroy:c.default.beforeDestroy},b={date:\"yyyy-MM-dd\",month:\"yyyy-MM\",datetime:\"yyyy-MM-dd HH:mm:ss\",time:\"HH:mm:ss\",week:\"yyyywWW\",timerange:\"HH:mm:ss\",daterange:\"yyyy-MM-dd\",datetimerange:\"yyyy-MM-dd HH:mm:ss\",year:\"yyyy\"},y=[\"date\",\"datetime\",\"time\",\"time-select\",\"week\",\"month\",\"year\",\"daterange\",\"timerange\",\"datetimerange\",\"dates\"],_=function(e,t){return\"timestamp\"===t?e.getTime():(0,l.formatDate)(e,t)},C=function(e,t){return\"timestamp\"===t?new Date(Number(e)):(0,l.parseDate)(e,t)},x=function(e,t){if(Array.isArray(e)&&2===e.length){var i=e[0],n=e[1];if(i&&n)return[_(i,t),_(n,t)]}return\"\"},w=function(e,t,i){if(Array.isArray(e)||(e=e.split(i)),2===e.length){var n=e[0],s=e[1];return[C(n,t),C(s,t)]}return[]},k={default:{formatter:function(e){return e?\"\"+e:\"\"},parser:function(e){return void 0===e||\"\"===e?null:e}},week:{formatter:function(e,t){var i=(0,l.getWeekNumber)(e),n=e.getMonth(),s=new Date(e);1===i&&11===n&&(s.setHours(0,0,0,0),s.setDate(s.getDate()+3-(s.getDay()+6)%7));var r=(0,l.formatDate)(s,t);return r=/WW/.test(r)?r.replace(/WW/,i<10?\"0\"+i:i):r.replace(/W/,i)},parser:function(e){var t=(e||\"\").split(\"w\");if(2===t.length){var i=Number(t[0]),n=Number(t[1]);if(!isNaN(i)&&!isNaN(n)&&n<54)return e}return null}},date:{formatter:_,parser:C},datetime:{formatter:_,parser:C},daterange:{formatter:x,parser:w},datetimerange:{formatter:x,parser:w},timerange:{formatter:x,parser:w},time:{formatter:_,parser:C},month:{formatter:_,parser:C},year:{formatter:_,parser:C},number:{formatter:function(e){return e?\"\"+e:\"\"},parser:function(e){var t=Number(e);return isNaN(e)?null:t}},dates:{formatter:function(e,t){return e.map(function(e){return _(e,t)})},parser:function(e,t){return(\"string\"==typeof e?e.split(\", \"):e).map(function(e){return e instanceof Date?e:C(e,t)})}}},S={left:\"bottom-start\",center:\"bottom\",right:\"bottom-end\"},M=function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"-\";return e?(0,(k[i]||k.default).parser)(e,t||b[i],n):null},$=function(e,t,i){return e?(0,(k[i]||k.default).formatter)(e,t||b[i]):null},E=function(e,t){var i=function(e,t){var i=e instanceof Date,n=t instanceof Date;return i&&n?e.getTime()===t.getTime():!i&&!n&&e===t},n=e instanceof Array,s=t instanceof Array;return n&&s?e.length===t.length&&e.every(function(e,n){return i(e,t[n])}):!n&&!s&&i(e,t)},D=function(e){return\"string\"==typeof e||e instanceof String},T=function(e){return null===e||void 0===e||D(e)||Array.isArray(e)&&2===e.length&&e.every(D)};t.default={mixins:[h.default,g],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},props:{size:String,format:String,valueFormat:String,readonly:Boolean,placeholder:String,startPlaceholder:String,endPlaceholder:String,prefixIcon:String,clearIcon:{type:String,default:\"el-icon-circle-close\"},name:{default:\"\",validator:T},disabled:Boolean,clearable:{type:Boolean,default:!0},id:{default:\"\",validator:T},popperClass:String,editable:{type:Boolean,default:!0},align:{type:String,default:\"left\"},value:{},defaultValue:{},defaultTime:{},rangeSeparator:{default:\"-\"},pickerOptions:{},unlinkPanels:Boolean},components:{ElInput:p.default},directives:{Clickoutside:a.default},data:function(){return{pickerVisible:!1,showClose:!1,userInput:null,valueOnOpen:null,unwatchPickerOptions:null}},watch:{pickerVisible:function(e){this.readonly||this.pickerDisabled||(e?(this.showPicker(),this.valueOnOpen=Array.isArray(this.value)?[].concat(this.value):this.value):(this.hidePicker(),this.emitChange(this.value),this.userInput=null,this.dispatch(\"ElFormItem\",\"el.form.blur\"),this.$emit(\"blur\",this),this.blur()))},parsedValue:{immediate:!0,handler:function(e){this.picker&&(this.picker.value=e)}},defaultValue:function(e){this.picker&&(this.picker.defaultValue=e)},value:function(e,t){E(e,t)||this.pickerVisible||this.dispatch(\"ElFormItem\",\"el.form.change\",e)}},computed:{ranged:function(){return this.type.indexOf(\"range\")>-1},reference:function(){var e=this.$refs.reference;return e.$el||e},refInput:function(){return this.reference?[].slice.call(this.reference.querySelectorAll(\"input\")):[]},valueIsEmpty:function(){var e=this.value;if(Array.isArray(e)){for(var t=0,i=e.length;t<i;t++)if(e[t])return!1}else if(e)return!1;return!0},triggerClass:function(){return this.prefixIcon||(-1!==this.type.indexOf(\"time\")?\"el-icon-time\":\"el-icon-date\")},selectionMode:function(){return\"week\"===this.type?\"week\":\"month\"===this.type?\"month\":\"year\"===this.type?\"year\":\"dates\"===this.type?\"dates\":\"day\"},haveTrigger:function(){return void 0!==this.showTrigger?this.showTrigger:-1!==y.indexOf(this.type)},displayValue:function(){var e=$(this.parsedValue,this.format,this.type,this.rangeSeparator);return Array.isArray(this.userInput)?[this.userInput[0]||e&&e[0]||\"\",this.userInput[1]||e&&e[1]||\"\"]:null!==this.userInput?this.userInput:e?\"dates\"===this.type?e.join(\", \"):e:\"\"},parsedValue:function(){return this.value?\"time-select\"===this.type?this.value:(0,l.isDateObject)(this.value)||Array.isArray(this.value)&&this.value.every(l.isDateObject)?this.value:this.valueFormat?M(this.value,this.valueFormat,this.type,this.rangeSeparator)||this.value:Array.isArray(this.value)?this.value.map(function(e){return new Date(e)}):new Date(this.value):this.value},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},pickerSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},pickerDisabled:function(){return this.disabled||(this.elForm||{}).disabled},firstInputId:function(){var e={},t=void 0;return t=this.ranged?this.id&&this.id[0]:this.id,t&&(e.id=t),e},secondInputId:function(){var e={},t=void 0;return this.ranged&&(t=this.id&&this.id[1]),t&&(e.id=t),e}},created:function(){this.popperOptions={boundariesPadding:0,gpuAcceleration:!1},this.placement=S[this.align]||S.left,this.$on(\"fieldReset\",this.handleFieldReset)},methods:{focus:function(){this.ranged?this.handleFocus():this.$refs.reference.focus()},blur:function(){this.refInput.forEach(function(e){return e.blur()})},parseValue:function(e){var t=(0,l.isDateObject)(e)||Array.isArray(e)&&e.every(l.isDateObject);return this.valueFormat&&!t?M(e,this.valueFormat,this.type,this.rangeSeparator)||e:e},formatToValue:function(e){var t=(0,l.isDateObject)(e)||Array.isArray(e)&&e.every(l.isDateObject);return this.valueFormat&&t?$(e,this.valueFormat,this.type,this.rangeSeparator):e},parseString:function(e){var t=Array.isArray(e)?this.type:this.type.replace(\"range\",\"\");return M(e,this.format,t)},formatToString:function(e){var t=Array.isArray(e)?this.type:this.type.replace(\"range\",\"\");return $(e,this.format,t)},handleMouseEnter:function(){this.readonly||this.pickerDisabled||!this.valueIsEmpty&&this.clearable&&(this.showClose=!0)},handleChange:function(){if(this.userInput){var e=this.parseString(this.displayValue);e&&(this.picker.value=e,this.isValidValue(e)&&(this.emitInput(e),this.userInput=null))}\"\"===this.userInput&&(this.emitInput(null),this.emitChange(null),this.userInput=null)},handleStartInput:function(e){this.userInput?this.userInput=[e.target.value,this.userInput[1]]:this.userInput=[e.target.value,null]},handleEndInput:function(e){this.userInput?this.userInput=[this.userInput[0],e.target.value]:this.userInput=[null,e.target.value]},handleStartChange:function(e){var t=this.parseString(this.userInput&&this.userInput[0]);if(t){this.userInput=[this.formatToString(t),this.displayValue[1]];var i=[t,this.picker.value&&this.picker.value[1]];this.picker.value=i,this.isValidValue(i)&&(this.emitInput(i),this.userInput=null)}},handleEndChange:function(e){var t=this.parseString(this.userInput&&this.userInput[1]);if(t){this.userInput=[this.displayValue[0],this.formatToString(t)];var i=[this.picker.value&&this.picker.value[0],t];this.picker.value=i,this.isValidValue(i)&&(this.emitInput(i),this.userInput=null)}},handleClickIcon:function(e){this.readonly||this.pickerDisabled||(this.showClose?(this.valueOnOpen=this.value,e.stopPropagation(),this.emitInput(null),this.emitChange(null),this.showClose=!1,this.picker&&\"function\"==typeof this.picker.handleClear&&this.picker.handleClear()):this.pickerVisible=!this.pickerVisible)},handleClose:function(){if(this.pickerVisible&&(this.pickerVisible=!1,\"dates\"===this.type)){var e=M(this.valueOnOpen,this.valueFormat,this.type,this.rangeSeparator)||this.valueOnOpen;this.emitInput(e)}},handleFieldReset:function(e){this.userInput=\"\"===e?null:e},handleFocus:function(){var e=this.type;-1===y.indexOf(e)||this.pickerVisible||(this.pickerVisible=!0),this.$emit(\"focus\",this)},handleKeydown:function(e){var t=this,i=e.keyCode;return 27===i?(this.pickerVisible=!1,void e.stopPropagation()):9===i?void(this.ranged?setTimeout(function(){-1===t.refInput.indexOf(document.activeElement)&&(t.pickerVisible=!1,t.blur(),e.stopPropagation())},0):(this.handleChange(),this.pickerVisible=this.picker.visible=!1,this.blur(),e.stopPropagation())):13===i?((\"\"===this.userInput||this.isValidValue(this.parseString(this.displayValue)))&&(this.handleChange(),this.pickerVisible=this.picker.visible=!1,this.blur()),void e.stopPropagation()):this.userInput?void e.stopPropagation():void(this.picker&&this.picker.handleKeydown&&this.picker.handleKeydown(e))},handleRangeClick:function(){var e=this.type;-1===y.indexOf(e)||this.pickerVisible||(this.pickerVisible=!0),this.$emit(\"focus\",this)},hidePicker:function(){this.picker&&(this.picker.resetView&&this.picker.resetView(),this.pickerVisible=this.picker.visible=!1,this.destroyPopper())},showPicker:function(){var e=this;this.$isServer||(this.picker||this.mountPicker(),this.pickerVisible=this.picker.visible=!0,this.updatePopper(),this.picker.value=this.parsedValue,this.picker.resetView&&this.picker.resetView(),this.$nextTick(function(){e.picker.adjustSpinners&&e.picker.adjustSpinners()}))},mountPicker:function(){var e=this;this.picker=new r.default(this.panel).$mount(),this.picker.defaultValue=this.defaultValue,this.picker.defaultTime=this.defaultTime,this.picker.popperClass=this.popperClass,this.popperElm=this.picker.$el,this.picker.width=this.reference.getBoundingClientRect().width,this.picker.showTime=\"datetime\"===this.type||\"datetimerange\"===this.type,this.picker.selectionMode=this.selectionMode,this.picker.unlinkPanels=this.unlinkPanels,this.picker.arrowControl=this.arrowControl||this.timeArrowControl||!1,this.$watch(\"format\",function(t){e.picker.format=t});var t=function(){var t=e.pickerOptions;t&&t.selectableRange&&function(){var i=t.selectableRange,n=k.datetimerange.parser,s=b.timerange;i=Array.isArray(i)?i:[i],e.picker.selectableRange=i.map(function(t){return n(t,s,e.rangeSeparator)})}();for(var i in t)t.hasOwnProperty(i)&&\"selectableRange\"!==i&&(e.picker[i]=t[i]);e.format&&(e.picker.format=e.format)};t(),this.unwatchPickerOptions=this.$watch(\"pickerOptions\",function(){return t()},{deep:!0}),this.$el.appendChild(this.picker.$el),this.picker.resetView&&this.picker.resetView(),this.picker.$on(\"dodestroy\",this.doDestroy),this.picker.$on(\"pick\",function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.userInput=null,e.pickerVisible=e.picker.visible=i,e.emitInput(t),e.picker.resetView&&e.picker.resetView()}),this.picker.$on(\"select-range\",function(t,i,n){0!==e.refInput.length&&(n&&\"min\"!==n?\"max\"===n&&(e.refInput[1].setSelectionRange(t,i),e.refInput[1].focus()):(e.refInput[0].setSelectionRange(t,i),e.refInput[0].focus()))})},unmountPicker:function(){this.picker&&(this.picker.$destroy(),this.picker.$off(),\"function\"==typeof this.unwatchPickerOptions&&this.unwatchPickerOptions(),this.picker.$el.parentNode.removeChild(this.picker.$el))},emitChange:function(e){E(e,this.valueOnOpen)||(this.$emit(\"change\",e),this.dispatch(\"ElFormItem\",\"el.form.change\",e),this.valueOnOpen=e)},emitInput:function(e){var t=this.formatToValue(e);E(this.value,t)||this.$emit(\"input\",t)},isValidValue:function(e){return this.picker||this.mountPicker(),!this.picker.isValidValue||e&&this.picker.isValidValue(e)}}}},function(e,t,i){var n;!function(s){\"use strict\";function r(e,t){for(var i=[],n=0,s=e.length;n<s;n++)i.push(e[n].substr(0,t));return i}function o(e){return function(t,i,n){var s=n[e].indexOf(i.charAt(0).toUpperCase()+i.substr(1).toLowerCase());~s&&(t.month=s)}}function a(e,t){for(e=String(e),t=t||2;e.length<t;)e=\"0\"+e;return e}var l={},u=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\\1?|[aA]|\"[^\"]*\"|'[^']*'/g,c=/\\d\\d?/,d=/\\d{3}/,h=/\\d{4}/,f=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i,p=function(){},m=[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],v=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],g=r(v,3),b=r(m,3);l.i18n={dayNamesShort:b,dayNames:m,monthNamesShort:g,monthNames:v,amPm:[\"am\",\"pm\"],DoFn:function(e){return e+[\"th\",\"st\",\"nd\",\"rd\"][e%10>3?0:(e-e%10!=10)*e%10]}};var y={D:function(e){return e.getDay()},DD:function(e){return a(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return a(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return a(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return String(e.getFullYear()).substr(2)},yyyy:function(e){return e.getFullYear()},h:function(e){return e.getHours()%12||12},hh:function(e){return a(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return a(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return a(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return a(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return a(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return a(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?\"-\":\"+\")+a(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},_={d:[c,function(e,t){e.day=t}],M:[c,function(e,t){e.month=t-1}],yy:[c,function(e,t){var i=new Date,n=+(\"\"+i.getFullYear()).substr(0,2);e.year=\"\"+(t>68?n-1:n)+t}],h:[c,function(e,t){e.hour=t}],m:[c,function(e,t){e.minute=t}],s:[c,function(e,t){e.second=t}],yyyy:[h,function(e,t){e.year=t}],S:[/\\d/,function(e,t){e.millisecond=100*t}],SS:[/\\d{2}/,function(e,t){e.millisecond=10*t}],SSS:[d,function(e,t){e.millisecond=t}],D:[c,p],ddd:[f,p],MMM:[f,o(\"monthNamesShort\")],MMMM:[f,o(\"monthNames\")],a:[f,function(e,t,i){var n=t.toLowerCase();n===i.amPm[0]?e.isPm=!1:n===i.amPm[1]&&(e.isPm=!0)}],ZZ:[/[\\+\\-]\\d\\d:?\\d\\d/,function(e,t){var i,n=(t+\"\").match(/([\\+\\-]|\\d\\d)/gi);n&&(i=60*n[1]+parseInt(n[2],10),e.timezoneOffset=\"+\"===n[0]?i:-i)}]};_.DD=_.D,_.dddd=_.ddd,_.Do=_.dd=_.d,_.mm=_.m,_.hh=_.H=_.HH=_.h,_.MM=_.M,_.ss=_.s,_.A=_.a,l.masks={default:\"ddd MMM dd yyyy HH:mm:ss\",shortDate:\"M/D/yy\",mediumDate:\"MMM d, yyyy\",longDate:\"MMMM d, yyyy\",fullDate:\"dddd, MMMM d, yyyy\",shortTime:\"HH:mm\",mediumTime:\"HH:mm:ss\",longTime:\"HH:mm:ss.SSS\"},l.format=function(e,t,i){var n=i||l.i18n;if(\"number\"==typeof e&&(e=new Date(e)),\"[object Date]\"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error(\"Invalid Date in fecha.format\");return t=l.masks[t]||t||l.masks.default,t.replace(u,function(t){return t in y?y[t](e,n):t.slice(1,t.length-1)})},l.parse=function(e,t,i){var n=i||l.i18n;if(\"string\"!=typeof t)throw new Error(\"Invalid format in fecha.parse\");if(t=l.masks[t]||t,e.length>1e3)return!1;var s=!0,r={};if(t.replace(u,function(t){if(_[t]){var i=_[t],o=e.search(i[0]);~o?e.replace(i[0],function(t){return i[1](r,t,n),e=e.substr(o+t.length),t}):s=!1}return _[t]?\"\":t.slice(1,t.length-1)}),!s)return!1;var o=new Date;!0===r.isPm&&null!=r.hour&&12!=+r.hour?r.hour=+r.hour+12:!1===r.isPm&&12==+r.hour&&(r.hour=0);var a;return null!=r.timezoneOffset?(r.minute=+(r.minute||0)-+r.timezoneOffset,a=new Date(Date.UTC(r.year||o.getFullYear(),r.month||0,r.day||1,r.hour||0,r.minute||0,r.second||0,r.millisecond||0))):a=new Date(r.year||o.getFullYear(),r.month||0,r.day||1,r.hour||0,r.minute||0,r.second||0,r.millisecond||0),a},void 0!==e&&e.exports?e.exports=l:void 0!==(n=function(){return l}.call(t,i,t,e))&&(e.exports=n)}()},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return e.ranged?i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleClose,expression:\"handleClose\"}],ref:\"reference\",staticClass:\"el-date-editor el-range-editor el-input__inner\",class:[\"el-date-editor--\"+e.type,e.pickerSize?\"el-range-editor--\"+e.pickerSize:\"\",e.pickerDisabled?\"is-disabled\":\"\",e.pickerVisible?\"is-active\":\"\"],on:{click:e.handleRangeClick,mouseenter:e.handleMouseEnter,mouseleave:function(t){e.showClose=!1},keydown:e.handleKeydown}},[i(\"i\",{class:[\"el-input__icon\",\"el-range__icon\",e.triggerClass]}),i(\"input\",e._b({staticClass:\"el-range-input\",attrs:{autocomplete:\"off\",placeholder:e.startPlaceholder,disabled:e.pickerDisabled,readonly:!e.editable||e.readonly,name:e.name&&e.name[0]},domProps:{value:e.displayValue&&e.displayValue[0]},on:{input:e.handleStartInput,change:e.handleStartChange,focus:e.handleFocus}},\"input\",e.firstInputId,!1)),e._t(\"range-separator\",[i(\"span\",{staticClass:\"el-range-separator\"},[e._v(e._s(e.rangeSeparator))])]),i(\"input\",e._b({staticClass:\"el-range-input\",attrs:{autocomplete:\"off\",placeholder:e.endPlaceholder,disabled:e.pickerDisabled,readonly:!e.editable||e.readonly,name:e.name&&e.name[1]},domProps:{value:e.displayValue&&e.displayValue[1]},on:{input:e.handleEndInput,change:e.handleEndChange,focus:e.handleFocus}},\"input\",e.secondInputId,!1)),e.haveTrigger?i(\"i\",{staticClass:\"el-input__icon el-range__close-icon\",class:[e.showClose?\"\"+e.clearIcon:\"\"],on:{click:e.handleClickIcon}}):e._e()],2):i(\"el-input\",e._b({directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleClose,expression:\"handleClose\"}],ref:\"reference\",staticClass:\"el-date-editor\",class:\"el-date-editor--\"+e.type,attrs:{readonly:!e.editable||e.readonly||\"dates\"===e.type,disabled:e.pickerDisabled,size:e.pickerSize,name:e.name,placeholder:e.placeholder,value:e.displayValue,validateEvent:!1},on:{focus:e.handleFocus,input:function(t){return e.userInput=t},change:e.handleChange},nativeOn:{keydown:function(t){e.handleKeydown(t)},mouseenter:function(t){e.handleMouseEnter(t)},mouseleave:function(t){e.showClose=!1}}},\"el-input\",e.firstInputId,!1),[i(\"i\",{staticClass:\"el-input__icon\",class:e.triggerClass,attrs:{slot:\"prefix\"},on:{click:e.handleFocus},slot:\"prefix\"}),e.haveTrigger?i(\"i\",{staticClass:\"el-input__icon\",class:[e.showClose?\"\"+e.clearIcon:\"\"],attrs:{slot:\"suffix\"},on:{click:e.handleClickIcon},slot:\"suffix\"}):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(231),s=i.n(n),r=i(244),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(13),r=i(12),o=n(r),a=i(6),l=n(a),u=i(8),c=n(u),d=i(19),h=n(d),f=i(50),p=n(f),m=i(236),v=n(m),g=i(239),b=n(g),y=i(76),_=n(y);t.default={mixins:[l.default],directives:{Clickoutside:o.default},watch:{showTime:function(e){var t=this;e&&this.$nextTick(function(e){var i=t.$refs.input.$el;i&&(t.pickerWidth=i.getBoundingClientRect().width+10)})},value:function(e){\"dates\"===this.selectionMode&&this.value||((0,s.isDate)(e)?this.date=new Date(e):this.date=this.getDefaultValue())},defaultValue:function(e){(0,s.isDate)(this.value)||(this.date=e?new Date(e):new Date)},timePickerVisible:function(e){var t=this;e&&this.$nextTick(function(){return t.$refs.timepicker.adjustSpinners()})},selectionMode:function(e){\"month\"===e?\"year\"===this.currentView&&\"month\"===this.currentView||(this.currentView=\"month\"):\"dates\"===e&&(this.currentView=\"date\")}},methods:{proxyTimePickerDataProperties:function(){var e=this,t=function(t){e.$refs.timepicker.value=t},i=function(t){e.$refs.timepicker.date=t};this.$watch(\"value\",t),this.$watch(\"date\",i),function(t){e.$refs.timepicker.format=t}(this.timeFormat),t(this.value),i(this.date)},handleClear:function(){this.date=this.getDefaultValue(),this.$emit(\"pick\",null)},emit:function(e){for(var t=this,i=arguments.length,n=Array(i>1?i-1:0),r=1;r<i;r++)n[r-1]=arguments[r];if(e)if(Array.isArray(e)){var o=e.map(function(e){return t.showTime?(0,s.clearMilliseconds)(e):(0,s.clearTime)(e)});this.$emit.apply(this,[\"pick\",o].concat(n))}else this.$emit.apply(this,[\"pick\",this.showTime?(0,s.clearMilliseconds)(e):(0,s.clearTime)(e)].concat(n));else this.$emit.apply(this,[\"pick\",e].concat(n));this.userInputDate=null,this.userInputTime=null},showMonthPicker:function(){this.currentView=\"month\"},showYearPicker:function(){this.currentView=\"year\"},prevMonth:function(){this.date=(0,s.prevMonth)(this.date)},nextMonth:function(){this.date=(0,s.nextMonth)(this.date)},prevYear:function(){\"year\"===this.currentView?this.date=(0,s.prevYear)(this.date,10):this.date=(0,s.prevYear)(this.date)},nextYear:function(){\"year\"===this.currentView?this.date=(0,s.nextYear)(this.date,10):this.date=(0,s.nextYear)(this.date)},handleShortcutClick:function(e){e.onClick&&e.onClick(this)},handleTimePick:function(e,t,i){if((0,s.isDate)(e)){var n=this.value?(0,s.modifyTime)(this.value,e.getHours(),e.getMinutes(),e.getSeconds()):(0,s.modifyWithTimeString)(this.getDefaultValue(),this.defaultTime);this.date=n,this.emit(this.date,!0)}else this.emit(e,!0);i||(this.timePickerVisible=t)},handleTimePickClose:function(){this.timePickerVisible=!1},handleMonthPick:function(e){\"month\"===this.selectionMode?(this.date=(0,s.modifyDate)(this.date,this.year,e,1),this.emit(this.date)):(this.date=(0,s.changeYearMonthAndClampDate)(this.date,this.year,e),this.currentView=\"date\")},handleDatePick:function(e){\"day\"===this.selectionMode?(this.date=this.value?(0,s.modifyDate)(this.value,e.getFullYear(),e.getMonth(),e.getDate()):(0,s.modifyWithTimeString)(e,this.defaultTime),this.emit(this.date,this.showTime)):\"week\"===this.selectionMode?this.emit(e.date):\"dates\"===this.selectionMode&&this.emit(e,!0)},handleYearPick:function(e){\"year\"===this.selectionMode?(this.date=(0,s.modifyDate)(this.date,e,0,1),this.emit(this.date)):(this.date=(0,s.changeYearMonthAndClampDate)(this.date,e,this.month),this.currentView=\"month\")},changeToNow:function(){this.disabledDate&&this.disabledDate(new Date)||(this.date=new Date,this.emit(this.date))},confirm:function(){if(\"dates\"===this.selectionMode)this.emit(this.value);else{var e=this.value?this.value:(0,s.modifyWithTimeString)(this.getDefaultValue(),this.defaultTime);this.date=new Date(e),this.emit(e)}},resetView:function(){\"month\"===this.selectionMode?this.currentView=\"month\":\"year\"===this.selectionMode?this.currentView=\"year\":this.currentView=\"date\"},handleEnter:function(){document.body.addEventListener(\"keydown\",this.handleKeydown)},handleLeave:function(){this.$emit(\"dodestroy\"),document.body.removeEventListener(\"keydown\",this.handleKeydown)},handleKeydown:function(e){var t=e.keyCode,i=[38,40,37,39];this.visible&&!this.timePickerVisible&&(-1!==i.indexOf(t)&&(this.handleKeyControl(t),e.stopPropagation(),e.preventDefault()),13===t&&null===this.userInputDate&&null===this.userInputTime&&this.emit(this.date,!1))},handleKeyControl:function(e){for(var t={year:{38:-4,40:4,37:-1,39:1,offset:function(e,t){return e.setFullYear(e.getFullYear()+t)}},month:{38:-4,40:4,37:-1,39:1,offset:function(e,t){return e.setMonth(e.getMonth()+t)}},week:{38:-1,40:1,37:-1,39:1,offset:function(e,t){return e.setDate(e.getDate()+7*t)}},day:{38:-7,40:7,37:-1,39:1,offset:function(e,t){return e.setDate(e.getDate()+t)}}},i=this.selectionMode,n=this.date.getTime(),s=new Date(this.date.getTime());Math.abs(n-s.getTime())<=31536e6;){var r=t[i];if(r.offset(s,r[e]),\"function\"!=typeof this.disabledDate||!this.disabledDate(s)){this.date=s,this.$emit(\"pick\",s,!0);break}}},handleVisibleTimeChange:function(e){var t=(0,s.parseDate)(e,this.timeFormat);t&&(this.date=(0,s.modifyDate)(t,this.year,this.month,this.monthDate),this.userInputTime=null,this.$refs.timepicker.value=this.date,this.timePickerVisible=!1,this.emit(this.date,!0))},handleVisibleDateChange:function(e){var t=(0,s.parseDate)(e,this.dateFormat);if(t){if(\"function\"==typeof this.disabledDate&&this.disabledDate(t))return;this.date=(0,s.modifyTime)(t,this.date.getHours(),this.date.getMinutes(),this.date.getSeconds()),this.userInputDate=null,this.resetView(),this.emit(this.date,!0)}},isValidValue:function(e){return e&&!isNaN(e)&&(\"function\"!=typeof this.disabledDate||!this.disabledDate(e))},getDefaultValue:function(){return this.defaultValue?new Date(this.defaultValue):new Date}},components:{TimePicker:p.default,YearTable:v.default,MonthTable:b.default,DateTable:_.default,ElInput:c.default,ElButton:h.default},data:function(){return{popperClass:\"\",date:new Date,value:\"\",defaultValue:null,defaultTime:null,showTime:!1,selectionMode:\"day\",shortcuts:\"\",visible:!1,currentView:\"date\",disabledDate:\"\",firstDayOfWeek:7,showWeekNumber:!1,timePickerVisible:!1,format:\"\",arrowControl:!1,userInputDate:null,userInputTime:null}},computed:{year:function(){return this.date.getFullYear()},month:function(){return this.date.getMonth()},week:function(){return(0,s.getWeekNumber)(this.date)},monthDate:function(){return this.date.getDate()},footerVisible:function(){return this.showTime||\"dates\"===this.selectionMode},visibleTime:function(){return null!==this.userInputTime?this.userInputTime:(0,s.formatDate)(this.value||this.defaultValue,this.timeFormat)},visibleDate:function(){return null!==this.userInputDate?this.userInputDate:(0,s.formatDate)(this.value||this.defaultValue,this.dateFormat)},yearLabel:function(){var e=this.t(\"el.datepicker.year\");if(\"year\"===this.currentView){var t=10*Math.floor(this.year/10);return e?t+\" \"+e+\" - \"+(t+9)+\" \"+e:t+\" - \"+(t+9)}return this.year+\" \"+e},timeFormat:function(){return this.format?(0,s.extractTimeFormat)(this.format):\"HH:mm:ss\"},dateFormat:function(){return this.format?(0,s.extractDateFormat)(this.format):\"yyyy-MM-dd\"}}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(13),r=i(6),o=n(r),a=i(75),l=n(a);t.default={mixins:[o.default],components:{TimeSpinner:l.default},props:{visible:Boolean,timeArrowControl:Boolean},watch:{visible:function(e){var t=this;e?(this.oldValue=this.value,this.$nextTick(function(){return t.$refs.spinner.emitSelectRange(\"hours\")})):this.needInitAdjust=!0},value:function(e){var t=this,i=void 0;e instanceof Date?i=(0,s.limitTimeRange)(e,this.selectableRange,this.format):e||(i=this.defaultValue?new Date(this.defaultValue):new Date),this.date=i,this.visible&&this.needInitAdjust&&(this.$nextTick(function(e){return t.adjustSpinners()}),this.needInitAdjust=!1)},selectableRange:function(e){this.$refs.spinner.selectableRange=e},defaultValue:function(e){(0,s.isDate)(this.value)||(this.date=e?new Date(e):new Date)}},data:function(){return{popperClass:\"\",format:\"HH:mm:ss\",value:\"\",defaultValue:null,date:new Date,oldValue:new Date,selectableRange:[],selectionRange:[0,2],disabled:!1,arrowControl:!1,needInitAdjust:!0}},computed:{showSeconds:function(){return-1!==(this.format||\"\").indexOf(\"ss\")},useArrow:function(){return this.arrowControl||this.timeArrowControl||!1},amPmMode:function(){return-1!==(this.format||\"\").indexOf(\"A\")?\"A\":-1!==(this.format||\"\").indexOf(\"a\")?\"a\":\"\"}},methods:{handleCancel:function(){this.$emit(\"pick\",this.oldValue,!1)},handleChange:function(e){this.visible&&(this.date=(0,s.clearMilliseconds)(e),this.isValidValue(this.date)&&this.$emit(\"pick\",this.date,!0))},setSelectionRange:function(e,t){this.$emit(\"select-range\",e,t),this.selectionRange=[e,t]},handleConfirm:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments[1];if(!t){var i=(0,s.clearMilliseconds)((0,s.limitTimeRange)(this.date,this.selectableRange,this.format));this.$emit(\"pick\",i,e,t)}},handleKeydown:function(e){var t=e.keyCode,i={38:-1,40:1,37:-1,39:1};if(37===t||39===t){var n=i[t];return this.changeSelectionRange(n),void e.preventDefault()}if(38===t||40===t){var s=i[t];return this.$refs.spinner.scrollDown(s),void e.preventDefault()}},isValidValue:function(e){return(0,s.timeWithinRange)(e,this.selectableRange,this.format)},adjustSpinners:function(){return this.$refs.spinner.adjustSpinners()},changeSelectionRange:function(e){var t=[0,3].concat(this.showSeconds?[6]:[]),i=[\"hours\",\"minutes\"].concat(this.showSeconds?[\"seconds\"]:[]),n=t.indexOf(this.selectionRange[0]),s=(n+e+t.length)%t.length;this.$refs.spinner.emitSelectRange(i[s])}},mounted:function(){var e=this;this.$nextTick(function(){return e.handleConfirm(!0,!0)}),this.$emit(\"mounted\")}}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(13),r=i(26),o=n(r),a=i(73),l=n(a);t.default={components:{ElScrollbar:o.default},directives:{repeatClick:l.default},props:{date:{},defaultValue:{},showSeconds:{type:Boolean,default:!0},arrowControl:Boolean,amPmMode:{type:String,default:\"\"}},computed:{hours:function(){return this.date.getHours()},minutes:function(){return this.date.getMinutes()},seconds:function(){return this.date.getSeconds()},hoursList:function(){return(0,s.getRangeHours)(this.selectableRange)},minutesList:function(){return(0,s.getRangeMinutes)(this.selectableRange,this.hours)},arrowHourList:function(){var e=this.hours;return[e>0?e-1:void 0,e,e<23?e+1:void 0]},arrowMinuteList:function(){var e=this.minutes;return[e>0?e-1:void 0,e,e<59?e+1:void 0]},arrowSecondList:function(){var e=this.seconds;return[e>0?e-1:void 0,e,e<59?e+1:void 0]}},data:function(){return{selectableRange:[],currentScrollbar:null}},mounted:function(){var e=this;this.$nextTick(function(){!e.arrowControl&&e.bindScrollEvent()})},methods:{increase:function(){this.scrollDown(1)},decrease:function(){this.scrollDown(-1)},modifyDateField:function(e,t){switch(e){case\"hours\":this.$emit(\"change\",(0,s.modifyTime)(this.date,t,this.minutes,this.seconds));break;case\"minutes\":this.$emit(\"change\",(0,s.modifyTime)(this.date,this.hours,t,this.seconds));break;case\"seconds\":this.$emit(\"change\",(0,s.modifyTime)(this.date,this.hours,this.minutes,t))}},handleClick:function(e,t){var i=t.value;t.disabled||(this.modifyDateField(e,i),this.emitSelectRange(e),this.adjustSpinner(e,i))},emitSelectRange:function(e){\"hours\"===e?this.$emit(\"select-range\",0,2):\"minutes\"===e?this.$emit(\"select-range\",3,5):\"seconds\"===e&&this.$emit(\"select-range\",6,8),this.currentScrollbar=e},bindScrollEvent:function(){var e=this,t=function(t){e.$refs[t].wrap.onscroll=function(i){e.handleScroll(t,i)}};t(\"hours\"),t(\"minutes\"),t(\"seconds\")},handleScroll:function(e){var t=Math.min(Math.floor((this.$refs[e].wrap.scrollTop-(.5*this.scrollBarHeight(e)-10)/this.typeItemHeight(e)+3)/this.typeItemHeight(e)),\"hours\"===e?23:59);this.modifyDateField(e,t)},adjustSpinners:function(){this.adjustSpinner(\"hours\",this.hours),this.adjustSpinner(\"minutes\",this.minutes),this.adjustSpinner(\"seconds\",this.seconds)},adjustCurrentSpinner:function(e){this.adjustSpinner(e,this[e])},adjustSpinner:function(e,t){if(!this.arrowControl){var i=this.$refs[e].wrap;i&&(i.scrollTop=Math.max(0,t*this.typeItemHeight(e)))}},scrollDown:function(e){this.currentScrollbar||this.emitSelectRange(\"hours\");var t=this.currentScrollbar,i=this.hoursList,n=this[t];if(\"hours\"===this.currentScrollbar){var s=Math.abs(e);e=e>0?1:-1;for(var r=i.length;r--&&s;)n=(n+e+i.length)%i.length,i[n]||s--;if(i[n])return}else n=(n+e+60)%60;this.modifyDateField(t,n),this.adjustSpinner(t,n)},amPm:function(e){if(\"a\"!==this.amPmMode.toLowerCase())return\"\";var t=\"A\"===this.amPmMode,i=e<12?\" am\":\" pm\";return t&&(i=i.toUpperCase()),i},typeItemHeight:function(e){return this.$refs[e].$el.querySelector(\"li\").offsetHeight},scrollBarHeight:function(e){return this.$refs[e].$el.offsetHeight}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-time-spinner\",class:{\"has-seconds\":e.showSeconds}},[e.arrowControl?e._e():[i(\"el-scrollbar\",{ref:\"hours\",staticClass:\"el-time-spinner__wrapper\",attrs:{\"wrap-style\":\"max-height: inherit;\",\"view-class\":\"el-time-spinner__list\",noresize:\"\",tag:\"ul\"},nativeOn:{mouseenter:function(t){e.emitSelectRange(\"hours\")},mousemove:function(t){e.adjustCurrentSpinner(\"hours\")}}},e._l(e.hoursList,function(t,n){return i(\"li\",{staticClass:\"el-time-spinner__item\",class:{active:n===e.hours,disabled:t},on:{click:function(i){e.handleClick(\"hours\",{value:n,disabled:t})}}},[e._v(e._s((\"0\"+(e.amPmMode?n%12||12:n)).slice(-2))+e._s(e.amPm(n)))])})),i(\"el-scrollbar\",{ref:\"minutes\",staticClass:\"el-time-spinner__wrapper\",attrs:{\"wrap-style\":\"max-height: inherit;\",\"view-class\":\"el-time-spinner__list\",noresize:\"\",tag:\"ul\"},nativeOn:{mouseenter:function(t){e.emitSelectRange(\"minutes\")},mousemove:function(t){e.adjustCurrentSpinner(\"minutes\")}}},e._l(e.minutesList,function(t,n){return i(\"li\",{staticClass:\"el-time-spinner__item\",class:{active:n===e.minutes,disabled:!t},on:{click:function(t){e.handleClick(\"minutes\",{value:n,disabled:!1})}}},[e._v(e._s((\"0\"+n).slice(-2)))])})),i(\"el-scrollbar\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showSeconds,expression:\"showSeconds\"}],ref:\"seconds\",staticClass:\"el-time-spinner__wrapper\",attrs:{\"wrap-style\":\"max-height: inherit;\",\"view-class\":\"el-time-spinner__list\",noresize:\"\",tag:\"ul\"},nativeOn:{mouseenter:function(t){e.emitSelectRange(\"seconds\")},mousemove:function(t){e.adjustCurrentSpinner(\"seconds\")}}},e._l(60,function(t,n){return i(\"li\",{key:n,staticClass:\"el-time-spinner__item\",class:{active:n===e.seconds},on:{click:function(t){e.handleClick(\"seconds\",{value:n,disabled:!1})}}},[e._v(e._s((\"0\"+n).slice(-2)))])}))],e.arrowControl?[i(\"div\",{staticClass:\"el-time-spinner__wrapper is-arrow\",on:{mouseenter:function(t){e.emitSelectRange(\"hours\")}}},[i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.decrease,expression:\"decrease\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-up\"}),i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.increase,expression:\"increase\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-down\"}),i(\"ul\",{ref:\"hours\",staticClass:\"el-time-spinner__list\"},e._l(e.arrowHourList,function(t,n){return i(\"li\",{key:n,staticClass:\"el-time-spinner__item\",class:{active:t===e.hours,disabled:e.hoursList[t]}},[e._v(e._s(void 0===t?\"\":(\"0\"+(e.amPmMode?t%12||12:t)).slice(-2)+e.amPm(t)))])}))]),i(\"div\",{staticClass:\"el-time-spinner__wrapper is-arrow\",on:{mouseenter:function(t){e.emitSelectRange(\"minutes\")}}},[i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.decrease,expression:\"decrease\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-up\"}),i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.increase,expression:\"increase\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-down\"}),i(\"ul\",{ref:\"minutes\",staticClass:\"el-time-spinner__list\"},e._l(e.arrowMinuteList,function(t,n){return i(\"li\",{key:n,staticClass:\"el-time-spinner__item\",class:{active:t===e.minutes}},[e._v(\"\\n          \"+e._s(void 0===t?\"\":(\"0\"+t).slice(-2))+\"\\n        \")])}))]),e.showSeconds?i(\"div\",{staticClass:\"el-time-spinner__wrapper is-arrow\",on:{mouseenter:function(t){e.emitSelectRange(\"seconds\")}}},[i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.decrease,expression:\"decrease\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-up\"}),i(\"i\",{directives:[{name:\"repeat-click\",rawName:\"v-repeat-click\",value:e.increase,expression:\"increase\"}],staticClass:\"el-time-spinner__arrow el-icon-arrow-down\"}),i(\"ul\",{ref:\"seconds\",staticClass:\"el-time-spinner__list\"},e._l(e.arrowSecondList,function(t,n){return i(\"li\",{key:n,staticClass:\"el-time-spinner__item\",class:{active:t===e.seconds}},[e._v(\"\\n          \"+e._s(void 0===t?\"\":(\"0\"+t).slice(-2))+\"\\n        \")])}))]):e._e()]:e._e()],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":function(t){e.$emit(\"dodestroy\")}}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-time-panel el-popper\",class:e.popperClass},[i(\"div\",{staticClass:\"el-time-panel__content\",class:{\"has-seconds\":e.showSeconds}},[i(\"time-spinner\",{ref:\"spinner\",attrs:{\"arrow-control\":e.useArrow,\"show-seconds\":e.showSeconds,\"am-pm-mode\":e.amPmMode,date:e.date},on:{change:e.handleChange,\"select-range\":e.setSelectionRange}})],1),i(\"div\",{staticClass:\"el-time-panel__footer\"},[i(\"button\",{staticClass:\"el-time-panel__btn cancel\",attrs:{type:\"button\"},on:{click:e.handleCancel}},[e._v(e._s(e.t(\"el.datepicker.cancel\")))]),i(\"button\",{staticClass:\"el-time-panel__btn\",class:{confirm:!e.disabled},attrs:{type:\"button\"},on:{click:function(t){e.handleConfirm()}}},[e._v(e._s(e.t(\"el.datepicker.confirm\")))])])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(237),s=i.n(n),r=i(238),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(5),s=i(13),r=i(4),o=function(e){var t=(0,s.getDayCountOfYear)(e),i=new Date(e,0,1);return(0,s.range)(t).map(function(e){return(0,s.nextDate)(i,e)})};t.default={props:{disabledDate:{},value:{},defaultValue:{validator:function(e){return null===e||e instanceof Date&&(0,s.isDate)(e)}},date:{}},computed:{startYear:function(){return 10*Math.floor(this.date.getFullYear()/10)}},methods:{getCellStyle:function(e){var t={},i=new Date;return t.disabled=\"function\"==typeof this.disabledDate&&o(e).every(this.disabledDate),t.current=(0,r.arrayFindIndex)((0,r.coerceTruthyValueToArray)(this.value),function(t){return t.getFullYear()===e})>=0,t.today=i.getFullYear()===e,t.default=this.defaultValue&&this.defaultValue.getFullYear()===e,t},handleYearTableClick:function(e){var t=e.target;if(\"A\"===t.tagName){if((0,n.hasClass)(t.parentNode,\"disabled\"))return;var i=t.textContent||t.innerText;this.$emit(\"pick\",Number(i))}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"table\",{staticClass:\"el-year-table\",on:{click:e.handleYearTableClick}},[i(\"tbody\",[i(\"tr\",[i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+0)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+1)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+1))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+2)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+2))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+3)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+3))])])]),i(\"tr\",[i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+4)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+4))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+5)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+5))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+6)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+6))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+7)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+7))])])]),i(\"tr\",[i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+8)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+8))])]),i(\"td\",{staticClass:\"available\",class:e.getCellStyle(e.startYear+9)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.startYear+9))])]),i(\"td\"),i(\"td\")])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(240),s=i.n(n),r=i(241),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(6),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=i(13),o=i(5),a=i(4),l=function(e,t){var i=(0,r.getDayCountOfMonth)(e,t),n=new Date(e,t,1);return(0,r.range)(i).map(function(e){return(0,r.nextDate)(n,e)})};t.default={props:{disabledDate:{},value:{},defaultValue:{validator:function(e){return null===e||e instanceof Date&&(0,r.isDate)(e)}},date:{}},mixins:[s.default],methods:{getCellStyle:function(e){var t={},i=this.date.getFullYear(),n=new Date;return t.disabled=\"function\"==typeof this.disabledDate&&l(i,e).every(this.disabledDate),t.current=(0,a.arrayFindIndex)((0,a.coerceTruthyValueToArray)(this.value),function(t){return t.getFullYear()===i&&t.getMonth()===e})>=0,t.today=n.getFullYear()===i&&n.getMonth()===e,t.default=this.defaultValue&&this.defaultValue.getFullYear()===i&&this.defaultValue.getMonth()===e,t},handleMonthTableClick:function(e){var t=e.target;if(\"A\"===t.tagName&&!(0,o.hasClass)(t.parentNode,\"disabled\")){var i=t.parentNode.cellIndex,n=t.parentNode.parentNode.rowIndex,s=4*n+i;this.$emit(\"pick\",s)}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"table\",{staticClass:\"el-month-table\",on:{click:e.handleMonthTableClick}},[i(\"tbody\",[i(\"tr\",[i(\"td\",{class:e.getCellStyle(0)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.jan\")))])]),i(\"td\",{class:e.getCellStyle(1)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.feb\")))])]),i(\"td\",{class:e.getCellStyle(2)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.mar\")))])]),i(\"td\",{class:e.getCellStyle(3)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.apr\")))])])]),i(\"tr\",[i(\"td\",{class:e.getCellStyle(4)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.may\")))])]),i(\"td\",{class:e.getCellStyle(5)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.jun\")))])]),i(\"td\",{class:e.getCellStyle(6)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.jul\")))])]),i(\"td\",{class:e.getCellStyle(7)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.aug\")))])])]),i(\"tr\",[i(\"td\",{class:e.getCellStyle(8)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.sep\")))])]),i(\"td\",{class:e.getCellStyle(9)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.oct\")))])]),i(\"td\",{class:e.getCellStyle(10)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.nov\")))])]),i(\"td\",{class:e.getCellStyle(11)},[i(\"a\",{staticClass:\"cell\"},[e._v(e._s(e.t(\"el.datepicker.months.dec\")))])])])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(13),s=i(6),r=function(e){return e&&e.__esModule?e:{default:e}}(s),o=i(4),a=[\"sun\",\"mon\",\"tue\",\"wed\",\"thu\",\"fri\",\"sat\"],l=function(e){return\"number\"==typeof e||\"string\"==typeof e?(0,n.clearTime)(new Date(e)).getTime():e instanceof Date?(0,n.clearTime)(e).getTime():NaN},u=function(e,t){var i=\"function\"==typeof t?(0,o.arrayFindIndex)(e,t):e.indexOf(t);return i>=0?[].concat(e.slice(0,i),e.slice(i+1)):e};t.default={mixins:[r.default],props:{firstDayOfWeek:{default:7,type:Number,validator:function(e){return e>=1&&e<=7}},value:{},defaultValue:{validator:function(e){return null===e||(0,n.isDate)(e)||Array.isArray(e)&&e.every(n.isDate)}},date:{},selectionMode:{default:\"day\"},showWeekNumber:{type:Boolean,default:!1},disabledDate:{},minDate:{},maxDate:{},rangeState:{default:function(){return{endDate:null,selecting:!1}}}},computed:{offsetDay:function(){var e=this.firstDayOfWeek;return e>3?7-e:-e},WEEKS:function(){var e=this.firstDayOfWeek;return a.concat(a).slice(e,e+7)},year:function(){return this.date.getFullYear()},month:function(){return this.date.getMonth()},startDate:function(){return(0,n.getStartDateOfMonth)(this.year,this.month)},rows:function(){var e=this,t=new Date(this.year,this.month,1),i=(0,n.getFirstDayOfMonth)(t),s=(0,n.getDayCountOfMonth)(t.getFullYear(),t.getMonth()),r=(0,n.getDayCountOfMonth)(t.getFullYear(),0===t.getMonth()?11:t.getMonth()-1);i=0===i?7:i;for(var a=this.offsetDay,u=this.tableRows,c=1,d=void 0,h=this.startDate,f=this.disabledDate,p=\"dates\"===this.selectionMode?(0,o.coerceTruthyValueToArray)(this.value):[],m=l(new Date),v=0;v<6;v++){var g=u[v];this.showWeekNumber&&(g[0]||(g[0]={type:\"week\",text:(0,n.getWeekNumber)((0,n.nextDate)(h,7*v+1))}));for(var b=0;b<7;b++)!function(t){var u=g[e.showWeekNumber?t+1:t];u||(u={row:v,column:t,type:\"normal\",inRange:!1,start:!1,end:!1}),u.type=\"normal\";var b=7*v+t,y=(0,n.nextDate)(h,b-a).getTime();u.inRange=y>=l(e.minDate)&&y<=l(e.maxDate),u.start=e.minDate&&y===l(e.minDate),u.end=e.maxDate&&y===l(e.maxDate),y===m&&(u.type=\"today\"),v>=0&&v<=1?t+7*v>=i+a?(u.text=c++,2===c&&(d=7*v+t)):(u.text=r-(i+a-t%7)+1+7*v,u.type=\"prev-month\"):c<=s?(u.text=c++,2===c&&(d=7*v+t)):(u.text=c++-s,u.type=\"next-month\");var _=new Date(y);u.disabled=\"function\"==typeof f&&f(_),u.selected=(0,o.arrayFind)(p,function(e){return e.getTime()===_.getTime()}),e.$set(g,e.showWeekNumber?t+1:t,u)}(b);if(\"week\"===this.selectionMode){var y=this.showWeekNumber?1:0,_=this.showWeekNumber?7:6,C=this.isWeekActive(g[y+1]);g[y].inRange=C,g[y].start=C,g[_].inRange=C,g[_].end=C}}return u.firstDayPosition=d,u}},watch:{\"rangeState.endDate\":function(e){this.markRange(this.minDate,e)},minDate:function(e,t){l(e)!==l(t)&&this.markRange(this.minDate,this.maxDate)},maxDate:function(e,t){l(e)!==l(t)&&this.markRange(this.minDate,this.maxDate)}},data:function(){return{tableRows:[[],[],[],[],[],[]],lastRow:null,lastColumn:null}},methods:{cellMatchesDate:function(e,t){var i=new Date(t);return this.year===i.getFullYear()&&this.month===i.getMonth()&&Number(e.text)===i.getDate()},getCellClasses:function(e){var t=this,i=this.selectionMode,n=this.defaultValue?Array.isArray(this.defaultValue)?this.defaultValue:[this.defaultValue]:[],s=[];return\"normal\"!==e.type&&\"today\"!==e.type||e.disabled?s.push(e.type):(s.push(\"available\"),\"today\"===e.type&&s.push(\"today\")),\"normal\"===e.type&&n.some(function(i){return t.cellMatchesDate(e,i)})&&s.push(\"default\"),\"day\"!==i||\"normal\"!==e.type&&\"today\"!==e.type||!this.cellMatchesDate(e,this.value)||s.push(\"current\"),!e.inRange||\"normal\"!==e.type&&\"today\"!==e.type&&\"week\"!==this.selectionMode||(s.push(\"in-range\"),e.start&&s.push(\"start-date\"),e.end&&s.push(\"end-date\")),e.disabled&&s.push(\"disabled\"),e.selected&&s.push(\"selected\"),s.join(\" \")},getDateOfCell:function(e,t){var i=7*e+(t-(this.showWeekNumber?1:0))-this.offsetDay;return(0,n.nextDate)(this.startDate,i)},isWeekActive:function(e){if(\"week\"!==this.selectionMode)return!1;var t=new Date(this.year,this.month,1),i=t.getFullYear(),s=t.getMonth();return\"prev-month\"===e.type&&(t.setMonth(0===s?11:s-1),t.setFullYear(0===s?i-1:i)),\"next-month\"===e.type&&(t.setMonth(11===s?0:s+1),t.setFullYear(11===s?i+1:i)),t.setDate(parseInt(e.text,10)),i===((0,n.isDate)(this.value)?this.value.getFullYear():null)&&(0,n.getWeekNumber)(t)===(0,n.getWeekNumber)(this.value)},markRange:function(e,t){e=l(e),t=l(t)||e;var i=[Math.min(e,t),Math.max(e,t)];e=i[0],t=i[1];for(var s=this.startDate,r=this.rows,o=0,a=r.length;o<a;o++)for(var u=r[o],c=0,d=u.length;c<d;c++)if(!this.showWeekNumber||0!==c){var h=u[c],f=7*o+c+(this.showWeekNumber?-1:0),p=(0,n.nextDate)(s,f-this.offsetDay).getTime();h.inRange=e&&p>=e&&p<=t,h.start=e&&p===e,h.end=t&&p===t}},handleMouseMove:function(e){if(this.rangeState.selecting){var t=e.target;if(\"SPAN\"===t.tagName&&(t=t.parentNode.parentNode),\"DIV\"===t.tagName&&(t=t.parentNode),\"TD\"===t.tagName){var i=t.parentNode.rowIndex-1,n=t.cellIndex;this.rows[i][n].disabled||i===this.lastRow&&n===this.lastColumn||(this.lastRow=i,this.lastColumn=n,this.$emit(\"changerange\",{minDate:this.minDate,maxDate:this.maxDate,rangeState:{selecting:!0,endDate:this.getDateOfCell(i,n)}}))}}},handleClick:function(e){var t=e.target;if(\"SPAN\"===t.tagName&&(t=t.parentNode.parentNode),\"DIV\"===t.tagName&&(t=t.parentNode),\"TD\"===t.tagName){var i=t.parentNode.rowIndex-1,s=\"week\"===this.selectionMode?1:t.cellIndex,r=this.rows[i][s];if(!r.disabled&&\"week\"!==r.type){var o=this.getDateOfCell(i,s);if(\"range\"===this.selectionMode)this.rangeState.selecting?(o>=this.minDate?this.$emit(\"pick\",{minDate:this.minDate,maxDate:o}):this.$emit(\"pick\",{minDate:o,maxDate:this.minDate}),this.rangeState.selecting=!1):(this.$emit(\"pick\",{minDate:o,maxDate:null}),this.rangeState.selecting=!0);else if(\"day\"===this.selectionMode)this.$emit(\"pick\",o);else if(\"week\"===this.selectionMode){var a=(0,n.getWeekNumber)(o),l=o.getFullYear()+\"w\"+a;this.$emit(\"pick\",{year:o.getFullYear(),week:a,value:l,date:o})}else if(\"dates\"===this.selectionMode){var c=this.value||[],d=r.selected?u(c,function(e){return e.getTime()===o.getTime()}):[].concat(c,[o]);this.$emit(\"pick\",d)}}}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"table\",{staticClass:\"el-date-table\",class:{\"is-week-mode\":\"week\"===e.selectionMode},attrs:{cellspacing:\"0\",cellpadding:\"0\"},on:{click:e.handleClick,mousemove:e.handleMouseMove}},[i(\"tbody\",[i(\"tr\",[e.showWeekNumber?i(\"th\",[e._v(e._s(e.t(\"el.datepicker.week\")))]):e._e(),e._l(e.WEEKS,function(t,n){return i(\"th\",{key:n},[e._v(e._s(e.t(\"el.datepicker.weeks.\"+t)))])})],2),e._l(e.rows,function(t,n){return i(\"tr\",{key:n,staticClass:\"el-date-table__row\",class:{current:e.isWeekActive(t[1])}},e._l(t,function(t,n){return i(\"td\",{key:n,class:e.getCellClasses(t)},[i(\"div\",[i(\"span\",[e._v(\"\\n          \"+e._s(t.text)+\"\\n        \")])])])}))})],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-enter\":e.handleEnter,\"after-leave\":e.handleLeave}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-picker-panel el-date-picker el-popper\",class:[{\"has-sidebar\":e.$slots.sidebar||e.shortcuts,\"has-time\":e.showTime},e.popperClass]},[i(\"div\",{staticClass:\"el-picker-panel__body-wrapper\"},[e._t(\"sidebar\"),e.shortcuts?i(\"div\",{staticClass:\"el-picker-panel__sidebar\"},e._l(e.shortcuts,function(t,n){return i(\"button\",{key:n,staticClass:\"el-picker-panel__shortcut\",attrs:{type:\"button\"},on:{click:function(i){e.handleShortcutClick(t)}}},[e._v(e._s(t.text))])})):e._e(),i(\"div\",{staticClass:\"el-picker-panel__body\"},[e.showTime?i(\"div\",{staticClass:\"el-date-picker__time-header\"},[i(\"span\",{staticClass:\"el-date-picker__editor-wrap\"},[i(\"el-input\",{attrs:{placeholder:e.t(\"el.datepicker.selectDate\"),value:e.visibleDate,size:\"small\"},on:{input:function(t){return e.userInputDate=t},change:e.handleVisibleDateChange}})],1),i(\"span\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleTimePickClose,expression:\"handleTimePickClose\"}],staticClass:\"el-date-picker__editor-wrap\"},[i(\"el-input\",{ref:\"input\",attrs:{placeholder:e.t(\"el.datepicker.selectTime\"),value:e.visibleTime,size:\"small\"},on:{focus:function(t){e.timePickerVisible=!0},input:function(t){return e.userInputTime=t},change:e.handleVisibleTimeChange}}),i(\"time-picker\",{ref:\"timepicker\",attrs:{\"time-arrow-control\":e.arrowControl,visible:e.timePickerVisible},on:{pick:e.handleTimePick,mounted:e.proxyTimePickerDataProperties}})],1)]):e._e(),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"time\"!==e.currentView,expression:\"currentView !== 'time'\"}],staticClass:\"el-date-picker__header\",class:{\"el-date-picker__header--bordered\":\"year\"===e.currentView||\"month\"===e.currentView}},[i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left\",attrs:{type:\"button\",\"aria-label\":e.t(\"el.datepicker.prevYear\")},on:{click:e.prevYear}}),i(\"button\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"date\"===e.currentView,expression:\"currentView === 'date'\"}],staticClass:\"el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-arrow-left\",attrs:{type:\"button\",\"aria-label\":e.t(\"el.datepicker.prevMonth\")},on:{click:e.prevMonth}}),i(\"span\",{staticClass:\"el-date-picker__header-label\",attrs:{role:\"button\"},on:{click:e.showYearPicker}},[e._v(e._s(e.yearLabel))]),i(\"span\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"date\"===e.currentView,expression:\"currentView === 'date'\"}],staticClass:\"el-date-picker__header-label\",class:{active:\"month\"===e.currentView},attrs:{role:\"button\"},on:{click:e.showMonthPicker}},[e._v(e._s(e.t(\"el.datepicker.month\"+(e.month+1))))]),i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right\",attrs:{type:\"button\",\"aria-label\":e.t(\"el.datepicker.nextYear\")},on:{click:e.nextYear}}),i(\"button\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"date\"===e.currentView,expression:\"currentView === 'date'\"}],staticClass:\"el-picker-panel__icon-btn el-date-picker__next-btn el-icon-arrow-right\",attrs:{type:\"button\",\"aria-label\":e.t(\"el.datepicker.nextMonth\")},on:{click:e.nextMonth}})]),i(\"div\",{staticClass:\"el-picker-panel__content\"},[i(\"date-table\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"date\"===e.currentView,expression:\"currentView === 'date'\"}],attrs:{\"selection-mode\":e.selectionMode,\"first-day-of-week\":e.firstDayOfWeek,value:e.value,\"default-value\":e.defaultValue?new Date(e.defaultValue):null,date:e.date,\"disabled-date\":e.disabledDate},on:{pick:e.handleDatePick}}),i(\"year-table\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"year\"===e.currentView,expression:\"currentView === 'year'\"}],attrs:{value:e.value,\"default-value\":e.defaultValue?new Date(e.defaultValue):null,date:e.date,\"disabled-date\":e.disabledDate},on:{pick:e.handleYearPick}}),i(\"month-table\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"month\"===e.currentView,expression:\"currentView === 'month'\"}],attrs:{value:e.value,\"default-value\":e.defaultValue?new Date(e.defaultValue):null,date:e.date,\"disabled-date\":e.disabledDate},on:{pick:e.handleMonthPick}})],1)])],2),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.footerVisible&&\"date\"===e.currentView,expression:\"footerVisible && currentView === 'date'\"}],staticClass:\"el-picker-panel__footer\"},[i(\"el-button\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"dates\"!==e.selectionMode,expression:\"selectionMode !== 'dates'\"}],staticClass:\"el-picker-panel__link-btn\",attrs:{size:\"mini\",type:\"text\"},on:{click:e.changeToNow}},[e._v(\"\\n        \"+e._s(e.t(\"el.datepicker.now\"))+\"\\n      \")]),i(\"el-button\",{staticClass:\"el-picker-panel__link-btn\",attrs:{plain:\"\",size:\"mini\"},on:{click:e.confirm}},[e._v(\"\\n        \"+e._s(e.t(\"el.datepicker.confirm\"))+\"\\n      \")])],1)])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(246),s=i.n(n),r=i(247),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(13),r=i(12),o=n(r),a=i(6),l=n(a),u=i(50),c=n(u),d=i(76),h=n(d),f=i(8),p=n(f),m=i(19),v=n(m),g=function(e,t){return new Date(new Date(e).getTime()+t)},b=function(e){return Array.isArray(e)?[new Date(e[0]),new Date(e[1])]:e?[new Date(e),g(e,864e5)]:[new Date,g(Date.now(),864e5)]};t.default={mixins:[l.default],directives:{Clickoutside:o.default},computed:{btnDisabled:function(){return!(this.minDate&&this.maxDate&&!this.selecting&&this.isValidValue([this.minDate,this.maxDate]))},leftLabel:function(){return this.leftDate.getFullYear()+\" \"+this.t(\"el.datepicker.year\")+\" \"+this.t(\"el.datepicker.month\"+(this.leftDate.getMonth()+1))},rightLabel:function(){return this.rightDate.getFullYear()+\" \"+this.t(\"el.datepicker.year\")+\" \"+this.t(\"el.datepicker.month\"+(this.rightDate.getMonth()+1))},leftYear:function(){return this.leftDate.getFullYear()},leftMonth:function(){return this.leftDate.getMonth()},leftMonthDate:function(){return this.leftDate.getDate()},rightYear:function(){return this.rightDate.getFullYear()},rightMonth:function(){return this.rightDate.getMonth()},rightMonthDate:function(){return this.rightDate.getDate()},minVisibleDate:function(){return this.minDate?(0,s.formatDate)(this.minDate,this.dateFormat):\"\"},maxVisibleDate:function(){return this.maxDate||this.minDate?(0,s.formatDate)(this.maxDate||this.minDate,this.dateFormat):\"\"},minVisibleTime:function(){return this.minDate?(0,s.formatDate)(this.minDate,this.timeFormat):\"\"},maxVisibleTime:function(){return this.maxDate||this.minDate?(0,s.formatDate)(this.maxDate||this.minDate,this.timeFormat):\"\"},timeFormat:function(){return this.format?(0,s.extractTimeFormat)(this.format):\"HH:mm:ss\"},dateFormat:function(){return this.format?(0,s.extractDateFormat)(this.format):\"yyyy-MM-dd\"},enableMonthArrow:function(){var e=(this.leftMonth+1)%12,t=this.leftMonth+1>=12?1:0;return this.unlinkPanels&&new Date(this.leftYear+t,e)<new Date(this.rightYear,this.rightMonth)},enableYearArrow:function(){return this.unlinkPanels&&12*this.rightYear+this.rightMonth-(12*this.leftYear+this.leftMonth+1)>=12}},data:function(){return{popperClass:\"\",value:[],defaultValue:null,defaultTime:null,minDate:\"\",maxDate:\"\",leftDate:new Date,rightDate:(0,s.nextMonth)(new Date),rangeState:{endDate:null,selecting:!1,row:null,column:null},showTime:!1,shortcuts:\"\",visible:\"\",disabledDate:\"\",firstDayOfWeek:7,minTimePickerVisible:!1,maxTimePickerVisible:!1,format:\"\",arrowControl:!1,unlinkPanels:!1}},watch:{minDate:function(e){var t=this;this.$nextTick(function(){if(t.$refs.maxTimePicker&&t.maxDate&&t.maxDate<t.minDate){t.$refs.maxTimePicker.selectableRange=[[(0,s.parseDate)((0,s.formatDate)(t.minDate,\"HH:mm:ss\"),\"HH:mm:ss\"),(0,s.parseDate)(\"23:59:59\",\"HH:mm:ss\")]]}}),e&&this.$refs.minTimePicker&&(this.$refs.minTimePicker.date=e,this.$refs.minTimePicker.value=e)},maxDate:function(e){e&&this.$refs.maxTimePicker&&(this.$refs.maxTimePicker.date=e,this.$refs.maxTimePicker.value=e)},minTimePickerVisible:function(e){var t=this;e&&this.$nextTick(function(){t.$refs.minTimePicker.date=t.minDate,t.$refs.minTimePicker.value=t.minDate,t.$refs.minTimePicker.adjustSpinners()})},maxTimePickerVisible:function(e){var t=this;e&&this.$nextTick(function(){t.$refs.maxTimePicker.date=t.maxDate,t.$refs.maxTimePicker.value=t.maxDate,t.$refs.maxTimePicker.adjustSpinners()})},value:function(e){if(e){if(Array.isArray(e))if(this.minDate=(0,s.isDate)(e[0])?new Date(e[0]):null,this.maxDate=(0,s.isDate)(e[1])?new Date(e[1]):null,this.minDate)if(this.leftDate=this.minDate,this.unlinkPanels&&this.maxDate){var t=this.minDate.getFullYear(),i=this.minDate.getMonth(),n=this.maxDate.getFullYear(),r=this.maxDate.getMonth();this.rightDate=t===n&&i===r?(0,s.nextMonth)(this.maxDate):this.maxDate}else this.rightDate=(0,s.nextMonth)(this.leftDate);else this.leftDate=b(this.defaultValue)[0],this.rightDate=(0,s.nextMonth)(this.leftDate)}else this.minDate=null,this.maxDate=null},defaultValue:function(e){if(!Array.isArray(this.value)){var t=b(e),i=t[0],n=t[1];this.leftDate=i,this.rightDate=e&&e[1]&&this.unlinkPanels?n:(0,s.nextMonth)(this.leftDate)}}},methods:{handleClear:function(){this.minDate=null,this.maxDate=null,this.leftDate=b(this.defaultValue)[0],this.rightDate=(0,s.nextMonth)(this.leftDate),this.$emit(\"pick\",null)},handleChangeRange:function(e){this.minDate=e.minDate,this.maxDate=e.maxDate,this.rangeState=e.rangeState},handleDateInput:function(e,t){var i=e.target.value;if(i.length===this.dateFormat.length){var n=(0,s.parseDate)(i,this.dateFormat);if(n){if(\"function\"==typeof this.disabledDate&&this.disabledDate(new Date(n)))return;\"min\"===t?(this.minDate=new Date(n),this.leftDate=new Date(n),this.rightDate=(0,s.nextMonth)(this.leftDate)):(this.maxDate=new Date(n),this.leftDate=(0,s.prevMonth)(n),this.rightDate=new Date(n))}}},handleDateChange:function(e,t){var i=e.target.value,n=(0,s.parseDate)(i,this.dateFormat);n&&(\"min\"===t?(this.minDate=(0,s.modifyDate)(this.minDate,n.getFullYear(),n.getMonth(),n.getDate()),this.minDate>this.maxDate&&(this.maxDate=this.minDate)):(this.maxDate=(0,s.modifyDate)(this.maxDate,n.getFullYear(),n.getMonth(),n.getDate()),this.maxDate<this.minDate&&(this.minDate=this.maxDate)))},handleTimeChange:function(e,t){var i=e.target.value,n=(0,s.parseDate)(i,this.timeFormat);n&&(\"min\"===t?(this.minDate=(0,s.modifyTime)(this.minDate,n.getHours(),n.getMinutes(),n.getSeconds()),this.minDate>this.maxDate&&(this.maxDate=this.minDate),this.$refs.minTimePicker.value=this.minDate,this.minTimePickerVisible=!1):(this.maxDate=(0,s.modifyTime)(this.maxDate,n.getHours(),n.getMinutes(),n.getSeconds()),this.maxDate<this.minDate&&(this.minDate=this.maxDate),this.$refs.maxTimePicker.value=this.minDate,this.maxTimePickerVisible=!1))},handleRangePick:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this.defaultTime||[],r=(0,s.modifyWithTimeString)(e.minDate,n[0]),o=(0,s.modifyWithTimeString)(e.maxDate,n[1]);this.maxDate===o&&this.minDate===r||(this.onPick&&this.onPick(e),this.maxDate=o,this.minDate=r,setTimeout(function(){t.maxDate=o,t.minDate=r},10),i&&!this.showTime&&this.handleConfirm())},handleShortcutClick:function(e){e.onClick&&e.onClick(this)},handleMinTimePick:function(e,t,i){this.minDate=this.minDate||new Date,e&&(this.minDate=(0,s.modifyTime)(this.minDate,e.getHours(),e.getMinutes(),e.getSeconds())),i||(this.minTimePickerVisible=t),(!this.maxDate||this.maxDate&&this.maxDate.getTime()<this.minDate.getTime())&&(this.maxDate=new Date(this.minDate))},handleMinTimeClose:function(){this.minTimePickerVisible=!1},handleMaxTimePick:function(e,t,i){this.maxDate&&e&&(this.maxDate=(0,s.modifyTime)(this.maxDate,e.getHours(),e.getMinutes(),e.getSeconds())),i||(this.maxTimePickerVisible=t),this.maxDate&&this.minDate&&this.minDate.getTime()>this.maxDate.getTime()&&(this.minDate=new Date(this.maxDate))},handleMaxTimeClose:function(){this.maxTimePickerVisible=!1},leftPrevYear:function(){this.leftDate=(0,s.prevYear)(this.leftDate),this.unlinkPanels||(this.rightDate=(0,s.nextMonth)(this.leftDate))},leftPrevMonth:function(){this.leftDate=(0,s.prevMonth)(this.leftDate),this.unlinkPanels||(this.rightDate=(0,s.nextMonth)(this.leftDate))},rightNextYear:function(){this.unlinkPanels?this.rightDate=(0,s.nextYear)(this.rightDate):(this.leftDate=(0,s.nextYear)(this.leftDate),this.rightDate=(0,s.nextMonth)(this.leftDate))},rightNextMonth:function(){this.unlinkPanels?this.rightDate=(0,s.nextMonth)(this.rightDate):(this.leftDate=(0,s.nextMonth)(this.leftDate),this.rightDate=(0,s.nextMonth)(this.leftDate))},leftNextYear:function(){this.leftDate=(0,s.nextYear)(this.leftDate)},leftNextMonth:function(){this.leftDate=(0,s.nextMonth)(this.leftDate)},rightPrevYear:function(){this.rightDate=(0,s.prevYear)(this.rightDate)},rightPrevMonth:function(){this.rightDate=(0,s.prevMonth)(this.rightDate)},handleConfirm:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.isValidValue([this.minDate,this.maxDate])&&this.$emit(\"pick\",[this.minDate,this.maxDate],e)},isValidValue:function(e){return Array.isArray(e)&&e&&e[0]&&e[1]&&(0,s.isDate)(e[0])&&(0,s.isDate)(e[1])&&e[0].getTime()<=e[1].getTime()&&(\"function\"!=typeof this.disabledDate||!this.disabledDate(e[0])&&!this.disabledDate(e[1]))},resetView:function(){this.minDate=this.value&&(0,s.isDate)(this.value[0])?new Date(this.value[0]):null,this.maxDate=this.value&&(0,s.isDate)(this.value[0])?new Date(this.value[1]):null}},components:{TimePicker:c.default,DateTable:h.default,ElInput:p.default,ElButton:v.default}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":function(t){e.$emit(\"dodestroy\")}}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-picker-panel el-date-range-picker el-popper\",class:[{\"has-sidebar\":e.$slots.sidebar||e.shortcuts,\"has-time\":e.showTime},e.popperClass]},[i(\"div\",{staticClass:\"el-picker-panel__body-wrapper\"},[e._t(\"sidebar\"),e.shortcuts?i(\"div\",{staticClass:\"el-picker-panel__sidebar\"},e._l(e.shortcuts,function(t,n){return i(\"button\",{key:n,staticClass:\"el-picker-panel__shortcut\",attrs:{type:\"button\"},on:{click:function(i){e.handleShortcutClick(t)}}},[e._v(e._s(t.text))])})):e._e(),i(\"div\",{staticClass:\"el-picker-panel__body\"},[e.showTime?i(\"div\",{staticClass:\"el-date-range-picker__time-header\"},[i(\"span\",{staticClass:\"el-date-range-picker__editors-wrap\"},[i(\"span\",{staticClass:\"el-date-range-picker__time-picker-wrap\"},[i(\"el-input\",{ref:\"minInput\",staticClass:\"el-date-range-picker__editor\",attrs:{size:\"small\",disabled:e.rangeState.selecting,placeholder:e.t(\"el.datepicker.startDate\"),value:e.minVisibleDate},nativeOn:{input:function(t){e.handleDateInput(t,\"min\")},change:function(t){e.handleDateChange(t,\"min\")}}})],1),i(\"span\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleMinTimeClose,expression:\"handleMinTimeClose\"}],staticClass:\"el-date-range-picker__time-picker-wrap\"},[i(\"el-input\",{staticClass:\"el-date-range-picker__editor\",attrs:{size:\"small\",disabled:e.rangeState.selecting,placeholder:e.t(\"el.datepicker.startTime\"),value:e.minVisibleTime},on:{focus:function(t){e.minTimePickerVisible=!0}},nativeOn:{change:function(t){e.handleTimeChange(t,\"min\")}}}),i(\"time-picker\",{ref:\"minTimePicker\",attrs:{\"time-arrow-control\":e.arrowControl,visible:e.minTimePickerVisible},on:{pick:e.handleMinTimePick,mounted:function(t){e.$refs.minTimePicker.format=e.timeFormat}}})],1)]),i(\"span\",{staticClass:\"el-icon-arrow-right\"}),i(\"span\",{staticClass:\"el-date-range-picker__editors-wrap is-right\"},[i(\"span\",{staticClass:\"el-date-range-picker__time-picker-wrap\"},[i(\"el-input\",{staticClass:\"el-date-range-picker__editor\",attrs:{size:\"small\",disabled:e.rangeState.selecting,placeholder:e.t(\"el.datepicker.endDate\"),value:e.maxVisibleDate,readonly:!e.minDate},nativeOn:{input:function(t){e.handleDateInput(t,\"max\")},change:function(t){e.handleDateChange(t,\"max\")}}})],1),i(\"span\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleMaxTimeClose,expression:\"handleMaxTimeClose\"}],staticClass:\"el-date-range-picker__time-picker-wrap\"},[i(\"el-input\",{ref:\"maxInput\",staticClass:\"el-date-range-picker__editor\",attrs:{size:\"small\",disabled:e.rangeState.selecting,placeholder:e.t(\"el.datepicker.endTime\"),value:e.maxVisibleTime,readonly:!e.minDate},on:{focus:function(t){e.minDate&&(e.maxTimePickerVisible=!0)}},nativeOn:{change:function(t){e.handleTimeChange(t,\"max\")}}}),i(\"time-picker\",{ref:\"maxTimePicker\",attrs:{\"time-arrow-control\":e.arrowControl,visible:e.maxTimePickerVisible},on:{pick:e.handleMaxTimePick,mounted:function(t){e.$refs.maxTimePicker.format=e.timeFormat}}})],1)])]):e._e(),i(\"div\",{staticClass:\"el-picker-panel__content el-date-range-picker__content is-left\"},[i(\"div\",{staticClass:\"el-date-range-picker__header\"},[i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-d-arrow-left\",attrs:{type:\"button\"},on:{click:e.leftPrevYear}}),i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-arrow-left\",attrs:{type:\"button\"},on:{click:e.leftPrevMonth}}),e.unlinkPanels?i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-d-arrow-right\",class:{\"is-disabled\":!e.enableYearArrow},attrs:{type:\"button\",disabled:!e.enableYearArrow},on:{click:e.leftNextYear}}):e._e(),e.unlinkPanels?i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-arrow-right\",class:{\"is-disabled\":!e.enableMonthArrow},attrs:{type:\"button\",disabled:!e.enableMonthArrow},on:{click:e.leftNextMonth}}):e._e(),i(\"div\",[e._v(e._s(e.leftLabel))])]),i(\"date-table\",{attrs:{\"selection-mode\":\"range\",date:e.leftDate,\"default-value\":e.defaultValue,\"min-date\":e.minDate,\"max-date\":e.maxDate,\"range-state\":e.rangeState,\"disabled-date\":e.disabledDate,\"first-day-of-week\":e.firstDayOfWeek},on:{changerange:e.handleChangeRange,pick:e.handleRangePick}})],1),i(\"div\",{staticClass:\"el-picker-panel__content el-date-range-picker__content is-right\"},[i(\"div\",{staticClass:\"el-date-range-picker__header\"},[e.unlinkPanels?i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-d-arrow-left\",class:{\"is-disabled\":!e.enableYearArrow},attrs:{type:\"button\",disabled:!e.enableYearArrow},on:{click:e.rightPrevYear}}):e._e(),e.unlinkPanels?i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-arrow-left\",class:{\"is-disabled\":!e.enableMonthArrow},attrs:{type:\"button\",disabled:!e.enableMonthArrow},on:{click:e.rightPrevMonth}}):e._e(),i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-d-arrow-right\",attrs:{type:\"button\"},on:{click:e.rightNextYear}}),i(\"button\",{staticClass:\"el-picker-panel__icon-btn el-icon-arrow-right\",attrs:{type:\"button\"},on:{click:e.rightNextMonth}}),i(\"div\",[e._v(e._s(e.rightLabel))])]),i(\"date-table\",{attrs:{\"selection-mode\":\"range\",date:e.rightDate,\"default-value\":e.defaultValue,\"min-date\":e.minDate,\"max-date\":e.maxDate,\"range-state\":e.rangeState,\"disabled-date\":e.disabledDate,\"first-day-of-week\":e.firstDayOfWeek},on:{changerange:e.handleChangeRange,pick:e.handleRangePick}})],1)])],2),e.showTime?i(\"div\",{staticClass:\"el-picker-panel__footer\"},[i(\"el-button\",{staticClass:\"el-picker-panel__link-btn\",attrs:{size:\"mini\",type:\"text\"},on:{click:e.handleClear}},[e._v(\"\\n        \"+e._s(e.t(\"el.datepicker.clear\"))+\"\\n      \")]),i(\"el-button\",{staticClass:\"el-picker-panel__link-btn\",attrs:{plain:\"\",size:\"mini\",disabled:e.btnDisabled},on:{click:function(t){e.handleConfirm(!1)}}},[e._v(\"\\n        \"+e._s(e.t(\"el.datepicker.confirm\"))+\"\\n      \")])],1):e._e()])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(249),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(49),r=n(s),o=i(250),a=n(o);t.default={mixins:[r.default],name:\"ElTimeSelect\",componentName:\"ElTimeSelect\",props:{type:{type:String,default:\"time-select\"}},beforeCreate:function(){this.panel=a.default}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(251),s=i.n(n),r=i(252),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(26),r=n(s),o=i(45),a=n(o),l=function(e){var t=(e||\"\").split(\":\");if(t.length>=2){return{hours:parseInt(t[0],10),minutes:parseInt(t[1],10)}}return null},u=function(e,t){var i=l(e),n=l(t),s=i.minutes+60*i.hours,r=n.minutes+60*n.hours;return s===r?0:s>r?1:-1},c=function(e){return(e.hours<10?\"0\"+e.hours:e.hours)+\":\"+(e.minutes<10?\"0\"+e.minutes:e.minutes)},d=function(e,t){var i=l(e),n=l(t),s={hours:i.hours,minutes:i.minutes};return s.minutes+=n.minutes,s.hours+=n.hours,s.hours+=Math.floor(s.minutes/60),s.minutes=s.minutes%60,c(s)};t.default={components:{ElScrollbar:r.default},watch:{value:function(e){var t=this;e&&this.$nextTick(function(){return t.scrollToOption()})}},methods:{handleClick:function(e){e.disabled||this.$emit(\"pick\",e.value)},handleClear:function(){this.$emit(\"pick\",null)},scrollToOption:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\".selected\",t=this.$refs.popper.querySelector(\".el-picker-panel__content\");(0,a.default)(t,t.querySelector(e))},handleMenuEnter:function(){var e=this,t=-1!==this.items.map(function(e){return e.value}).indexOf(this.value),i=-1!==this.items.map(function(e){return e.value}).indexOf(this.defaultValue),n=t&&\".selected\"||i&&\".default\"||\".time-select-item:not(.disabled)\";this.$nextTick(function(){return e.scrollToOption(n)})},scrollDown:function(e){for(var t=this.items,i=t.length,n=t.length,s=t.map(function(e){return e.value}).indexOf(this.value);n--;)if(s=(s+e+i)%i,!t[s].disabled)return void this.$emit(\"pick\",t[s].value,!0)},isValidValue:function(e){return-1!==this.items.filter(function(e){return!e.disabled}).map(function(e){return e.value}).indexOf(e)},handleKeydown:function(e){var t=e.keyCode;if(38===t||40===t){var i={40:1,38:-1},n=i[t.toString()];return this.scrollDown(n),void e.stopPropagation()}}},data:function(){return{popperClass:\"\",start:\"09:00\",end:\"18:00\",step:\"00:30\",value:\"\",defaultValue:\"\",visible:!1,minTime:\"\",maxTime:\"\",width:0}},computed:{items:function(){var e=this.start,t=this.end,i=this.step,n=[];if(e&&t&&i)for(var s=e;u(s,t)<=0;)n.push({value:s,disabled:u(s,this.minTime||\"-1:-1\")<=0||u(s,this.maxTime||\"100:100\")>=0}),s=d(s,i);return n}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"before-enter\":e.handleMenuEnter,\"after-leave\":function(t){e.$emit(\"dodestroy\")}}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],ref:\"popper\",staticClass:\"el-picker-panel time-select el-popper\",class:e.popperClass,style:{width:e.width+\"px\"}},[i(\"el-scrollbar\",{attrs:{noresize:\"\",\"wrap-class\":\"el-picker-panel__content\"}},e._l(e.items,function(t){return i(\"div\",{staticClass:\"time-select-item\",class:{selected:e.value===t.value,disabled:t.disabled,default:t.value===e.defaultValue},attrs:{disabled:t.disabled},on:{click:function(i){e.handleClick(t)}}},[e._v(e._s(t.value))])}))],1)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(254),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(49),r=n(s),o=i(50),a=n(o),l=i(255),u=n(l);t.default={mixins:[r.default],name:\"ElTimePicker\",props:{isRange:Boolean,arrowControl:Boolean},data:function(){return{type:\"\"}},watch:{isRange:function(e){this.picker?(this.unmountPicker(),this.type=e?\"timerange\":\"time\",this.panel=e?u.default:a.default,this.mountPicker()):(this.type=e?\"timerange\":\"time\",this.panel=e?u.default:a.default)}},created:function(){this.type=this.isRange?\"timerange\":\"time\",this.panel=this.isRange?u.default:a.default}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(256),s=i.n(n),r=i(257),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(13),r=i(6),o=n(r),a=i(75),l=n(a),u=(0,s.parseDate)(\"00:00:00\",\"HH:mm:ss\"),c=(0,s.parseDate)(\"23:59:59\",\"HH:mm:ss\"),d=function(e){return(0,s.modifyDate)(u,e.getFullYear(),e.getMonth(),e.getDate())},h=function(e){return(0,s.modifyDate)(c,e.getFullYear(),e.getMonth(),e.getDate())},f=function(e,t){return new Date(Math.min(e.getTime()+t,h(e).getTime()))};t.default={mixins:[o.default],components:{TimeSpinner:l.default},computed:{showSeconds:function(){return-1!==(this.format||\"\").indexOf(\"ss\")},offset:function(){return this.showSeconds?11:8},spinner:function(){return this.selectionRange[0]<this.offset?this.$refs.minSpinner:this.$refs.maxSpinner},btnDisabled:function(){return this.minDate.getTime()>this.maxDate.getTime()},amPmMode:function(){return-1!==(this.format||\"\").indexOf(\"A\")?\"A\":-1!==(this.format||\"\").indexOf(\"a\")?\"a\":\"\"}},data:function(){return{popperClass:\"\",minDate:new Date,maxDate:new Date,value:[],oldValue:[new Date,new Date],defaultValue:null,format:\"HH:mm:ss\",visible:!1,selectionRange:[0,2],arrowControl:!1}},watch:{value:function(e){Array.isArray(e)?(this.minDate=new Date(e[0]),this.maxDate=new Date(e[1])):Array.isArray(this.defaultValue)?(this.minDate=new Date(this.defaultValue[0]),this.maxDate=new Date(this.defaultValue[1])):this.defaultValue?(this.minDate=new Date(this.defaultValue),this.maxDate=f(new Date(this.defaultValue),36e5)):(this.minDate=new Date,this.maxDate=f(new Date,36e5))},visible:function(e){var t=this;e&&(this.oldValue=this.value,this.$nextTick(function(){return t.$refs.minSpinner.emitSelectRange(\"hours\")}))}},methods:{handleClear:function(){this.$emit(\"pick\",null)},handleCancel:function(){this.$emit(\"pick\",this.oldValue)},handleMinChange:function(e){this.minDate=(0,s.clearMilliseconds)(e),this.handleChange()},handleMaxChange:function(e){this.maxDate=(0,s.clearMilliseconds)(e),this.handleChange()},handleChange:function(){this.isValidValue([this.minDate,this.maxDate])&&(this.$refs.minSpinner.selectableRange=[[d(this.minDate),this.maxDate]],this.$refs.maxSpinner.selectableRange=[[this.minDate,h(this.maxDate)]],this.$emit(\"pick\",[this.minDate,this.maxDate],!0))},setMinSelectionRange:function(e,t){this.$emit(\"select-range\",e,t,\"min\"),this.selectionRange=[e,t]},setMaxSelectionRange:function(e,t){this.$emit(\"select-range\",e,t,\"max\"),this.selectionRange=[e+this.offset,t+this.offset]},handleConfirm:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.$refs.minSpinner.selectableRange,i=this.$refs.maxSpinner.selectableRange;this.minDate=(0,s.limitTimeRange)(this.minDate,t,this.format),this.maxDate=(0,s.limitTimeRange)(this.maxDate,i,this.format),this.$emit(\"pick\",[this.minDate,this.maxDate],e)},adjustSpinners:function(){this.$refs.minSpinner.adjustSpinners(),this.$refs.maxSpinner.adjustSpinners()},changeSelectionRange:function(e){var t=this.showSeconds?[0,3,6,11,14,17]:[0,3,8,11],i=[\"hours\",\"minutes\"].concat(this.showSeconds?[\"seconds\"]:[]),n=t.indexOf(this.selectionRange[0]),s=(n+e+t.length)%t.length,r=t.length/2;s<r?this.$refs.minSpinner.emitSelectRange(i[s]):this.$refs.maxSpinner.emitSelectRange(i[s-r])},isValidValue:function(e){return Array.isArray(e)&&(0,s.timeWithinRange)(this.minDate,this.$refs.minSpinner.selectableRange)&&(0,s.timeWithinRange)(this.maxDate,this.$refs.maxSpinner.selectableRange)},handleKeydown:function(e){var t=e.keyCode,i={38:-1,40:1,37:-1,39:1};if(37===t||39===t){var n=i[t];return this.changeSelectionRange(n),void e.preventDefault()}if(38===t||40===t){var s=i[t];return this.spinner.scrollDown(s),void e.preventDefault()}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":function(t){e.$emit(\"dodestroy\")}}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-time-range-picker el-picker-panel el-popper\",class:e.popperClass},[i(\"div\",{staticClass:\"el-time-range-picker__content\"},[i(\"div\",{staticClass:\"el-time-range-picker__cell\"},[i(\"div\",{staticClass:\"el-time-range-picker__header\"},[e._v(e._s(e.t(\"el.datepicker.startTime\")))]),i(\"div\",{staticClass:\"el-time-range-picker__body el-time-panel__content\",class:{\"has-seconds\":e.showSeconds,\"is-arrow\":e.arrowControl}},[i(\"time-spinner\",{ref:\"minSpinner\",attrs:{\"show-seconds\":e.showSeconds,\"am-pm-mode\":e.amPmMode,\"arrow-control\":e.arrowControl,date:e.minDate},on:{change:e.handleMinChange,\"select-range\":e.setMinSelectionRange}})],1)]),i(\"div\",{staticClass:\"el-time-range-picker__cell\"},[i(\"div\",{staticClass:\"el-time-range-picker__header\"},[e._v(e._s(e.t(\"el.datepicker.endTime\")))]),i(\"div\",{staticClass:\"el-time-range-picker__body el-time-panel__content\",class:{\"has-seconds\":e.showSeconds,\"is-arrow\":e.arrowControl}},[i(\"time-spinner\",{ref:\"maxSpinner\",attrs:{\"show-seconds\":e.showSeconds,\"am-pm-mode\":e.amPmMode,\"arrow-control\":e.arrowControl,date:e.maxDate},on:{change:e.handleMaxChange,\"select-range\":e.setMaxSelectionRange}})],1)])]),i(\"div\",{staticClass:\"el-time-panel__footer\"},[i(\"button\",{staticClass:\"el-time-panel__btn cancel\",attrs:{type:\"button\"},on:{click:function(t){e.handleCancel()}}},[e._v(e._s(e.t(\"el.datepicker.cancel\")))]),i(\"button\",{staticClass:\"el-time-panel__btn confirm\",attrs:{type:\"button\",disabled:e.btnDisabled},on:{click:function(t){e.handleConfirm()}}},[e._v(e._s(e.t(\"el.datepicker.confirm\")))])])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(259),r=n(s),o=i(262),a=n(o);n(i(2)).default.directive(\"popover\",a.default),r.default.install=function(e){e.directive(\"popover\",a.default),e.component(r.default.name,r.default)},r.default.directive=a.default,t.default=r.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(260),s=i.n(n),r=i(261),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(11),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=i(5),o=i(4);t.default={name:\"ElPopover\",mixins:[s.default],props:{trigger:{type:String,default:\"click\",validator:function(e){return[\"click\",\"focus\",\"hover\",\"manual\"].indexOf(e)>-1}},openDelay:{type:Number,default:0},title:String,disabled:Boolean,content:String,reference:{},popperClass:String,width:{},visibleArrow:{default:!0},arrowOffset:{type:Number,default:0},transition:{type:String,default:\"fade-in-linear\"}},computed:{tooltipId:function(){return\"el-popover-\"+(0,o.generateId)()}},watch:{showPopper:function(e){this.disabled||(e?this.$emit(\"show\"):this.$emit(\"hide\"))}},mounted:function(){var e=this,t=this.referenceElm=this.reference||this.$refs.reference,i=this.popper||this.$refs.popper;!t&&this.$slots.reference&&this.$slots.reference[0]&&(t=this.referenceElm=this.$slots.reference[0].elm),t&&((0,r.addClass)(t,\"el-popover__reference\"),t.setAttribute(\"aria-describedby\",this.tooltipId),t.setAttribute(\"tabindex\",0),i.setAttribute(\"tabindex\",0),\"click\"!==this.trigger&&((0,r.on)(t,\"focusin\",function(){e.handleFocus();var i=t.__vue__;i&&\"function\"==typeof i.focus&&i.focus()}),(0,r.on)(i,\"focusin\",this.handleFocus),(0,r.on)(t,\"focusout\",this.handleBlur),(0,r.on)(i,\"focusout\",this.handleBlur)),(0,r.on)(t,\"keydown\",this.handleKeydown),(0,r.on)(t,\"click\",this.handleClick)),\"click\"===this.trigger?((0,r.on)(t,\"click\",this.doToggle),(0,r.on)(document,\"click\",this.handleDocumentClick)):\"hover\"===this.trigger?((0,r.on)(t,\"mouseenter\",this.handleMouseEnter),(0,r.on)(i,\"mouseenter\",this.handleMouseEnter),(0,r.on)(t,\"mouseleave\",this.handleMouseLeave),(0,r.on)(i,\"mouseleave\",this.handleMouseLeave)):\"focus\"===this.trigger&&(t.querySelector(\"input, textarea\")?((0,r.on)(t,\"focusin\",this.doShow),(0,r.on)(t,\"focusout\",this.doClose)):((0,r.on)(t,\"mousedown\",this.doShow),(0,r.on)(t,\"mouseup\",this.doClose)))},methods:{doToggle:function(){this.showPopper=!this.showPopper},doShow:function(){this.showPopper=!0},doClose:function(){this.showPopper=!1},handleFocus:function(){(0,r.addClass)(this.referenceElm,\"focusing\"),\"manual\"!==this.trigger&&(this.showPopper=!0)},handleClick:function(){(0,r.removeClass)(this.referenceElm,\"focusing\")},handleBlur:function(){(0,r.removeClass)(this.referenceElm,\"focusing\"),\"manual\"!==this.trigger&&(this.showPopper=!1)},handleMouseEnter:function(){var e=this;clearTimeout(this._timer),this.openDelay?this._timer=setTimeout(function(){e.showPopper=!0},this.openDelay):this.showPopper=!0},handleKeydown:function(e){27===e.keyCode&&\"manual\"!==this.trigger&&this.doClose()},handleMouseLeave:function(){var e=this;clearTimeout(this._timer),this._timer=setTimeout(function(){e.showPopper=!1},200)},handleDocumentClick:function(e){var t=this.reference||this.$refs.reference,i=this.popper||this.$refs.popper;!t&&this.$slots.reference&&this.$slots.reference[0]&&(t=this.referenceElm=this.$slots.reference[0].elm),this.$el&&t&&!this.$el.contains(e.target)&&!t.contains(e.target)&&i&&!i.contains(e.target)&&(this.showPopper=!1)},handleAfterEnter:function(){this.$emit(\"after-enter\")},handleAfterLeave:function(){this.$emit(\"after-leave\"),this.doDestroy()}},destroyed:function(){var e=this.reference;(0,r.off)(e,\"click\",this.doToggle),(0,r.off)(e,\"mouseup\",this.doClose),(0,r.off)(e,\"mousedown\",this.doShow),(0,r.off)(e,\"focusin\",this.doShow),(0,r.off)(e,\"focusout\",this.doClose),(0,r.off)(e,\"mousedown\",this.doShow),(0,r.off)(e,\"mouseup\",this.doClose),(0,r.off)(e,\"mouseleave\",this.handleMouseLeave),(0,r.off)(e,\"mouseenter\",this.handleMouseEnter),(0,r.off)(document,\"click\",this.handleDocumentClick)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"span\",[i(\"transition\",{attrs:{name:e.transition},on:{\"after-enter\":e.handleAfterEnter,\"after-leave\":e.handleAfterLeave}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.disabled&&e.showPopper,expression:\"!disabled && showPopper\"}],ref:\"popper\",staticClass:\"el-popover el-popper\",class:[e.popperClass,e.content&&\"el-popover--plain\"],style:{width:e.width+\"px\"},attrs:{role:\"tooltip\",id:e.tooltipId,\"aria-hidden\":e.disabled||!e.showPopper?\"true\":\"false\"}},[e.title?i(\"div\",{staticClass:\"el-popover__title\",domProps:{textContent:e._s(e.title)}}):e._e(),e._t(\"default\",[e._v(e._s(e.content))])],2)]),e._t(\"reference\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=function(e,t,i){var n=t.expression?t.value:t.arg,s=i.context.$refs[n];s&&(Array.isArray(s)?s[0].$refs.reference=e:s.$refs.reference=e)};t.default={bind:function(e,t,i){n(e,t,i)},inserted:function(e,t,i){n(e,t,i)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(264),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.MessageBox=void 0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=i(2),o=n(r),a=i(265),l=n(a),u=i(10),c=n(u),d=i(34),h={title:null,message:\"\",type:\"\",iconClass:\"\",showInput:!1,showClose:!0,modalFade:!0,lockScroll:!0,closeOnClickModal:!0,closeOnPressEscape:!0,closeOnHashChange:!0,inputValue:null,inputPlaceholder:\"\",inputType:\"text\",inputPattern:null,inputValidator:null,inputErrorMessage:\"\",showConfirmButton:!0,showCancelButton:!1,confirmButtonPosition:\"right\",confirmButtonHighlight:!1,cancelButtonHighlight:!1,confirmButtonText:\"\",cancelButtonText:\"\",confirmButtonClass:\"\",cancelButtonClass:\"\",customClass:\"\",beforeClose:null,dangerouslyUseHTMLString:!1,center:!1,roundButton:!1,distinguishCancelAndClose:!1},f=o.default.extend(l.default),p=void 0,m=void 0,v=[],g=function(e){if(p){var t=p.callback;\"function\"==typeof t&&(m.showInput?t(m.inputValue,e):t(e)),p.resolve&&(\"confirm\"===e?m.showInput?p.resolve({value:m.inputValue,action:e}):p.resolve(e):!p.reject||\"cancel\"!==e&&\"close\"!==e||p.reject(e))}},b=function(){m=new f({el:document.createElement(\"div\")}),m.callback=g},y=function e(){m||b(),m.action=\"\",m.visible&&!m.closeTimer||v.length>0&&function(){p=v.shift();var t=p.options;for(var i in t)t.hasOwnProperty(i)&&(m[i]=t[i]);void 0===t.callback&&(m.callback=g);var n=m.callback;m.callback=function(t,i){n(t,i),e()},(0,d.isVNode)(m.message)?(m.$slots.default=[m.message],m.message=null):delete m.$slots.default,[\"modal\",\"showClose\",\"closeOnClickModal\",\"closeOnPressEscape\",\"closeOnHashChange\"].forEach(function(e){void 0===m[e]&&(m[e]=!0)}),document.body.appendChild(m.$el),o.default.nextTick(function(){m.visible=!0})}()},_=function e(t,i){if(!o.default.prototype.$isServer){if(\"string\"==typeof t||(0,d.isVNode)(t)?(t={message:t},\"string\"==typeof arguments[1]&&(t.title=arguments[1])):t.callback&&!i&&(i=t.callback),\"undefined\"!=typeof Promise)return new Promise(function(n,s){v.push({options:(0,c.default)({},h,e.defaults,t),callback:i,resolve:n,reject:s}),y()});v.push({options:(0,c.default)({},h,e.defaults,t),callback:i}),y()}};_.setDefaults=function(e){_.defaults=e},_.alert=function(e,t,i){return\"object\"===(void 0===t?\"undefined\":s(t))?(i=t,t=\"\"):void 0===t&&(t=\"\"),_((0,c.default)({title:t,message:e,$type:\"alert\",closeOnPressEscape:!1,closeOnClickModal:!1},i))},_.confirm=function(e,t,i){return\"object\"===(void 0===t?\"undefined\":s(t))?(i=t,t=\"\"):void 0===t&&(t=\"\"),_((0,c.default)({title:t,message:e,$type:\"confirm\",showCancelButton:!0},i))},_.prompt=function(e,t,i){return\"object\"===(void 0===t?\"undefined\":s(t))?(i=t,t=\"\"):void 0===t&&(t=\"\"),_((0,c.default)({title:t,message:e,showCancelButton:!0,showInput:!0,$type:\"prompt\"},i))},_.close=function(){m.doClose(),m.visible=!1,v=[],p=null},t.default=_,t.MessageBox=_},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(266),s=i.n(n),r=i(268),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(14),r=n(s),o=i(6),a=n(o),l=i(8),u=n(l),c=i(19),d=n(c),h=i(5),f=i(17),p=i(267),m=n(p),v=void 0,g={success:\"success\",info:\"info\",warning:\"warning\",error:\"error\"};t.default={mixins:[r.default,a.default],props:{modal:{default:!0},lockScroll:{default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{default:!0},closeOnPressEscape:{default:!0},closeOnHashChange:{default:!0},center:{default:!1,type:Boolean},roundButton:{default:!1,type:Boolean}},components:{ElInput:u.default,ElButton:d.default},computed:{icon:function(){var e=this.type;return this.iconClass||(e&&g[e]?\"el-icon-\"+g[e]:\"\")},confirmButtonClasses:function(){return\"el-button--primary \"+this.confirmButtonClass},cancelButtonClasses:function(){return\"\"+this.cancelButtonClass}},methods:{getSafeClose:function(){var e=this,t=this.uid;return function(){e.$nextTick(function(){t===e.uid&&e.doClose()})}},doClose:function(){var e=this;this.visible&&(this.visible=!1,this._closing=!0,this.onClose&&this.onClose(),v.closeDialog(),this.lockScroll&&setTimeout(this.restoreBodyStyle,200),this.opened=!1,this.doAfterClose(),setTimeout(function(){e.action&&e.callback(e.action,e)}))},handleWrapperClick:function(){this.closeOnClickModal&&this.handleAction(this.distinguishCancelAndClose?\"close\":\"cancel\")},handleInputEnter:function(){if(\"textarea\"!==this.inputType)return this.handleAction(\"confirm\")},handleAction:function(e){(\"prompt\"!==this.$type||\"confirm\"!==e||this.validate())&&(this.action=e,\"function\"==typeof this.beforeClose?(this.close=this.getSafeClose(),this.beforeClose(e,this,this.close)):this.doClose())},validate:function(){if(\"prompt\"===this.$type){var e=this.inputPattern;if(e&&!e.test(this.inputValue||\"\"))return this.editorErrorMessage=this.inputErrorMessage||(0,f.t)(\"el.messagebox.error\"),(0,h.addClass)(this.getInputElement(),\"invalid\"),!1;var t=this.inputValidator;if(\"function\"==typeof t){var i=t(this.inputValue);if(!1===i)return this.editorErrorMessage=this.inputErrorMessage||(0,f.t)(\"el.messagebox.error\"),(0,h.addClass)(this.getInputElement(),\"invalid\"),!1;if(\"string\"==typeof i)return this.editorErrorMessage=i,(0,h.addClass)(this.getInputElement(),\"invalid\"),!1}}return this.editorErrorMessage=\"\",(0,h.removeClass)(this.getInputElement(),\"invalid\"),!0},getFirstFocus:function(){var e=this.$el.querySelector(\".el-message-box__btns .el-button\"),t=this.$el.querySelector(\".el-message-box__btns .el-message-box__title\");return e||t},getInputElement:function(){var e=this.$refs.input.$refs;return e.input||e.textarea}},watch:{inputValue:{immediate:!0,handler:function(e){var t=this;this.$nextTick(function(i){\"prompt\"===t.$type&&null!==e&&t.validate()})}},visible:function(e){var t=this;e&&(this.uid++,\"alert\"!==this.$type&&\"confirm\"!==this.$type||this.$nextTick(function(){t.$refs.confirm.$el.focus()}),this.focusAfterClosed=document.activeElement,v=new m.default(this.$el,this.focusAfterClosed,this.getFirstFocus())),\"prompt\"===this.$type&&(e?setTimeout(function(){t.$refs.input&&t.$refs.input.$el&&t.getInputElement().focus()},500):(this.editorErrorMessage=\"\",(0,h.removeClass)(this.getInputElement(),\"invalid\")))}},mounted:function(){var e=this;this.$nextTick(function(){e.closeOnHashChange&&window.addEventListener(\"hashchange\",e.close)})},beforeDestroy:function(){this.closeOnHashChange&&window.removeEventListener(\"hashchange\",this.close),setTimeout(function(){v.closeDialog()})},data:function(){return{uid:1,title:void 0,message:\"\",type:\"\",iconClass:\"\",customClass:\"\",showInput:!1,inputValue:null,inputPlaceholder:\"\",inputType:\"text\",inputPattern:null,inputValidator:null,inputErrorMessage:\"\",showConfirmButton:!0,showCancelButton:!1,action:\"\",confirmButtonText:\"\",cancelButtonText:\"\",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonClass:\"\",confirmButtonDisabled:!1,cancelButtonClass:\"\",editorErrorMessage:null,callback:null,dangerouslyUseHTMLString:!1,focusAfterClosed:null,isOnComposition:!1,distinguishCancelAndClose:!1}}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n,s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=i(46),o=function(e){return e&&e.__esModule?e:{default:e}}(r),a=a||{};a.Dialog=function(e,t,i){var r=this;if(this.dialogNode=e,null===this.dialogNode||\"dialog\"!==this.dialogNode.getAttribute(\"role\"))throw new Error(\"Dialog() requires a DOM element with ARIA role of dialog.\");\"string\"==typeof t?this.focusAfterClosed=document.getElementById(t):\"object\"===(void 0===t?\"undefined\":s(t))?this.focusAfterClosed=t:this.focusAfterClosed=null,\"string\"==typeof i?this.focusFirst=document.getElementById(i):\"object\"===(void 0===i?\"undefined\":s(i))?this.focusFirst=i:this.focusFirst=null,this.focusFirst?this.focusFirst.focus():o.default.focusFirstDescendant(this.dialogNode),this.lastFocus=document.activeElement,n=function(e){r.trapFocus(e)},this.addListeners()},a.Dialog.prototype.addListeners=function(){document.addEventListener(\"focus\",n,!0)},a.Dialog.prototype.removeListeners=function(){document.removeEventListener(\"focus\",n,!0)},a.Dialog.prototype.closeDialog=function(){var e=this;this.removeListeners(),this.focusAfterClosed&&setTimeout(function(){e.focusAfterClosed.focus()})},a.Dialog.prototype.trapFocus=function(e){o.default.IgnoreUtilFocusChanges||(this.dialogNode.contains(e.target)?this.lastFocus=e.target:(o.default.focusFirstDescendant(this.dialogNode),this.lastFocus===document.activeElement&&o.default.focusLastDescendant(this.dialogNode),this.lastFocus=document.activeElement))},t.default=a.Dialog},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"msgbox-fade\"}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-message-box__wrapper\",attrs:{tabindex:\"-1\",role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":e.title||\"dialog\"},on:{click:function(t){if(t.target!==t.currentTarget)return null;e.handleWrapperClick(t)}}},[i(\"div\",{staticClass:\"el-message-box\",class:[e.customClass,e.center&&\"el-message-box--center\"]},[null!==e.title?i(\"div\",{staticClass:\"el-message-box__header\"},[i(\"div\",{staticClass:\"el-message-box__title\"},[e.icon&&e.center?i(\"div\",{class:[\"el-message-box__status\",e.icon]}):e._e(),i(\"span\",[e._v(e._s(e.title))])]),e.showClose?i(\"button\",{staticClass:\"el-message-box__headerbtn\",attrs:{type:\"button\",\"aria-label\":\"Close\"},on:{click:function(t){e.handleAction(e.distinguishCancelAndClose?\"close\":\"cancel\")},keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleAction(e.distinguishCancelAndClose?\"close\":\"cancel\")}}},[i(\"i\",{staticClass:\"el-message-box__close el-icon-close\"})]):e._e()]):e._e(),i(\"div\",{staticClass:\"el-message-box__content\"},[e.icon&&!e.center&&\"\"!==e.message?i(\"div\",{class:[\"el-message-box__status\",e.icon]}):e._e(),\"\"!==e.message?i(\"div\",{staticClass:\"el-message-box__message\"},[e._t(\"default\",[e.dangerouslyUseHTMLString?i(\"p\",{domProps:{innerHTML:e._s(e.message)}}):i(\"p\",[e._v(e._s(e.message))])])],2):e._e(),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showInput,expression:\"showInput\"}],staticClass:\"el-message-box__input\"},[i(\"el-input\",{ref:\"input\",attrs:{type:e.inputType,placeholder:e.inputPlaceholder},nativeOn:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleInputEnter(t)}},model:{value:e.inputValue,callback:function(t){e.inputValue=t},expression:\"inputValue\"}}),i(\"div\",{staticClass:\"el-message-box__errormsg\",style:{visibility:e.editorErrorMessage?\"visible\":\"hidden\"}},[e._v(e._s(e.editorErrorMessage))])],1)]),i(\"div\",{staticClass:\"el-message-box__btns\"},[e.showCancelButton?i(\"el-button\",{class:[e.cancelButtonClasses],attrs:{loading:e.cancelButtonLoading,round:e.roundButton,size:\"small\"},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleAction(\"cancel\")}},nativeOn:{click:function(t){e.handleAction(\"cancel\")}}},[e._v(\"\\n          \"+e._s(e.cancelButtonText||e.t(\"el.messagebox.cancel\"))+\"\\n        \")]):e._e(),i(\"el-button\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showConfirmButton,expression:\"showConfirmButton\"}],ref:\"confirm\",class:[e.confirmButtonClasses],attrs:{loading:e.confirmButtonLoading,round:e.roundButton,size:\"small\"},on:{keydown:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleAction(\"confirm\")}},nativeOn:{click:function(t){e.handleAction(\"confirm\")}}},[e._v(\"\\n          \"+e._s(e.confirmButtonText||e.t(\"el.messagebox.confirm\"))+\"\\n        \")])],1)])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(270),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(271),s=i.n(n),r=i(272),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElBreadcrumb\",props:{separator:{type:String,default:\"/\"},separatorClass:{type:String,default:\"\"}},provide:function(){return{elBreadcrumb:this}},mounted:function(){var e=this.$el.querySelectorAll(\".el-breadcrumb__item\");e.length&&e[e.length-1].setAttribute(\"aria-current\",\"page\")}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-breadcrumb\",attrs:{\"aria-label\":\"Breadcrumb\",role:\"navigation\"}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(274),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(275),s=i.n(n),r=i(276),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElBreadcrumbItem\",props:{to:{},replace:Boolean},data:function(){return{separator:\"\",separatorClass:\"\"}},inject:[\"elBreadcrumb\"],mounted:function(){var e=this;this.separator=this.elBreadcrumb.separator,this.separatorClass=this.elBreadcrumb.separatorClass;var t=this.$refs.link;t.setAttribute(\"role\",\"link\"),t.addEventListener(\"click\",function(t){var i=e.to,n=e.$router;i&&n&&(e.replace?n.replace(i):n.push(i))})}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"span\",{staticClass:\"el-breadcrumb__item\"},[i(\"span\",{ref:\"link\",class:[\"el-breadcrumb__inner\",e.to?\"is-link\":\"\"],attrs:{role:\"link\"}},[e._t(\"default\")],2),e.separatorClass?i(\"i\",{staticClass:\"el-breadcrumb__separator\",class:e.separatorClass}):i(\"span\",{staticClass:\"el-breadcrumb__separator\",attrs:{role:\"presentation\"}},[e._v(e._s(e.separator))])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(278),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(279),s=i.n(n),r=i(280),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(10),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElForm\",componentName:\"ElForm\",provide:function(){return{elForm:this}},props:{model:Object,rules:Object,labelPosition:String,labelWidth:String,labelSuffix:{type:String,default:\"\"},inline:Boolean,inlineMessage:Boolean,statusIcon:Boolean,showMessage:{type:Boolean,default:!0},size:String,disabled:Boolean,validateOnRuleChange:{type:Boolean,default:!0},hideRequiredAsterisk:{type:Boolean,default:!1}},watch:{rules:function(){this.validateOnRuleChange&&this.validate(function(){})}},data:function(){return{fields:[]}},created:function(){var e=this;this.$on(\"el.form.addField\",function(t){t&&e.fields.push(t)}),this.$on(\"el.form.removeField\",function(t){t.prop&&e.fields.splice(e.fields.indexOf(t),1)})},methods:{resetFields:function(){if(!this.model)return void console.warn(\"[Element Warn][Form]model is required for resetFields to work.\");this.fields.forEach(function(e){e.resetField()})},clearValidate:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];(e.length?\"string\"==typeof e?this.fields.filter(function(t){return e===t.prop}):this.fields.filter(function(t){return e.indexOf(t.prop)>-1}):this.fields).forEach(function(e){e.clearValidate()})},validate:function(e){var t=this;if(!this.model)return void console.warn(\"[Element Warn][Form]model is required for validate to work!\");var i=void 0;\"function\"!=typeof e&&window.Promise&&(i=new window.Promise(function(t,i){e=function(e){e?t(e):i(e)}}));var n=!0,r=0;0===this.fields.length&&e&&e(!0);var o={};return this.fields.forEach(function(i){i.validate(\"\",function(i,a){i&&(n=!1),o=(0,s.default)({},o,a),\"function\"==typeof e&&++r===t.fields.length&&e(n,o)})}),i||void 0},validateField:function(e,t){e=[].concat(e);var i=this.fields.filter(function(t){return-1!==e.indexOf(t.prop)});if(!i.length)return void confirm.warn(\"[Element Warn]please pass correct props!\");i.forEach(function(e){e.validate(\"\",t)})}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"form\",{staticClass:\"el-form\",class:[e.labelPosition?\"el-form--label-\"+e.labelPosition:\"\",{\"el-form--inline\":e.inline}]},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(282),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(283),s=i.n(n),r=i(339),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(284),r=n(s),o=i(1),a=n(o),l=i(10),u=n(l),c=i(4);t.default={name:\"ElFormItem\",componentName:\"ElFormItem\",mixins:[a.default],provide:function(){return{elFormItem:this}},inject:[\"elForm\"],props:{label:String,labelWidth:String,prop:String,required:{type:Boolean,default:void 0},rules:[Object,Array],error:String,validateStatus:String,for:String,inlineMessage:{type:[String,Boolean],default:\"\"},showMessage:{type:Boolean,default:!0},size:String},watch:{error:{immediate:!0,handler:function(e){this.validateMessage=e,this.validateState=e?\"error\":\"\"}},validateStatus:function(e){this.validateState=e}},computed:{labelFor:function(){return this.for||this.prop},labelStyle:function(){var e={};if(\"top\"===this.form.labelPosition)return e;var t=this.labelWidth||this.form.labelWidth;return t&&(e.width=t),e},contentStyle:function(){var e={},t=this.label;if(\"top\"===this.form.labelPosition||this.form.inline)return e;if(!t&&!this.labelWidth&&this.isNested)return e;var i=this.labelWidth||this.form.labelWidth;return i&&(e.marginLeft=i),e},form:function(){for(var e=this.$parent,t=e.$options.componentName;\"ElForm\"!==t;)\"ElFormItem\"===t&&(this.isNested=!0),e=e.$parent,t=e.$options.componentName;return e},fieldValue:function(){var e=this.form.model;if(e&&this.prop){var t=this.prop;return-1!==t.indexOf(\":\")&&(t=t.replace(/:/,\".\")),(0,c.getPropByPath)(e,t,!0).v}},isRequired:function(){var e=this.getRules(),t=!1;return e&&e.length&&e.every(function(e){return!e.required||(t=!0,!1)}),t},_formSize:function(){return this.elForm.size},elFormItemSize:function(){return this.size||this._formSize},sizeClass:function(){return this.elFormItemSize||(this.$ELEMENT||{}).size}},data:function(){return{validateState:\"\",validateMessage:\"\",validateDisabled:!1,validator:{},isNested:!1}},methods:{validate:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c.noop;this.validateDisabled=!1;var n=this.getFilteredRule(e);if((!n||0===n.length)&&void 0===this.required)return i(),!0;this.validateState=\"validating\";var s={};n&&n.length>0&&n.forEach(function(e){delete e.trigger}),s[this.prop]=n;var o=new r.default(s),a={};a[this.prop]=this.fieldValue,o.validate(a,{firstFields:!0},function(e,n){t.validateState=e?\"error\":\"success\",t.validateMessage=e?e[0].message:\"\",i(t.validateMessage,n),t.elForm&&t.elForm.$emit(\"validate\",t.prop,!e,t.validateMessage||null)})},clearValidate:function(){this.validateState=\"\",this.validateMessage=\"\",this.validateDisabled=!1},resetField:function(){this.validateState=\"\",this.validateMessage=\"\";var e=this.form.model,t=this.fieldValue,i=this.prop;-1!==i.indexOf(\":\")&&(i=i.replace(/:/,\".\"));var n=(0,c.getPropByPath)(e,i,!0);this.validateDisabled=!0,Array.isArray(t)?n.o[n.k]=[].concat(this.initialValue):n.o[n.k]=this.initialValue,this.broadcast(\"ElTimeSelect\",\"fieldReset\",this.initialValue)},getRules:function(){var e=this.form.rules,t=this.rules,i=void 0!==this.required?{required:!!this.required}:[],n=(0,c.getPropByPath)(e,this.prop||\"\");return e=e?n.o[this.prop||\"\"]||n.v:[],[].concat(t||e||[]).concat(i)},getFilteredRule:function(e){return this.getRules().filter(function(t){return!t.trigger||\"\"===e||(Array.isArray(t.trigger)?t.trigger.indexOf(e)>-1:t.trigger===e)}).map(function(e){return(0,u.default)({},e)})},onFieldBlur:function(){this.validate(\"blur\")},onFieldChange:function(){if(this.validateDisabled)return void(this.validateDisabled=!1);this.validate(\"change\")}},mounted:function(){if(this.prop){this.dispatch(\"ElForm\",\"el.form.addField\",[this]);var e=this.fieldValue;Array.isArray(e)&&(e=[].concat(e)),Object.defineProperty(this,\"initialValue\",{value:e});(this.getRules().length||void 0!==this.required)&&(this.$on(\"el.form.blur\",this.onFieldBlur),this.$on(\"el.form.change\",this.onFieldChange))}},beforeDestroy:function(){this.dispatch(\"ElForm\",\"el.form.removeField\",[this])}}},function(e,t,i){\"use strict\";function n(e){this.rules=null,this._messages=c.a,this.define(e)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=i(77),r=i.n(s),o=i(41),a=i.n(o),l=i(3),u=i(318),c=i(338);n.prototype={messages:function(e){return e&&(this._messages=Object(l.c)(Object(c.b)(),e)),this._messages},define:function(e){if(!e)throw new Error(\"Cannot configure a schema with no rules\");if(\"object\"!==(void 0===e?\"undefined\":a()(e))||Array.isArray(e))throw new Error(\"Rules must be an object\");this.rules={};var t=void 0,i=void 0;for(t in e)e.hasOwnProperty(t)&&(i=e[t],this.rules[t]=Array.isArray(i)?i:[i])},validate:function(e){function t(e){var t=void 0,i=void 0,n=[],s={};for(t=0;t<e.length;t++)!function(e){Array.isArray(e)?n=n.concat.apply(n,e):n.push(e)}(e[t]);if(n.length)for(t=0;t<n.length;t++)i=n[t].field,s[i]=s[i]||[],s[i].push(n[t]);else n=null,s=null;h(n,s)}var i=this,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments[2],u=e,d=s,h=o;if(\"function\"==typeof d&&(h=d,d={}),!this.rules||0===Object.keys(this.rules).length)return void(h&&h());if(d.messages){var f=this.messages();f===c.a&&(f=Object(c.b)()),Object(l.c)(f,d.messages),d.messages=f}else d.messages=this.messages();var p=void 0,m=void 0,v={};(d.keys||Object.keys(this.rules)).forEach(function(t){p=i.rules[t],m=u[t],p.forEach(function(n){var s=n;\"function\"==typeof s.transform&&(u===e&&(u=r()({},u)),m=u[t]=s.transform(m)),s=\"function\"==typeof s?{validator:s}:r()({},s),s.validator=i.getValidationMethod(s),s.field=t,s.fullField=s.fullField||t,s.type=i.getType(s),s.validator&&(v[t]=v[t]||[],v[t].push({rule:s,value:m,source:u,field:t}))})});var g={};Object(l.a)(v,d,function(e,t){function i(e,t){return r()({},t,{fullField:o.fullField+\".\"+e})}function s(){var s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],a=s;if(Array.isArray(a)||(a=[a]),a.length&&Object(l.f)(\"async-validator:\",a),a.length&&o.message&&(a=[].concat(o.message)),a=a.map(Object(l.b)(o)),d.first&&a.length)return g[o.field]=1,t(a);if(u){if(o.required&&!e.value)return a=o.message?[].concat(o.message).map(Object(l.b)(o)):d.error?[d.error(o,Object(l.d)(d.messages.required,o.field))]:[],t(a);var c={};if(o.defaultField)for(var h in e.value)e.value.hasOwnProperty(h)&&(c[h]=o.defaultField);c=r()({},c,e.rule.fields);for(var f in c)if(c.hasOwnProperty(f)){var p=Array.isArray(c[f])?c[f]:[c[f]];c[f]=p.map(i.bind(null,f))}var m=new n(c);m.messages(d.messages),e.rule.options&&(e.rule.options.messages=d.messages,e.rule.options.error=d.error),m.validate(e.value,e.rule.options||d,function(e){t(e&&e.length?a.concat(e):e)})}else t(a)}var o=e.rule,u=!(\"object\"!==o.type&&\"array\"!==o.type||\"object\"!==a()(o.fields)&&\"object\"!==a()(o.defaultField));u=u&&(o.required||!o.required&&e.value),o.field=e.field;var c=o.validator(o,e.value,s,e.source,d);c&&c.then&&c.then(function(){return s()},function(e){return s(e)})},function(e){t(e)})},getType:function(e){if(void 0===e.type&&e.pattern instanceof RegExp&&(e.type=\"pattern\"),\"function\"!=typeof e.validator&&e.type&&!u.a.hasOwnProperty(e.type))throw new Error(Object(l.d)(\"Unknown rule type %s\",e.type));return e.type||\"string\"},getValidationMethod:function(e){if(\"function\"==typeof e.validator)return e.validator;var t=Object.keys(e),i=t.indexOf(\"message\");return-1!==i&&t.splice(i,1),1===t.length&&\"required\"===t[0]?u.a.required:u.a[this.getType(e)]||!1}},n.register=function(e,t){if(\"function\"!=typeof t)throw new Error(\"Cannot register a validator by type, validator is not a function\");u.a[e]=t},n.messages=c.a,t.default=n},function(e,t,i){e.exports={default:i(286),__esModule:!0}},function(e,t,i){i(287),e.exports=i(35).Object.assign},function(e,t,i){var n=i(51);n(n.S+n.F,\"Object\",{assign:i(290)})},function(e,t,i){var n=i(289);e.exports=function(e,t,i){if(n(e),void 0===t)return e;switch(i){case 1:return function(i){return e.call(t,i)};case 2:return function(i,n){return e.call(t,i,n)};case 3:return function(i,n,s){return e.call(t,i,n,s)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function!\");return e}},function(e,t,i){\"use strict\";var n=i(29),s=i(58),r=i(40),o=i(83),a=i(81),l=Object.assign;e.exports=!l||i(28)(function(){var e={},t={},i=Symbol(),n=\"abcdefghijklmnopqrst\";return e[i]=7,n.split(\"\").forEach(function(e){t[e]=e}),7!=l({},e)[i]||Object.keys(l({},t)).join(\"\")!=n})?function(e,t){for(var i=o(e),l=arguments.length,u=1,c=s.f,d=r.f;l>u;)for(var h,f=a(arguments[u++]),p=c?n(f).concat(c(f)):n(f),m=p.length,v=0;m>v;)d.call(f,h=p[v++])&&(i[h]=f[h]);return i}:l},function(e,t,i){var n=i(21),s=i(292),r=i(293);e.exports=function(e){return function(t,i,o){var a,l=n(t),u=s(l.length),c=r(o,u);if(e&&i!=i){for(;u>c;)if((a=l[c++])!=a)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===i)return e||c||0;return!e&&-1}}},function(e,t,i){var n=i(54),s=Math.min;e.exports=function(e){return e>0?s(n(e),9007199254740991):0}},function(e,t,i){var n=i(54),s=Math.max,r=Math.min;e.exports=function(e,t){return e=n(e),e<0?s(e+t,0):r(e,t)}},function(e,t,i){e.exports={default:i(295),__esModule:!0}},function(e,t,i){i(296),i(302),e.exports=i(62).f(\"iterator\")},function(e,t,i){\"use strict\";var n=i(297)(!0);i(84)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,i=this._i;return i>=t.length?{value:void 0,done:!0}:(e=n(t,i),this._i+=e.length,{value:e,done:!1})})},function(e,t,i){var n=i(54),s=i(53);e.exports=function(e){return function(t,i){var r,o,a=String(s(t)),l=n(i),u=a.length;return l<0||l>=u?e?\"\":void 0:(r=a.charCodeAt(l),r<55296||r>56319||l+1===u||(o=a.charCodeAt(l+1))<56320||o>57343?e?a.charAt(l):r:e?a.slice(l,l+2):o-56320+(r-55296<<10)+65536)}}},function(e,t,i){\"use strict\";var n=i(86),s=i(38),r=i(61),o={};i(22)(o,i(25)(\"iterator\"),function(){return this}),e.exports=function(e,t,i){e.prototype=n(o,{next:s(1,i)}),r(e,t+\" Iterator\")}},function(e,t,i){var n=i(23),s=i(36),r=i(29);e.exports=i(24)?Object.defineProperties:function(e,t){s(e);for(var i,o=r(t),a=o.length,l=0;a>l;)n.f(e,i=o[l++],t[i]);return e}},function(e,t,i){e.exports=i(16).document&&document.documentElement},function(e,t,i){var n=i(20),s=i(83),r=i(55)(\"IE_PROTO\"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=s(e),n(e,r)?e[r]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},function(e,t,i){i(303);for(var n=i(16),s=i(22),r=i(60),o=i(25)(\"toStringTag\"),a=[\"NodeList\",\"DOMTokenList\",\"MediaList\",\"StyleSheetList\",\"CSSRuleList\"],l=0;l<5;l++){var u=a[l],c=n[u],d=c&&c.prototype;d&&!d[o]&&s(d,o,u),r[u]=r.Array}},function(e,t,i){\"use strict\";var n=i(304),s=i(305),r=i(60),o=i(21);e.exports=i(84)(Array,\"Array\",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,i=this._i++;return!e||i>=e.length?(this._t=void 0,s(1)):\"keys\"==t?s(0,i):\"values\"==t?s(0,e[i]):s(0,[i,e[i]])},\"values\"),r.Arguments=r.Array,n(\"keys\"),n(\"values\"),n(\"entries\")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,i){e.exports={default:i(307),__esModule:!0}},function(e,t,i){i(308),i(315),i(316),i(317),e.exports=i(35).Symbol},function(e,t,i){\"use strict\";var n=i(16),s=i(20),r=i(24),o=i(51),a=i(85),l=i(309).KEY,u=i(28),c=i(56),d=i(61),h=i(39),f=i(25),p=i(62),m=i(63),v=i(310),g=i(311),b=i(312),y=i(36),_=i(21),C=i(52),x=i(38),w=i(86),k=i(313),S=i(314),M=i(23),$=i(29),E=S.f,D=M.f,T=k.f,O=n.Symbol,P=n.JSON,N=P&&P.stringify,F=f(\"_hidden\"),I=f(\"toPrimitive\"),A={}.propertyIsEnumerable,V=c(\"symbol-registry\"),L=c(\"symbols\"),B=c(\"op-symbols\"),R=Object.prototype,z=\"function\"==typeof O,j=n.QObject,H=!j||!j.prototype||!j.prototype.findChild,W=r&&u(function(){return 7!=w(D({},\"a\",{get:function(){return D(this,\"a\",{value:7}).a}})).a})?function(e,t,i){var n=E(R,t);n&&delete R[t],D(e,t,i),n&&e!==R&&D(R,t,n)}:D,q=function(e){var t=L[e]=w(O.prototype);return t._k=e,t},K=z&&\"symbol\"==typeof O.iterator?function(e){return\"symbol\"==typeof e}:function(e){return e instanceof O},Y=function(e,t,i){return e===R&&Y(B,t,i),y(e),t=C(t,!0),y(i),s(L,t)?(i.enumerable?(s(e,F)&&e[F][t]&&(e[F][t]=!1),i=w(i,{enumerable:x(0,!1)})):(s(e,F)||D(e,F,x(1,{})),e[F][t]=!0),W(e,t,i)):D(e,t,i)},G=function(e,t){y(e);for(var i,n=g(t=_(t)),s=0,r=n.length;r>s;)Y(e,i=n[s++],t[i]);return e},U=function(e,t){return void 0===t?w(e):G(w(e),t)},X=function(e){var t=A.call(this,e=C(e,!0));return!(this===R&&s(L,e)&&!s(B,e))&&(!(t||!s(this,e)||!s(L,e)||s(this,F)&&this[F][e])||t)},J=function(e,t){if(e=_(e),t=C(t,!0),e!==R||!s(L,t)||s(B,t)){var i=E(e,t);return!i||!s(L,t)||s(e,F)&&e[F][t]||(i.enumerable=!0),i}},Z=function(e){for(var t,i=T(_(e)),n=[],r=0;i.length>r;)s(L,t=i[r++])||t==F||t==l||n.push(t);return n},Q=function(e){for(var t,i=e===R,n=T(i?B:_(e)),r=[],o=0;n.length>o;)!s(L,t=n[o++])||i&&!s(R,t)||r.push(L[t]);return r};z||(O=function(){if(this instanceof O)throw TypeError(\"Symbol is not a constructor!\");var e=h(arguments.length>0?arguments[0]:void 0),t=function(i){this===R&&t.call(B,i),s(this,F)&&s(this[F],e)&&(this[F][e]=!1),W(this,e,x(1,i))};return r&&H&&W(R,e,{configurable:!0,set:t}),q(e)},a(O.prototype,\"toString\",function(){return this._k}),S.f=J,M.f=Y,i(87).f=k.f=Z,i(40).f=X,i(58).f=Q,r&&!i(59)&&a(R,\"propertyIsEnumerable\",X,!0),p.f=function(e){return q(f(e))}),o(o.G+o.W+o.F*!z,{Symbol:O});for(var ee=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),te=0;ee.length>te;)f(ee[te++]);for(var ee=$(f.store),te=0;ee.length>te;)m(ee[te++]);o(o.S+o.F*!z,\"Symbol\",{for:function(e){return s(V,e+=\"\")?V[e]:V[e]=O(e)},keyFor:function(e){if(K(e))return v(V,e);throw TypeError(e+\" is not a symbol!\")},useSetter:function(){H=!0},useSimple:function(){H=!1}}),o(o.S+o.F*!z,\"Object\",{create:U,defineProperty:Y,defineProperties:G,getOwnPropertyDescriptor:J,getOwnPropertyNames:Z,getOwnPropertySymbols:Q}),P&&o(o.S+o.F*(!z||u(function(){var e=O();return\"[null]\"!=N([e])||\"{}\"!=N({a:e})||\"{}\"!=N(Object(e))})),\"JSON\",{stringify:function(e){if(void 0!==e&&!K(e)){for(var t,i,n=[e],s=1;arguments.length>s;)n.push(arguments[s++]);return t=n[1],\"function\"==typeof t&&(i=t),!i&&b(t)||(t=function(e,t){if(i&&(t=i.call(this,e,t)),!K(t))return t}),n[1]=t,N.apply(P,n)}}}),O.prototype[I]||i(22)(O.prototype,I,O.prototype.valueOf),d(O,\"Symbol\"),d(Math,\"Math\",!0),d(n.JSON,\"JSON\",!0)},function(e,t,i){var n=i(39)(\"meta\"),s=i(37),r=i(20),o=i(23).f,a=0,l=Object.isExtensible||function(){return!0},u=!i(28)(function(){return l(Object.preventExtensions({}))}),c=function(e){o(e,n,{value:{i:\"O\"+ ++a,w:{}}})},d=function(e,t){if(!s(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!r(e,n)){if(!l(e))return\"F\";if(!t)return\"E\";c(e)}return e[n].i},h=function(e,t){if(!r(e,n)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[n].w},f=function(e){return u&&p.NEED&&l(e)&&!r(e,n)&&c(e),e},p=e.exports={KEY:n,NEED:!1,fastKey:d,getWeak:h,onFreeze:f}},function(e,t,i){var n=i(29),s=i(21);e.exports=function(e,t){for(var i,r=s(e),o=n(r),a=o.length,l=0;a>l;)if(r[i=o[l++]]===t)return i}},function(e,t,i){var n=i(29),s=i(58),r=i(40);e.exports=function(e){var t=n(e),i=s.f;if(i)for(var o,a=i(e),l=r.f,u=0;a.length>u;)l.call(e,o=a[u++])&&t.push(o);return t}},function(e,t,i){var n=i(82);e.exports=Array.isArray||function(e){return\"Array\"==n(e)}},function(e,t,i){var n=i(21),s=i(87).f,r={}.toString,o=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(e){try{return s(e)}catch(e){return o.slice()}};e.exports.f=function(e){return o&&\"[object Window]\"==r.call(e)?a(e):s(n(e))}},function(e,t,i){var n=i(40),s=i(38),r=i(21),o=i(52),a=i(20),l=i(78),u=Object.getOwnPropertyDescriptor;t.f=i(24)?u:function(e,t){if(e=r(e),t=o(t,!0),l)try{return u(e,t)}catch(e){}if(a(e,t))return s(!n.f.call(e,t),e[t])}},function(e,t){},function(e,t,i){i(63)(\"asyncIterator\")},function(e,t,i){i(63)(\"observable\")},function(e,t,i){\"use strict\";var n=i(319),s=i(325),r=i(326),o=i(327),a=i(328),l=i(329),u=i(330),c=i(331),d=i(332),h=i(333),f=i(334),p=i(335),m=i(336),v=i(337);t.a={string:n.a,method:s.a,number:r.a,boolean:o.a,regexp:a.a,integer:l.a,float:u.a,array:c.a,object:d.a,enum:h.a,pattern:f.a,date:p.a,url:v.a,hex:v.a,email:v.a,required:m.a}},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t,\"string\")&&!e.required)return i();s.a.required(e,t,n,a,o,\"string\"),Object(r.e)(t,\"string\")||(s.a.type(e,t,n,a,o),s.a.range(e,t,n,a,o),s.a.pattern(e,t,n,a,o),!0===e.whitespace&&s.a.whitespace(e,t,n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,r){(/^\\s+$/.test(t)||\"\"===t)&&n.push(s.d(r.messages.whitespace,e.fullField))}var s=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,s){if(e.required&&void 0===t)return void Object(a.a)(e,t,i,n,s);var l=[\"integer\",\"float\",\"array\",\"regexp\",\"object\",\"method\",\"email\",\"number\",\"date\",\"url\",\"hex\"],c=e.type;l.indexOf(c)>-1?u[c](t)||n.push(o.d(s.messages.types[c],e.fullField,e.type)):c&&(void 0===t?\"undefined\":r()(t))!==e.type&&n.push(o.d(s.messages.types[c],e.fullField,e.type))}var s=i(41),r=i.n(s),o=i(3),a=i(88),l={email:/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,url:new RegExp(\"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$\",\"i\"),hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},u={integer:function(e){return u.number(e)&&parseInt(e,10)===e},float:function(e){return u.number(e)&&!u.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(e){return!1}},date:function(e){return\"function\"==typeof e.getTime&&\"function\"==typeof e.getMonth&&\"function\"==typeof e.getYear},number:function(e){return!isNaN(e)&&\"number\"==typeof e},object:function(e){return\"object\"===(void 0===e?\"undefined\":r()(e))&&!u.array(e)},method:function(e){return\"function\"==typeof e},email:function(e){return\"string\"==typeof e&&!!e.match(l.email)&&e.length<255},url:function(e){return\"string\"==typeof e&&!!e.match(l.url)},hex:function(e){return\"string\"==typeof e&&!!e.match(l.hex)}};t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,r){var o=\"number\"==typeof e.len,a=\"number\"==typeof e.min,l=\"number\"==typeof e.max,u=t,c=null,d=\"number\"==typeof t,h=\"string\"==typeof t,f=Array.isArray(t);if(d?c=\"number\":h?c=\"string\":f&&(c=\"array\"),!c)return!1;(h||f)&&(u=t.length),o?u!==e.len&&n.push(s.d(r.messages[c].len,e.fullField,e.len)):a&&!l&&u<e.min?n.push(s.d(r.messages[c].min,e.fullField,e.min)):l&&!a&&u>e.max?n.push(s.d(r.messages[c].max,e.fullField,e.max)):a&&l&&(u<e.min||u>e.max)&&n.push(s.d(r.messages[c].range,e.fullField,e.min,e.max))}var s=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){e[r]=Array.isArray(e[r])?e[r]:[],-1===e[r].indexOf(t)&&n.push(s.d(o.messages[r],e.fullField,e[r].join(\", \")))}var s=i(3),r=\"enum\";t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,r){if(e.pattern)if(e.pattern instanceof RegExp)e.pattern.test(t)||n.push(s.d(r.messages.pattern.mismatch,e.fullField,t,e.pattern));else if(\"string\"==typeof e.pattern){var o=new RegExp(e.pattern);o.test(t)||n.push(s.d(r.messages.pattern.mismatch,e.fullField,t,e.pattern))}}var s=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),void 0!==t&&s.a.type(e,t,n,a,o)}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),void 0!==t&&(s.a.type(e,t,n,a,o),s.a.range(e,t,n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(s.e)(t)&&!e.required)return i();r.a.required(e,t,n,a,o),void 0!==t&&r.a.type(e,t,n,a,o)}i(a)}var s=i(3),r=i(7);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),Object(r.e)(t)||s.a.type(e,t,n,a,o)}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),void 0!==t&&(s.a.type(e,t,n,a,o),s.a.range(e,t,n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),void 0!==t&&(s.a.type(e,t,n,a,o),s.a.range(e,t,n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t,\"array\")&&!e.required)return i();s.a.required(e,t,n,a,o,\"array\"),Object(r.e)(t,\"array\")||(s.a.type(e,t,n,a,o),s.a.range(e,t,n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),void 0!==t&&s.a.type(e,t,n,a,o)}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,a){var l=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,l,a),t&&s.a[o](e,t,n,l,a)}i(l)}var s=i(7),r=i(3),o=\"enum\";t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t,\"string\")&&!e.required)return i();s.a.required(e,t,n,a,o),Object(r.e)(t,\"string\")||s.a.pattern(e,t,n,a,o)}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t)&&!e.required)return i();s.a.required(e,t,n,a,o),Object(r.e)(t)||(s.a.type(e,t,n,a,o),t&&s.a.range(e,t.getTime(),n,a,o))}i(a)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,s){var a=[],l=Array.isArray(t)?\"array\":void 0===t?\"undefined\":r()(t);o.a.required(e,t,n,a,s,l),i(a)}var s=i(41),r=i.n(s),o=i(7);t.a=n},function(e,t,i){\"use strict\";function n(e,t,i,n,o){var a=e.type,l=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(Object(r.e)(t,a)&&!e.required)return i();s.a.required(e,t,n,l,o,a),Object(r.e)(t,a)||s.a.type(e,t,n,l,o)}i(l)}var s=i(7),r=i(3);t.a=n},function(e,t,i){\"use strict\";function n(){return{default:\"Validation error on field %s\",required:\"%s is required\",enum:\"%s must be one of %s\",whitespace:\"%s cannot be empty\",date:{format:\"%s date %s is invalid for format %s\",parse:\"%s date could not be parsed, %s is invalid \",invalid:\"%s date %s is invalid\"},types:{string:\"%s is not a %s\",method:\"%s is not a %s (function)\",array:\"%s is not an %s\",object:\"%s is not an %s\",number:\"%s is not a %s\",date:\"%s is not a %s\",boolean:\"%s is not a %s\",integer:\"%s is not an %s\",float:\"%s is not a %s\",regexp:\"%s is not a valid %s\",email:\"%s is not a valid %s\",url:\"%s is not a valid %s\",hex:\"%s is not a valid %s\"},string:{len:\"%s must be exactly %s characters\",min:\"%s must be at least %s characters\",max:\"%s cannot be longer than %s characters\",range:\"%s must be between %s and %s characters\"},number:{len:\"%s must equal %s\",min:\"%s cannot be less than %s\",max:\"%s cannot be greater than %s\",range:\"%s must be between %s and %s\"},array:{len:\"%s must be exactly %s in length\",min:\"%s cannot be less than %s in length\",max:\"%s cannot be greater than %s in length\",range:\"%s must be between %s and %s in length\"},pattern:{mismatch:\"%s value %s does not match pattern %s\"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}t.b=n,i.d(t,\"a\",function(){return s});var s=n()},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-form-item\",class:[{\"el-form-item--feedback\":e.elForm&&e.elForm.statusIcon,\"is-error\":\"error\"===e.validateState,\"is-validating\":\"validating\"===e.validateState,\"is-success\":\"success\"===e.validateState,\"is-required\":e.isRequired||e.required,\"is-no-asterisk\":e.elForm&&e.elForm.hideRequiredAsterisk},e.sizeClass?\"el-form-item--\"+e.sizeClass:\"\"]},[e.label||e.$slots.label?i(\"label\",{staticClass:\"el-form-item__label\",style:e.labelStyle,attrs:{for:e.labelFor}},[e._t(\"label\",[e._v(e._s(e.label+e.form.labelSuffix))])],2):e._e(),i(\"div\",{staticClass:\"el-form-item__content\",style:e.contentStyle},[e._t(\"default\"),i(\"transition\",{attrs:{name:\"el-zoom-in-top\"}},[\"error\"===e.validateState&&e.showMessage&&e.form.showMessage?e._t(\"error\",[i(\"div\",{staticClass:\"el-form-item__error\",class:{\"el-form-item__error--inline\":\"boolean\"==typeof e.inlineMessage?e.inlineMessage:e.elForm&&e.elForm.inlineMessage||!1}},[e._v(\"\\n          \"+e._s(e.validateMessage)+\"\\n        \")])],{error:e.validateMessage}):e._e()],2)],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(341),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(342),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(343),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElTabs\",components:{TabNav:s.default},props:{type:String,activeName:String,closable:Boolean,addable:Boolean,value:{},editable:Boolean,tabPosition:{type:String,default:\"top\"},beforeLeave:Function,stretch:Boolean},provide:function(){return{rootTabs:this}},data:function(){return{currentName:this.value||this.activeName,panes:[]}},watch:{activeName:function(e){this.setCurrentName(e)},value:function(e){this.setCurrentName(e)},currentName:function(e){var t=this;this.$refs.nav&&this.$nextTick(function(){t.$refs.nav.$nextTick(function(e){t.$refs.nav.scrollToActiveTab()})})}},methods:{calcPaneInstances:function(){var e=this;if(this.$slots.default){var t=this.$slots.default.filter(function(e){return e.tag&&e.componentOptions&&\"ElTabPane\"===e.componentOptions.Ctor.options.name}),i=t.map(function(e){return e.componentInstance});i.length===this.panes.length&&i.every(function(t,i){return t===e.panes[i]})||(this.panes=i)}else 0!==this.panes.length&&(this.panes=[])},handleTabClick:function(e,t,i){e.disabled||(this.setCurrentName(t),this.$emit(\"tab-click\",e,i))},handleTabRemove:function(e,t){e.disabled||(t.stopPropagation(),this.$emit(\"edit\",e.name,\"remove\"),this.$emit(\"tab-remove\",e.name))},handleTabAdd:function(){this.$emit(\"edit\",null,\"add\"),this.$emit(\"tab-add\")},setCurrentName:function(e){var t=this,i=function(){t.currentName=e,t.$emit(\"input\",e)};if(this.currentName!==e&&this.beforeLeave){var n=this.beforeLeave(e,this.currentName);n&&n.then?n.then(function(){i(),t.$refs.nav&&t.$refs.nav.removeFocus()}):!1!==n&&i()}else i()}},render:function(e){var t,i=this.type,n=this.handleTabClick,s=this.handleTabRemove,r=this.handleTabAdd,o=this.currentName,a=this.panes,l=this.editable,u=this.addable,c=this.tabPosition,d=this.stretch,h=l||u?e(\"span\",{class:\"el-tabs__new-tab\",on:{click:r,keydown:function(e){13===e.keyCode&&r()}},attrs:{tabindex:\"0\"}},[e(\"i\",{class:\"el-icon-plus\"},[])]):null,f={props:{currentName:o,onTabClick:n,onTabRemove:s,editable:l,type:i,panes:a,stretch:d},ref:\"nav\"},p=e(\"div\",{class:[\"el-tabs__header\",\"is-\"+c]},[h,e(\"tab-nav\",f,[])]),m=e(\"div\",{class:\"el-tabs__content\"},[this.$slots.default]);return e(\"div\",{class:(t={\"el-tabs\":!0,\"el-tabs--card\":\"card\"===i},t[\"el-tabs--\"+c]=!0,t[\"el-tabs--border-card\"]=\"border-card\"===i,t)},[\"bottom\"!==c?[p,m]:[m,p]])},created:function(){this.currentName||this.setCurrentName(\"0\")},mounted:function(){this.calcPaneInstances()},updated:function(){this.calcPaneInstances()}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(344),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(){}t.__esModule=!0;var s=i(345),r=function(e){return e&&e.__esModule?e:{default:e}}(s),o=i(27),a=function(e){return e.toLowerCase().replace(/( |^)[a-z]/g,function(e){return e.toUpperCase()})};t.default={name:\"TabNav\",components:{TabBar:r.default},inject:[\"rootTabs\"],props:{panes:Array,currentName:String,editable:Boolean,onTabClick:{type:Function,default:n},onTabRemove:{type:Function,default:n},type:String,stretch:Boolean},data:function(){return{scrollable:!1,navOffset:0,isFocus:!1,focusable:!0}},computed:{navStyle:function(){return{transform:\"translate\"+(-1!==[\"top\",\"bottom\"].indexOf(this.rootTabs.tabPosition)?\"X\":\"Y\")+\"(-\"+this.navOffset+\"px)\"}},sizeName:function(){return-1!==[\"top\",\"bottom\"].indexOf(this.rootTabs.tabPosition)?\"width\":\"height\"}},methods:{scrollPrev:function(){var e=this.$refs.navScroll[\"offset\"+a(this.sizeName)],t=this.navOffset;if(t){var i=t>e?t-e:0;this.navOffset=i}},scrollNext:function(){var e=this.$refs.nav[\"offset\"+a(this.sizeName)],t=this.$refs.navScroll[\"offset\"+a(this.sizeName)],i=this.navOffset;if(!(e-i<=t)){var n=e-i>2*t?i+t:e-t;this.navOffset=n}},scrollToActiveTab:function(){if(this.scrollable){var e=this.$refs.nav,t=this.$el.querySelector(\".is-active\");if(t){var i=this.$refs.navScroll,n=t.getBoundingClientRect(),s=i.getBoundingClientRect(),r=e.offsetWidth-s.width,o=this.navOffset,a=o;n.left<s.left&&(a=o-(s.left-n.left)),n.right>s.right&&(a=o+n.right-s.right),a=Math.max(a,0),this.navOffset=Math.min(a,r)}}},update:function(){if(this.$refs.nav){var e=this.sizeName,t=this.$refs.nav[\"offset\"+a(e)],i=this.$refs.navScroll[\"offset\"+a(e)],n=this.navOffset;if(i<t){var s=this.navOffset;this.scrollable=this.scrollable||{},this.scrollable.prev=s,this.scrollable.next=s+i<t,t-s<i&&(this.navOffset=t-i)}else this.scrollable=!1,n>0&&(this.navOffset=0)}},changeTab:function(e){var t=e.keyCode,i=void 0,n=void 0,s=void 0;-1!==[37,38,39,40].indexOf(t)&&(s=e.currentTarget.querySelectorAll(\"[role=tab]\"),n=Array.prototype.indexOf.call(s,e.target),i=37===t||38===t?0===n?s.length-1:n-1:n<s.length-1?n+1:0,s[i].focus(),s[i].click(),this.setFocus())},setFocus:function(){this.focusable&&(this.isFocus=!0)},removeFocus:function(){this.isFocus=!1},visibilityChangeHandler:function(){var e=this,t=document.visibilityState;\"hidden\"===t?this.focusable=!1:\"visible\"===t&&setTimeout(function(){e.focusable=!0},50)},windowBlurHandler:function(){this.focusable=!1},windowFocusHandler:function(){var e=this;setTimeout(function(){e.focusable=!0},50)}},updated:function(){this.update()},render:function(e){var t=this,i=this.type,n=this.panes,s=this.editable,r=this.stretch,o=this.onTabClick,a=this.onTabRemove,l=this.navStyle,u=this.scrollable,c=this.scrollNext,d=this.scrollPrev,h=this.changeTab,f=this.setFocus,p=this.removeFocus,m=u?[e(\"span\",{class:[\"el-tabs__nav-prev\",u.prev?\"\":\"is-disabled\"],on:{click:d}},[e(\"i\",{class:\"el-icon-arrow-left\"},[])]),e(\"span\",{class:[\"el-tabs__nav-next\",u.next?\"\":\"is-disabled\"],on:{click:c}},[e(\"i\",{class:\"el-icon-arrow-right\"},[])])]:null,v=this._l(n,function(i,n){var r,l=i.name||i.index||n,u=i.isClosable||s;i.index=\"\"+n;var c=u?e(\"span\",{class:\"el-icon-close\",on:{click:function(e){a(i,e)}}},[]):null,d=i.$slots.label||i.label,h=i.active?0:-1;return e(\"div\",{class:(r={\"el-tabs__item\":!0},r[\"is-\"+t.rootTabs.tabPosition]=!0,r[\"is-active\"]=i.active,r[\"is-disabled\"]=i.disabled,r[\"is-closable\"]=u,r[\"is-focus\"]=t.isFocus,r),attrs:{id:\"tab-\"+l,\"aria-controls\":\"pane-\"+l,role:\"tab\",\"aria-selected\":i.active,tabindex:h},key:\"tab-\"+l,ref:\"tabs\",refInFor:!0,on:{focus:function(){f()},blur:function(){p()},click:function(e){p(),o(i,l,e)},keydown:function(e){!u||46!==e.keyCode&&8!==e.keyCode||a(i,e)}}},[d,c])});return e(\"div\",{class:[\"el-tabs__nav-wrap\",u?\"is-scrollable\":\"\",\"is-\"+this.rootTabs.tabPosition]},[m,e(\"div\",{class:[\"el-tabs__nav-scroll\"],ref:\"navScroll\"},[e(\"div\",{class:[\"el-tabs__nav\",\"is-\"+this.rootTabs.tabPosition,r&&-1!==[\"top\",\"bottom\"].indexOf(this.rootTabs.tabPosition)?\"is-stretch\":\"\"],ref:\"nav\",style:l,attrs:{role:\"tablist\"},on:{keydown:h}},[i?null:e(\"tab-bar\",{attrs:{tabs:n}},[]),v])])])},mounted:function(){(0,o.addResizeListener)(this.$el,this.update),document.addEventListener(\"visibilitychange\",this.visibilityChangeHandler),window.addEventListener(\"blur\",this.windowBlurHandler),window.addEventListener(\"focus\",this.windowFocusHandler)},beforeDestroy:function(){this.$el&&this.update&&(0,o.removeResizeListener)(this.$el,this.update),document.removeEventListener(\"visibilitychange\",this.visibilityChangeHandler),window.removeEventListener(\"blur\",this.windowBlurHandler),window.removeEventListener(\"focus\",this.windowFocusHandler)}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(346),s=i.n(n),r=i(347),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"TabBar\",props:{tabs:Array},inject:[\"rootTabs\"],computed:{barStyle:{cache:!1,get:function(){var e=this;if(!this.$parent.$refs.tabs)return{};var t={},i=0,n=0,s=-1!==[\"top\",\"bottom\"].indexOf(this.rootTabs.tabPosition)?\"width\":\"height\",r=\"width\"===s?\"x\":\"y\",o=function(e){return e.toLowerCase().replace(/( |^)[a-z]/g,function(e){return e.toUpperCase()})};this.tabs.every(function(t,r){var a=e.$parent.$refs.tabs[r];return!!a&&(t.active?(n=a[\"client\"+o(s)],\"width\"===s&&e.tabs.length>1&&(n-=0===r||r===e.tabs.length-1?20:40),!1):(i+=a[\"client\"+o(s)],!0))}),\"width\"===s&&0!==i&&(i+=20);var a=\"translate\"+o(r)+\"(\"+i+\"px)\";return t[s]=n+\"px\",t.transform=a,t.msTransform=a,t.webkitTransform=a,t}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-tabs__active-bar\",class:\"is-\"+e.rootTabs.tabPosition,style:e.barStyle})},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(349),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(350),s=i.n(n),r=i(351),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElTabPane\",componentName:\"ElTabPane\",props:{label:String,labelContent:Function,name:String,closable:Boolean,disabled:Boolean,lazy:Boolean},data:function(){return{index:null,loaded:!1}},computed:{isClosable:function(){return this.closable||this.$parent.closable},active:function(){var e=this.$parent.currentName===(this.name||this.index);return e&&(this.loaded=!0),e},paneName:function(){return this.name||this.index}},watch:{label:function(){this.$parent.$forceUpdate()}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return!e.lazy||e.loaded||e.active?i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.active,expression:\"active\"}],staticClass:\"el-tab-pane\",attrs:{role:\"tabpanel\",\"aria-hidden\":!e.active,id:\"pane-\"+e.paneName,\"aria-labelledby\":\"tab-\"+e.paneName}},[e._t(\"default\")],2):e._e()},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(353),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(354),s=i.n(n),r=i(360),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(355),r=n(s),o=i(42),a=i(357),l=n(a),u=i(17),c=i(1),d=n(c),h=i(5);t.default={name:\"ElTree\",mixins:[d.default],components:{ElTreeNode:l.default},data:function(){return{store:null,root:null,currentNode:null,treeItems:null,checkboxItems:[],dragState:{showDropIndicator:!1,draggingNode:null,dropNode:null,allowDrop:!0}}},props:{data:{type:Array},emptyText:{type:String,default:function(){return(0,u.t)(\"el.tree.emptyText\")}},renderAfterExpand:{type:Boolean,default:!0},nodeKey:String,checkStrictly:Boolean,defaultExpandAll:Boolean,expandOnClickNode:{type:Boolean,default:!0},checkOnClickNode:Boolean,checkDescendants:{type:Boolean,default:!1},autoExpandParent:{type:Boolean,default:!0},defaultCheckedKeys:Array,defaultExpandedKeys:Array,currentNodeKey:[String,Number],renderContent:Function,showCheckbox:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},allowDrag:Function,allowDrop:Function,props:{default:function(){return{children:\"children\",label:\"label\",disabled:\"disabled\"}}},lazy:{type:Boolean,default:!1},highlightCurrent:Boolean,load:Function,filterNodeMethod:Function,accordion:Boolean,indent:{type:Number,default:18},iconClass:String},computed:{children:{set:function(e){this.data=e},get:function(){return this.data}},treeItemArray:function(){return Array.prototype.slice.call(this.treeItems)},isEmpty:function(){var e=this.root.childNodes;return!e||0===e.length||e.every(function(e){return!e.visible})}},watch:{defaultCheckedKeys:function(e){this.store.setDefaultCheckedKey(e)},defaultExpandedKeys:function(e){this.store.defaultExpandedKeys=e,this.store.setDefaultExpandedKeys(e)},data:function(e){this.store.setData(e)},checkboxItems:function(e){Array.prototype.forEach.call(e,function(e){e.setAttribute(\"tabindex\",-1)})},checkStrictly:function(e){this.store.checkStrictly=e}},methods:{filter:function(e){if(!this.filterNodeMethod)throw new Error(\"[Tree] filterNodeMethod is required when filter\");this.store.filter(e)},getNodeKey:function(e){return(0,o.getNodeKey)(this.nodeKey,e.data)},getNodePath:function(e){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in getNodePath\");var t=this.store.getNode(e);if(!t)return[];for(var i=[t.data],n=t.parent;n&&n!==this.root;)i.push(n.data),n=n.parent;return i.reverse()},getCheckedNodes:function(e,t){return this.store.getCheckedNodes(e,t)},getCheckedKeys:function(e){return this.store.getCheckedKeys(e)},getCurrentNode:function(){var e=this.store.getCurrentNode();return e?e.data:null},getCurrentKey:function(){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in getCurrentKey\");var e=this.getCurrentNode();return e?e[this.nodeKey]:null},setCheckedNodes:function(e,t){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in setCheckedNodes\");this.store.setCheckedNodes(e,t)},setCheckedKeys:function(e,t){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in setCheckedKeys\");this.store.setCheckedKeys(e,t)},setChecked:function(e,t,i){this.store.setChecked(e,t,i)},getHalfCheckedNodes:function(){return this.store.getHalfCheckedNodes()},getHalfCheckedKeys:function(){return this.store.getHalfCheckedKeys()},setCurrentNode:function(e){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in setCurrentNode\");this.store.setUserCurrentNode(e)},setCurrentKey:function(e){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in setCurrentKey\");this.store.setCurrentNodeKey(e)},getNode:function(e){return this.store.getNode(e)},remove:function(e){this.store.remove(e)},append:function(e,t){this.store.append(e,t)},insertBefore:function(e,t){this.store.insertBefore(e,t)},insertAfter:function(e,t){this.store.insertAfter(e,t)},handleNodeExpand:function(e,t,i){this.broadcast(\"ElTreeNode\",\"tree-node-expand\",t),this.$emit(\"node-expand\",e,t,i)},updateKeyChildren:function(e,t){if(!this.nodeKey)throw new Error(\"[Tree] nodeKey is required in updateKeyChild\");this.store.updateChildren(e,t)},initTabIndex:function(){this.treeItems=this.$el.querySelectorAll(\".is-focusable[role=treeitem]\"),this.checkboxItems=this.$el.querySelectorAll(\"input[type=checkbox]\");var e=this.$el.querySelectorAll(\".is-checked[role=treeitem]\");if(e.length)return void e[0].setAttribute(\"tabindex\",0);this.treeItems[0]&&this.treeItems[0].setAttribute(\"tabindex\",0)},handleKeydown:function(e){var t=e.target;if(-1!==t.className.indexOf(\"el-tree-node\")){var i=e.keyCode;this.treeItems=this.$el.querySelectorAll(\".is-focusable[role=treeitem]\");var n=this.treeItemArray.indexOf(t),s=void 0;[38,40].indexOf(i)>-1&&(e.preventDefault(),s=38===i?0!==n?n-1:0:n<this.treeItemArray.length-1?n+1:0,this.treeItemArray[s].focus()),[37,39].indexOf(i)>-1&&(e.preventDefault(),t.click());var r=t.querySelector('[type=\"checkbox\"]');[13,32].indexOf(i)>-1&&r&&(e.preventDefault(),r.click())}}},created:function(){var e=this;this.isTree=!0,this.store=new r.default({key:this.nodeKey,data:this.data,lazy:this.lazy,props:this.props,load:this.load,currentNodeKey:this.currentNodeKey,checkStrictly:this.checkStrictly,checkDescendants:this.checkDescendants,defaultCheckedKeys:this.defaultCheckedKeys,defaultExpandedKeys:this.defaultExpandedKeys,autoExpandParent:this.autoExpandParent,defaultExpandAll:this.defaultExpandAll,filterNodeMethod:this.filterNodeMethod}),this.root=this.store.root;var t=this.dragState;this.$on(\"tree-node-drag-start\",function(i,n){if(\"function\"==typeof e.allowDrag&&!e.allowDrag(n.node))return i.preventDefault(),!1;i.dataTransfer.effectAllowed=\"move\";try{i.dataTransfer.setData(\"text/plain\",\"\")}catch(e){}t.draggingNode=n,e.$emit(\"node-drag-start\",n.node,i)}),this.$on(\"tree-node-drag-over\",function(i,n){var s=(0,o.findNearestComponent)(i.target,\"ElTreeNode\"),r=t.dropNode;r&&r!==s&&(0,h.removeClass)(r.$el,\"is-drop-inner\");var a=t.draggingNode;if(a&&s){var l=!0,u=!0,c=!0,d=!0;\"function\"==typeof e.allowDrop&&(l=e.allowDrop(a.node,s.node,\"prev\"),d=u=e.allowDrop(a.node,s.node,\"inner\"),c=e.allowDrop(a.node,s.node,\"next\")),i.dataTransfer.dropEffect=u?\"move\":\"none\",(l||u||c)&&r!==s&&(r&&e.$emit(\"node-drag-leave\",a.node,r.node,i),e.$emit(\"node-drag-enter\",a.node,s.node,i)),(l||u||c)&&(t.dropNode=s),s.node.nextSibling===a.node&&(c=!1),s.node.previousSibling===a.node&&(l=!1),s.node.contains(a.node,!1)&&(u=!1),(a.node===s.node||a.node.contains(s.node))&&(l=!1,u=!1,c=!1);var f=s.$el.getBoundingClientRect(),p=e.$el.getBoundingClientRect(),m=void 0,v=l?u?.25:c?.45:1:-1,g=c?u?.75:l?.55:0:1,b=-9999,y=i.clientY-f.top;m=y<f.height*v?\"before\":y>f.height*g?\"after\":u?\"inner\":\"none\";var _=s.$el.querySelector(\".el-tree-node__expand-icon\").getBoundingClientRect(),C=e.$refs.dropIndicator;\"before\"===m?b=_.top-p.top:\"after\"===m&&(b=_.bottom-p.top),C.style.top=b+\"px\",C.style.left=_.right-p.left+\"px\",\"inner\"===m?(0,h.addClass)(s.$el,\"is-drop-inner\"):(0,h.removeClass)(s.$el,\"is-drop-inner\"),t.showDropIndicator=\"before\"===m||\"after\"===m,t.allowDrop=t.showDropIndicator||d,t.dropType=m,e.$emit(\"node-drag-over\",a.node,s.node,i)}}),this.$on(\"tree-node-drag-end\",function(i){var n=t.draggingNode,s=t.dropType,r=t.dropNode;if(i.preventDefault(),i.dataTransfer.dropEffect=\"move\",n&&r){var o={data:n.node.data};\"none\"!==s&&n.node.remove(),\"before\"===s?r.node.parent.insertBefore(o,r.node):\"after\"===s?r.node.parent.insertAfter(o,r.node):\"inner\"===s&&r.node.insertChild(o),\"none\"!==s&&e.store.registerNode(o),(0,h.removeClass)(r.$el,\"is-drop-inner\"),e.$emit(\"node-drag-end\",n.node,r.node,s,i),\"none\"!==s&&e.$emit(\"node-drop\",n.node,r.node,s,i)}n&&!r&&e.$emit(\"node-drag-end\",n.node,null,s,i),t.showDropIndicator=!1,t.draggingNode=null,t.dropNode=null,t.allowDrop=!0})},mounted:function(){this.initTabIndex(),this.$el.addEventListener(\"keydown\",this.handleKeydown)},updated:function(){this.treeItems=this.$el.querySelectorAll(\"[role=treeitem]\"),this.checkboxItems=this.$el.querySelectorAll(\"input[type=checkbox]\")}}},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=i(356),o=function(e){return e&&e.__esModule?e:{default:e}}(r),a=i(42),l=function(){function e(t){var i=this;n(this,e),this.currentNode=null,this.currentNodeKey=null;for(var s in t)t.hasOwnProperty(s)&&(this[s]=t[s]);if(this.nodesMap={},this.root=new o.default({data:this.data,store:this}),this.lazy&&this.load){(0,this.load)(this.root,function(e){i.root.doCreateChildren(e),i._initDefaultCheckedNodes()})}else this._initDefaultCheckedNodes()}return e.prototype.filter=function(e){var t=this.filterNodeMethod,i=this.lazy;!function n(s){var r=s.root?s.root.childNodes:s.childNodes;if(r.forEach(function(i){i.visible=t.call(i,e,i.data,i),n(i)}),!s.visible&&r.length){var o=!0;r.forEach(function(e){e.visible&&(o=!1)}),s.root?s.root.visible=!1===o:s.visible=!1===o}e&&(!s.visible||s.isLeaf||i||s.expand())}(this)},e.prototype.setData=function(e){e!==this.root.data?(this.root.setData(e),this._initDefaultCheckedNodes()):this.root.updateChildren()},e.prototype.getNode=function(e){if(e instanceof o.default)return e;var t=\"object\"!==(void 0===e?\"undefined\":s(e))?e:(0,a.getNodeKey)(this.key,e);return this.nodesMap[t]||null},e.prototype.insertBefore=function(e,t){var i=this.getNode(t);i.parent.insertBefore({data:e},i)},e.prototype.insertAfter=function(e,t){var i=this.getNode(t);i.parent.insertAfter({data:e},i)},e.prototype.remove=function(e){var t=this.getNode(e);t&&t.parent&&t.parent.removeChild(t)},e.prototype.append=function(e,t){var i=t?this.getNode(t):this.root;i&&i.insertChild({data:e})},e.prototype._initDefaultCheckedNodes=function(){var e=this,t=this.defaultCheckedKeys||[],i=this.nodesMap;t.forEach(function(t){var n=i[t];n&&n.setChecked(!0,!e.checkStrictly)})},e.prototype._initDefaultCheckedNode=function(e){-1!==(this.defaultCheckedKeys||[]).indexOf(e.key)&&e.setChecked(!0,!this.checkStrictly)},e.prototype.setDefaultCheckedKey=function(e){e!==this.defaultCheckedKeys&&(this.defaultCheckedKeys=e,this._initDefaultCheckedNodes())},e.prototype.registerNode=function(e){this.key&&e&&e.data&&(void 0!==e.key&&(this.nodesMap[e.key]=e))},e.prototype.deregisterNode=function(e){var t=this;this.key&&e&&e.data&&(e.childNodes.forEach(function(e){t.deregisterNode(e)}),delete this.nodesMap[e.key])},e.prototype.getCheckedNodes=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=[];return function n(s){(s.root?s.root.childNodes:s.childNodes).forEach(function(s){(s.checked||t&&s.indeterminate)&&(!e||e&&s.isLeaf)&&i.push(s.data),n(s)})}(this),i},e.prototype.getCheckedKeys=function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.getCheckedNodes(t).map(function(t){return(t||{})[e.key]})},e.prototype.getHalfCheckedNodes=function(){var e=[];return function t(i){(i.root?i.root.childNodes:i.childNodes).forEach(function(i){i.indeterminate&&e.push(i.data),t(i)})}(this),e},e.prototype.getHalfCheckedKeys=function(){var e=this;return this.getHalfCheckedNodes().map(function(t){return(t||{})[e.key]})},e.prototype._getAllNodes=function(){var e=[],t=this.nodesMap;for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},e.prototype.updateChildren=function(e,t){var i=this.nodesMap[e];if(i){for(var n=i.childNodes,s=n.length-1;s>=0;s--){var r=n[s];this.remove(r.data)}for(var o=0,a=t.length;o<a;o++){var l=t[o];this.append(l,i.data)}}},e.prototype._setCheckedKeys=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments[2],n=this._getAllNodes().sort(function(e,t){return t.level-e.level}),s=Object.create(null),r=Object.keys(i);n.forEach(function(e){return e.setChecked(!1,!1)});for(var o=0,a=n.length;o<a;o++){var l=n[o],u=l.data[e].toString();if(r.indexOf(u)>-1){for(var c=l.parent;c&&c.level>0;)s[c.data[e]]=!0,c=c.parent;l.isLeaf||this.checkStrictly?l.setChecked(!0,!1):(l.setChecked(!0,!0),t&&function(){l.setChecked(!1,!1);!function e(t){t.childNodes.forEach(function(t){t.isLeaf||t.setChecked(!1,!1),e(t)})}(l)}())}else l.checked&&!s[u]&&l.setChecked(!1,!1)}},e.prototype.setCheckedNodes=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.key,n={};e.forEach(function(e){n[(e||{})[i]]=!0}),this._setCheckedKeys(i,t,n)},e.prototype.setCheckedKeys=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.defaultCheckedKeys=e;var i=this.key,n={};e.forEach(function(e){n[e]=!0}),this._setCheckedKeys(i,t,n)},e.prototype.setDefaultExpandedKeys=function(e){var t=this;e=e||[],this.defaultExpandedKeys=e,e.forEach(function(e){var i=t.getNode(e);i&&i.expand(null,t.autoExpandParent)})},e.prototype.setChecked=function(e,t,i){var n=this.getNode(e);n&&n.setChecked(!!t,i)},e.prototype.getCurrentNode=function(){return this.currentNode},e.prototype.setCurrentNode=function(e){this.currentNode=e},e.prototype.setUserCurrentNode=function(e){var t=e[this.key],i=this.nodesMap[t];this.setCurrentNode(i)},e.prototype.setCurrentNodeKey=function(e){if(null===e)return void(this.currentNode=null);var t=this.getNode(e);t&&(this.currentNode=t)},e}();t.default=l},function(e,t,i){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}t.__esModule=!0,t.getChildState=void 0;var s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),o=i(10),a=function(e){return e&&e.__esModule?e:{default:e}}(o),l=i(42),u=t.getChildState=function(e){for(var t=!0,i=!0,n=!0,s=0,r=e.length;s<r;s++){var o=e[s];(!0!==o.checked||o.indeterminate)&&(t=!1,o.disabled||(n=!1)),(!1!==o.checked||o.indeterminate)&&(i=!1)}return{all:t,none:i,allWithoutDisable:n,half:!t&&!i}},c=function e(t){if(0!==t.childNodes.length){var i=u(t.childNodes),n=i.all,s=i.none,r=i.half;n?(t.checked=!0,t.indeterminate=!1):r?(t.checked=!1,t.indeterminate=!0):s&&(t.checked=!1,t.indeterminate=!1);var o=t.parent;o&&0!==o.level&&(t.store.checkStrictly||e(o))}},d=function(e,t){var i=e.store.props,n=e.data||{},s=i[t];if(\"function\"==typeof s)return s(n,e);if(\"string\"==typeof s)return n[s];if(void 0===s){var r=n[t];return void 0===r?\"\":r}},h=0,f=function(){function e(t){n(this,e),this.id=h++,this.text=null,this.checked=!1,this.indeterminate=!1,this.data=null,this.expanded=!1,this.parent=null,this.visible=!0;for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i]);this.level=0,this.loaded=!1,this.childNodes=[],this.loading=!1,this.parent&&(this.level=this.parent.level+1);var s=this.store;if(!s)throw new Error(\"[Node]store is required!\");s.registerNode(this);var r=s.props;if(r&&void 0!==r.isLeaf){var o=d(this,\"isLeaf\");\"boolean\"==typeof o&&(this.isLeafByUser=o)}if(!0!==s.lazy&&this.data?(this.setData(this.data),s.defaultExpandAll&&(this.expanded=!0)):this.level>0&&s.lazy&&s.defaultExpandAll&&this.expand(),Array.isArray(this.data)||(0,l.markNodeData)(this,this.data),this.data){var a=s.defaultExpandedKeys,u=s.key;u&&a&&-1!==a.indexOf(this.key)&&this.expand(null,s.autoExpandParent),u&&void 0!==s.currentNodeKey&&this.key===s.currentNodeKey&&(s.currentNode=this),s.lazy&&s._initDefaultCheckedNode(this),this.updateLeafState()}}return e.prototype.setData=function(e){Array.isArray(e)||(0,l.markNodeData)(this,e),this.data=e,this.childNodes=[];var t=void 0;t=0===this.level&&this.data instanceof Array?this.data:d(this,\"children\")||[];for(var i=0,n=t.length;i<n;i++)this.insertChild({data:t[i]})},e.prototype.contains=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return function i(n){for(var s=n.childNodes||[],r=!1,o=0,a=s.length;o<a;o++){var l=s[o];if(l===e||t&&i(l)){r=!0;break}}return r}(this)},e.prototype.remove=function(){var e=this.parent;e&&e.removeChild(this)},e.prototype.insertChild=function(t,i,n){if(!t)throw new Error(\"insertChild error: child is required.\");if(!(t instanceof e)){if(!n){var s=this.getChildren(!0);-1===s.indexOf(t.data)&&(void 0===i||i<0?s.push(t.data):s.splice(i,0,t.data))}(0,a.default)(t,{parent:this,store:this.store}),t=new e(t)}t.level=this.level+1,void 0===i||i<0?this.childNodes.push(t):this.childNodes.splice(i,0,t),this.updateLeafState()},e.prototype.insertBefore=function(e,t){var i=void 0;t&&(i=this.childNodes.indexOf(t)),this.insertChild(e,i)},e.prototype.insertAfter=function(e,t){var i=void 0;t&&-1!==(i=this.childNodes.indexOf(t))&&(i+=1),this.insertChild(e,i)},e.prototype.removeChild=function(e){var t=this.getChildren()||[],i=t.indexOf(e.data);i>-1&&t.splice(i,1);var n=this.childNodes.indexOf(e);n>-1&&(this.store&&this.store.deregisterNode(e),e.parent=null,this.childNodes.splice(n,1)),this.updateLeafState()},e.prototype.removeChildByData=function(e){for(var t=null,i=0;i<this.childNodes.length;i++)if(this.childNodes[i].data===e){t=this.childNodes[i];break}t&&this.removeChild(t)},e.prototype.expand=function(e,t){var i=this,n=function(){if(t)for(var n=i.parent;n.level>0;)n.expanded=!0,n=n.parent;i.expanded=!0,e&&e()};this.shouldLoadData()?this.loadData(function(e){e instanceof Array&&(i.checked?i.setChecked(!0,!0):i.store.checkStrictly||c(i),n())}):n()},e.prototype.doCreateChildren=function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.forEach(function(e){t.insertChild((0,a.default)({data:e},i),void 0,!0)})},e.prototype.collapse=function(){this.expanded=!1},e.prototype.shouldLoadData=function(){return!0===this.store.lazy&&this.store.load&&!this.loaded},e.prototype.updateLeafState=function(){if(!0===this.store.lazy&&!0!==this.loaded&&void 0!==this.isLeafByUser)return void(this.isLeaf=this.isLeafByUser);var e=this.childNodes;if(!this.store.lazy||!0===this.store.lazy&&!0===this.loaded)return void(this.isLeaf=!e||0===e.length);this.isLeaf=!1},e.prototype.setChecked=function(e,t,i,n){var r=this;if(this.indeterminate=\"half\"===e,this.checked=!0===e,!this.store.checkStrictly){if(!this.shouldLoadData()||this.store.checkDescendants){var o=function(){var i=u(r.childNodes),s=i.all,o=i.allWithoutDisable;r.isLeaf||s||!o||(r.checked=!1,e=!1);var a=function(){if(t){for(var i=r.childNodes,s=0,o=i.length;s<o;s++){var a=i[s];n=n||!1!==e;var l=a.disabled?a.checked:n;a.setChecked(l,t,!0,n)}var c=u(i),d=c.half,h=c.all;h||(r.checked=h,r.indeterminate=d)}};if(r.shouldLoadData())return r.loadData(function(){a(),c(r)},{checked:!1!==e}),{v:void 0};a()}();if(\"object\"===(void 0===o?\"undefined\":s(o)))return o.v}var a=this.parent;a&&0!==a.level&&(i||c(a))}},e.prototype.getChildren=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(0===this.level)return this.data;var t=this.data;if(!t)return null;var i=this.store.props,n=\"children\";return i&&(n=i.children||\"children\"),void 0===t[n]&&(t[n]=null),e&&!t[n]&&(t[n]=[]),t[n]},e.prototype.updateChildren=function(){var e=this,t=this.getChildren()||[],i=this.childNodes.map(function(e){return e.data}),n={},s=[];t.forEach(function(e,t){e[l.NODE_KEY]?n[e[l.NODE_KEY]]={index:t,data:e}:s.push({index:t,data:e})}),this.store.lazy||i.forEach(function(t){n[t[l.NODE_KEY]]||e.removeChildByData(t)}),s.forEach(function(t){var i=t.index,n=t.data;e.insertChild({data:n},i)}),this.updateLeafState()},e.prototype.loadData=function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!0!==this.store.lazy||!this.store.load||this.loaded||this.loading&&!Object.keys(i).length)e&&e.call(this);else{this.loading=!0;var n=function(n){t.loaded=!0,t.loading=!1,t.childNodes=[],t.doCreateChildren(n,i),t.updateLeafState(),c(t),e&&e.call(t,n)};this.store.load(this,n)}},r(e,[{key:\"label\",get:function(){return d(this,\"label\")}},{key:\"key\",get:function(){var e=this.store.key;return this.data?this.data[e]:null}},{key:\"disabled\",get:function(){return d(this,\"disabled\")}},{key:\"nextSibling\",get:function(){var e=this.parent;if(e){var t=e.childNodes.indexOf(this);if(t>-1)return e.childNodes[t+1]}return null}},{key:\"previousSibling\",get:function(){var e=this.parent;if(e){var t=e.childNodes.indexOf(this);if(t>-1)return t>0?e.childNodes[t-1]:null}return null}}]),e}();t.default=f},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(358),s=i.n(n),r=i(359),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(32),r=n(s),o=i(15),a=n(o),l=i(1),u=n(l),c=i(42);t.default={name:\"ElTreeNode\",componentName:\"ElTreeNode\",mixins:[u.default],props:{node:{default:function(){return{}}},props:{},renderContent:Function,renderAfterExpand:{type:Boolean,default:!0}},components:{ElCollapseTransition:r.default,ElCheckbox:a.default,NodeContent:{props:{node:{required:!0}},render:function(e){var t=this.$parent,i=t.tree,n=this.node,s=n.data,r=n.store;return t.renderContent?t.renderContent.call(t._renderProxy,e,{_self:i.$vnode.context,node:n,data:s,store:r}):i.$scopedSlots.default?i.$scopedSlots.default({node:n,data:s}):e(\"span\",{class:\"el-tree-node__label\"},[n.label])}}},data:function(){return{tree:null,expanded:!1,childNodeRendered:!1,showCheckbox:!1,oldChecked:null,oldIndeterminate:null}},watch:{\"node.indeterminate\":function(e){this.handleSelectChange(this.node.checked,e)},\"node.checked\":function(e){this.handleSelectChange(e,this.node.indeterminate)},\"node.expanded\":function(e){var t=this;this.$nextTick(function(){return t.expanded=e}),e&&(this.childNodeRendered=!0)}},methods:{getNodeKey:function(e){return(0,c.getNodeKey)(this.tree.nodeKey,e.data)},handleSelectChange:function(e,t){this.oldChecked!==e&&this.oldIndeterminate!==t&&this.tree.$emit(\"check-change\",this.node.data,e,t),this.oldChecked=e,this.indeterminate=t},handleClick:function(){var e=this.tree.store;e.setCurrentNode(this.node),this.tree.$emit(\"current-change\",e.currentNode?e.currentNode.data:null,e.currentNode),this.tree.currentNode=this,this.tree.expandOnClickNode&&this.handleExpandIconClick(),this.tree.checkOnClickNode&&!this.node.disabled&&this.handleCheckChange(null,{target:{checked:!this.node.checked}}),this.tree.$emit(\"node-click\",this.node.data,this.node,this)},handleContextMenu:function(e){this.tree._events[\"node-contextmenu\"]&&this.tree._events[\"node-contextmenu\"].length>0&&(e.stopPropagation(),e.preventDefault()),this.tree.$emit(\"node-contextmenu\",e,this.node.data,this.node,this)},handleExpandIconClick:function(){this.node.isLeaf||(this.expanded?(this.tree.$emit(\"node-collapse\",this.node.data,this.node,this),this.node.collapse()):(this.node.expand(),this.$emit(\"node-expand\",this.node.data,this.node,this)))},handleCheckChange:function(e,t){var i=this;this.node.setChecked(t.target.checked,!this.tree.checkStrictly),this.$nextTick(function(){var e=i.tree.store;i.tree.$emit(\"check\",i.node.data,{checkedNodes:e.getCheckedNodes(),checkedKeys:e.getCheckedKeys(),halfCheckedNodes:e.getHalfCheckedNodes(),halfCheckedKeys:e.getHalfCheckedKeys()})})},handleChildNodeExpand:function(e,t,i){this.broadcast(\"ElTreeNode\",\"tree-node-expand\",t),this.tree.$emit(\"node-expand\",e,t,i)},handleDragStart:function(e){this.tree.draggable&&this.tree.$emit(\"tree-node-drag-start\",e,this)},handleDragOver:function(e){this.tree.draggable&&(this.tree.$emit(\"tree-node-drag-over\",e,this),e.preventDefault())},handleDrop:function(e){e.preventDefault()},handleDragEnd:function(e){this.tree.draggable&&this.tree.$emit(\"tree-node-drag-end\",e,this)}},created:function(){var e=this,t=this.$parent;t.isTree?this.tree=t:this.tree=t.tree;var i=this.tree;i||console.warn(\"Can not find node's tree.\");var n=i.props||{},s=n.children||\"children\";this.$watch(\"node.data.\"+s,function(){e.node.updateChildren()}),this.showCheckbox=i.showCheckbox,this.node.expanded&&(this.expanded=!0,this.childNodeRendered=!0),this.tree.accordion&&this.$on(\"tree-node-expand\",function(t){e.node!==t&&e.node.collapse()})}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=this,i=t.$createElement,n=t._self._c||i;return n(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:t.node.visible,expression:\"node.visible\"}],ref:\"node\",staticClass:\"el-tree-node\",class:{\"is-expanded\":t.expanded,\"is-current\":t.tree.store.currentNode===t.node,\"is-hidden\":!t.node.visible,\"is-focusable\":!t.node.disabled,\"is-checked\":!t.node.disabled&&t.node.checked},attrs:{role:\"treeitem\",tabindex:\"-1\",\"aria-expanded\":t.expanded,\"aria-disabled\":t.node.disabled,\"aria-checked\":t.node.checked,draggable:t.tree.draggable},on:{click:function(e){e.stopPropagation(),t.handleClick(e)},contextmenu:function(t){return e.handleContextMenu(t)},dragstart:function(e){e.stopPropagation(),t.handleDragStart(e)},dragover:function(e){e.stopPropagation(),t.handleDragOver(e)},dragend:function(e){e.stopPropagation(),t.handleDragEnd(e)},drop:function(e){e.stopPropagation(),t.handleDrop(e)}}},[n(\"div\",{staticClass:\"el-tree-node__content\",style:{\"padding-left\":(t.node.level-1)*t.tree.indent+\"px\"}},[n(\"span\",{class:[{\"is-leaf\":t.node.isLeaf,expanded:!t.node.isLeaf&&t.expanded},\"el-tree-node__expand-icon\",t.tree.iconClass?t.tree.iconClass:\"el-icon-caret-right\"],on:{click:function(e){e.stopPropagation(),t.handleExpandIconClick(e)}}}),t.showCheckbox?n(\"el-checkbox\",{attrs:{indeterminate:t.node.indeterminate,disabled:!!t.node.disabled},on:{change:t.handleCheckChange},nativeOn:{click:function(e){e.stopPropagation()}},model:{value:t.node.checked,callback:function(e){t.$set(t.node,\"checked\",e)},expression:\"node.checked\"}}):t._e(),t.node.loading?n(\"span\",{staticClass:\"el-tree-node__loading-icon el-icon-loading\"}):t._e(),n(\"node-content\",{attrs:{node:t.node}})],1),n(\"el-collapse-transition\",[!t.renderAfterExpand||t.childNodeRendered?n(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:t.expanded,expression:\"expanded\"}],staticClass:\"el-tree-node__children\",attrs:{role:\"group\",\"aria-expanded\":t.expanded}},t._l(t.node.childNodes,function(e){return n(\"el-tree-node\",{key:t.getNodeKey(e),attrs:{\"render-content\":t.renderContent,\"render-after-expand\":t.renderAfterExpand,node:e},on:{\"node-expand\":t.handleChildNodeExpand}})})):t._e()])],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-tree\",class:{\"el-tree--highlight-current\":e.highlightCurrent,\"is-dragging\":!!e.dragState.draggingNode,\"is-drop-not-allow\":!e.dragState.allowDrop,\"is-drop-inner\":\"inner\"===e.dragState.dropType},attrs:{role:\"tree\"}},[e._l(e.root.childNodes,function(t){return i(\"el-tree-node\",{key:e.getNodeKey(t),attrs:{node:t,props:e.props,\"render-after-expand\":e.renderAfterExpand,\"render-content\":e.renderContent},on:{\"node-expand\":e.handleNodeExpand}})}),e.isEmpty?i(\"div\",{staticClass:\"el-tree__empty-block\"},[i(\"span\",{staticClass:\"el-tree__empty-text\"},[e._v(e._s(e.emptyText))])]):e._e(),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.dragState.showDropIndicator,expression:\"dragState.showDropIndicator\"}],ref:\"dropIndicator\",staticClass:\"el-tree__drop-indicator\"})],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(362),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(363),s=i.n(n),r=i(364),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n={success:\"el-icon-success\",warning:\"el-icon-warning\",error:\"el-icon-error\"};t.default={name:\"ElAlert\",props:{title:{type:String,default:\"\"},description:{type:String,default:\"\"},type:{type:String,default:\"info\"},closable:{type:Boolean,default:!0},closeText:{type:String,default:\"\"},showIcon:Boolean,center:Boolean},data:function(){return{visible:!0}},methods:{close:function(){this.visible=!1,this.$emit(\"close\")}},computed:{typeClass:function(){return\"el-alert--\"+this.type},iconClass:function(){return n[this.type]||\"el-icon-info\"},isBigIcon:function(){return this.description||this.$slots.default?\"is-big\":\"\"},isBoldTitle:function(){return this.description||this.$slots.default?\"is-bold\":\"\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-alert-fade\"}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-alert\",class:[e.typeClass,e.center?\"is-center\":\"\"],attrs:{role:\"alert\"}},[e.showIcon?i(\"i\",{staticClass:\"el-alert__icon\",class:[e.iconClass,e.isBigIcon]}):e._e(),i(\"div\",{staticClass:\"el-alert__content\"},[e.title||e.$slots.title?i(\"span\",{staticClass:\"el-alert__title\",class:[e.isBoldTitle]},[e._t(\"title\",[e._v(e._s(e.title))])],2):e._e(),e._t(\"default\",[e.description?i(\"p\",{staticClass:\"el-alert__description\"},[e._v(e._s(e.description))]):e._e()]),i(\"i\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.closable,expression:\"closable\"}],staticClass:\"el-alert__closebtn\",class:{\"is-customed\":\"\"!==e.closeText,\"el-icon-close\":\"\"===e.closeText},on:{click:function(t){e.close()}}},[e._v(e._s(e.closeText))])],2)])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(366),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(367),a=n(o),l=i(14),u=i(34),c=r.default.extend(a.default),d=void 0,h=[],f=1,p=function e(t){if(!r.default.prototype.$isServer){t=t||{};var i=t.onClose,n=\"notification_\"+f++,s=t.position||\"top-right\";t.onClose=function(){e.close(n,i)},d=new c({data:t}),(0,u.isVNode)(t.message)&&(d.$slots.default=[t.message],t.message=\"REPLACED_BY_VNODE\"),d.id=n,d.$mount(),document.body.appendChild(d.$el),d.visible=!0,d.dom=d.$el,d.dom.style.zIndex=l.PopupManager.nextZIndex();var o=t.offset||0;return h.filter(function(e){return e.position===s}).forEach(function(e){o+=e.$el.offsetHeight+16}),o+=16,d.verticalOffset=o,h.push(d),d}};[\"success\",\"warning\",\"info\",\"error\"].forEach(function(e){p[e]=function(t){return(\"string\"==typeof t||(0,u.isVNode)(t))&&(t={message:t}),t.type=e,p(t)}}),p.close=function(e,t){var i=-1,n=h.length,s=h.filter(function(t,n){return t.id===e&&(i=n,!0)})[0];if(s&&(\"function\"==typeof t&&t(s),h.splice(i,1),!(n<=1)))for(var r=s.position,o=s.dom.offsetHeight,a=i;a<n-1;a++)h[a].position===r&&(h[a].dom.style[s.verticalProperty]=parseInt(h[a].dom.style[s.verticalProperty],10)-o-16+\"px\")},p.closeAll=function(){for(var e=h.length-1;e>=0;e--)h[e].close()},t.default=p},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(368),s=i.n(n),r=i(369),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n={success:\"success\",info:\"info\",warning:\"warning\",error:\"error\"};t.default={data:function(){return{visible:!1,title:\"\",message:\"\",duration:4500,type:\"\",showClose:!0,customClass:\"\",iconClass:\"\",onClose:null,onClick:null,closed:!1,verticalOffset:0,timer:null,dangerouslyUseHTMLString:!1,position:\"top-right\"}},computed:{typeClass:function(){return this.type&&n[this.type]?\"el-icon-\"+n[this.type]:\"\"},horizontalClass:function(){return this.position.indexOf(\"right\")>-1?\"right\":\"left\"},verticalProperty:function(){return/^top-/.test(this.position)?\"top\":\"bottom\"},positionStyle:function(){var e;return e={},e[this.verticalProperty]=this.verticalOffset+\"px\",e}},watch:{closed:function(e){e&&(this.visible=!1,this.$el.addEventListener(\"transitionend\",this.destroyElement))}},methods:{destroyElement:function(){this.$el.removeEventListener(\"transitionend\",this.destroyElement),this.$destroy(!0),this.$el.parentNode.removeChild(this.$el)},click:function(){\"function\"==typeof this.onClick&&this.onClick()},close:function(){this.closed=!0,\"function\"==typeof this.onClose&&this.onClose()},clearTimer:function(){clearTimeout(this.timer)},startTimer:function(){var e=this;this.duration>0&&(this.timer=setTimeout(function(){e.closed||e.close()},this.duration))},keydown:function(e){46===e.keyCode||8===e.keyCode?this.clearTimer():27===e.keyCode?this.closed||this.close():this.startTimer()}},mounted:function(){var e=this;this.duration>0&&(this.timer=setTimeout(function(){e.closed||e.close()},this.duration)),document.addEventListener(\"keydown\",this.keydown)},beforeDestroy:function(){document.removeEventListener(\"keydown\",this.keydown)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-notification-fade\"}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],class:[\"el-notification\",e.customClass,e.horizontalClass],style:e.positionStyle,attrs:{role:\"alert\"},on:{mouseenter:function(t){e.clearTimer()},mouseleave:function(t){e.startTimer()},click:e.click}},[e.type||e.iconClass?i(\"i\",{staticClass:\"el-notification__icon\",class:[e.typeClass,e.iconClass]}):e._e(),i(\"div\",{staticClass:\"el-notification__group\",class:{\"is-with-icon\":e.typeClass||e.iconClass}},[i(\"h2\",{staticClass:\"el-notification__title\",domProps:{textContent:e._s(e.title)}}),i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.message,expression:\"message\"}],staticClass:\"el-notification__content\"},[e._t(\"default\",[e.dangerouslyUseHTMLString?i(\"p\",{domProps:{innerHTML:e._s(e.message)}}):i(\"p\",[e._v(e._s(e.message))])])],2),e.showClose?i(\"div\",{staticClass:\"el-notification__closeBtn el-icon-close\",on:{click:function(t){t.stopPropagation(),e.close(t)}}}):e._e()])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(371),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(372),s=i.n(n),r=i(376),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(72),r=n(s),o=i(373),a=n(o),l=i(1),u=n(l);t.default={name:\"ElSlider\",mixins:[u.default],inject:{elForm:{default:\"\"}},props:{min:{type:Number,default:0},max:{type:Number,default:100},step:{type:Number,default:1},value:{type:[Number,Array],default:0},showInput:{type:Boolean,default:!1},showInputControls:{type:Boolean,default:!0},inputSize:{type:String,default:\"small\"},showStops:{type:Boolean,default:!1},showTooltip:{type:Boolean,default:!0},formatTooltip:Function,disabled:{type:Boolean,default:!1},range:{type:Boolean,default:!1},vertical:{type:Boolean,default:!1},height:{type:String},debounce:{type:Number,default:300},label:{type:String},tooltipClass:String},components:{ElInputNumber:r.default,SliderButton:a.default},data:function(){return{firstValue:null,secondValue:null,oldValue:null,dragging:!1,sliderSize:1}},watch:{value:function(e,t){this.dragging||Array.isArray(e)&&Array.isArray(t)&&e.every(function(e,i){return e===t[i]})||this.setValues()},dragging:function(e){e||this.setValues()},firstValue:function(e){this.range?this.$emit(\"input\",[this.minValue,this.maxValue]):this.$emit(\"input\",e)},secondValue:function(){this.range&&this.$emit(\"input\",[this.minValue,this.maxValue])},min:function(){this.setValues()},max:function(){this.setValues()}},methods:{valueChanged:function(){var e=this;return this.range?![this.minValue,this.maxValue].every(function(t,i){return t===e.oldValue[i]}):this.value!==this.oldValue},setValues:function(){if(this.min>this.max)return void console.error(\"[Element Error][Slider]min should not be greater than max.\");var e=this.value;this.range&&Array.isArray(e)?e[1]<this.min?this.$emit(\"input\",[this.min,this.min]):e[0]>this.max?this.$emit(\"input\",[this.max,this.max]):e[0]<this.min?this.$emit(\"input\",[this.min,e[1]]):e[1]>this.max?this.$emit(\"input\",[e[0],this.max]):(this.firstValue=e[0],this.secondValue=e[1],this.valueChanged()&&(this.dispatch(\"ElFormItem\",\"el.form.change\",[this.minValue,this.maxValue]),this.oldValue=e.slice())):this.range||\"number\"!=typeof e||isNaN(e)||(e<this.min?this.$emit(\"input\",this.min):e>this.max?this.$emit(\"input\",this.max):(this.firstValue=e,this.valueChanged()&&(this.dispatch(\"ElFormItem\",\"el.form.change\",e),this.oldValue=e)))},setPosition:function(e){var t=this.min+e*(this.max-this.min)/100;if(!this.range)return void this.$refs.button1.setPosition(e);var i=void 0;i=Math.abs(this.minValue-t)<Math.abs(this.maxValue-t)?this.firstValue<this.secondValue?\"button1\":\"button2\":this.firstValue>this.secondValue?\"button1\":\"button2\",this.$refs[i].setPosition(e)},onSliderClick:function(e){if(!this.sliderDisabled&&!this.dragging){if(this.resetSize(),this.vertical){var t=this.$refs.slider.getBoundingClientRect().bottom;this.setPosition((t-e.clientY)/this.sliderSize*100)}else{var i=this.$refs.slider.getBoundingClientRect().left;this.setPosition((e.clientX-i)/this.sliderSize*100)}this.emitChange()}},resetSize:function(){this.$refs.slider&&(this.sliderSize=this.$refs.slider[\"client\"+(this.vertical?\"Height\":\"Width\")])},emitChange:function(){var e=this;this.$nextTick(function(){e.$emit(\"change\",e.range?[e.minValue,e.maxValue]:e.value)})}},computed:{stops:function(){var e=this;if(!this.showStops||this.min>this.max)return[];if(0===this.step)return[];for(var t=(this.max-this.min)/this.step,i=100*this.step/(this.max-this.min),n=[],s=1;s<t;s++)n.push(s*i);return this.range?n.filter(function(t){return t<100*(e.minValue-e.min)/(e.max-e.min)||t>100*(e.maxValue-e.min)/(e.max-e.min)}):n.filter(function(t){return t>100*(e.firstValue-e.min)/(e.max-e.min)})},minValue:function(){return Math.min(this.firstValue,this.secondValue)},maxValue:function(){return Math.max(this.firstValue,this.secondValue)},barSize:function(){return this.range?100*(this.maxValue-this.minValue)/(this.max-this.min)+\"%\":100*(this.firstValue-this.min)/(this.max-this.min)+\"%\"},barStart:function(){return this.range?100*(this.minValue-this.min)/(this.max-this.min)+\"%\":\"0%\"},precision:function(){var e=[this.min,this.max,this.step].map(function(e){var t=(\"\"+e).split(\".\")[1];return t?t.length:0});return Math.max.apply(null,e)},runwayStyle:function(){return this.vertical?{height:this.height}:{}},barStyle:function(){return this.vertical?{height:this.barSize,bottom:this.barStart}:{width:this.barSize,left:this.barStart}},sliderDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},mounted:function(){var e=void 0;this.range?(Array.isArray(this.value)?(this.firstValue=Math.max(this.min,this.value[0]),this.secondValue=Math.min(this.max,this.value[1])):(this.firstValue=this.min,this.secondValue=this.max),this.oldValue=[this.firstValue,this.secondValue],e=this.firstValue+\"-\"+this.secondValue):(\"number\"!=typeof this.value||isNaN(this.value)?this.firstValue=this.min:this.firstValue=Math.min(this.max,Math.max(this.min,this.value)),this.oldValue=this.firstValue,e=this.firstValue),this.$el.setAttribute(\"aria-valuetext\",e),this.$el.setAttribute(\"aria-label\",this.label?this.label:\"slider between \"+this.min+\" and \"+this.max),this.resetSize(),window.addEventListener(\"resize\",this.resetSize)},beforeDestroy:function(){window.removeEventListener(\"resize\",this.resetSize)}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(374),s=i.n(n),r=i(375),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(33),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElSliderButton\",components:{ElTooltip:s.default},props:{value:{type:Number,default:0},vertical:{type:Boolean,default:!1},tooltipClass:String},data:function(){return{hovering:!1,dragging:!1,isClick:!1,startX:0,currentX:0,startY:0,currentY:0,startPosition:0,newPosition:null,oldValue:this.value}},computed:{disabled:function(){return this.$parent.sliderDisabled},max:function(){return this.$parent.max},min:function(){return this.$parent.min},step:function(){return this.$parent.step},showTooltip:function(){return this.$parent.showTooltip},precision:function(){return this.$parent.precision},currentPosition:function(){return(this.value-this.min)/(this.max-this.min)*100+\"%\"},enableFormat:function(){return this.$parent.formatTooltip instanceof Function},formatValue:function(){return this.enableFormat&&this.$parent.formatTooltip(this.value)||this.value},wrapperStyle:function(){return this.vertical?{bottom:this.currentPosition}:{left:this.currentPosition}}},watch:{dragging:function(e){this.$parent.dragging=e}},methods:{displayTooltip:function(){this.$refs.tooltip&&(this.$refs.tooltip.showPopper=!0)},hideTooltip:function(){this.$refs.tooltip&&(this.$refs.tooltip.showPopper=!1)},handleMouseEnter:function(){this.hovering=!0,this.displayTooltip()},handleMouseLeave:function(){this.hovering=!1,this.hideTooltip()},onButtonDown:function(e){this.disabled||(e.preventDefault(),this.onDragStart(e),window.addEventListener(\"mousemove\",this.onDragging),window.addEventListener(\"touchmove\",this.onDragging),window.addEventListener(\"mouseup\",this.onDragEnd),window.addEventListener(\"touchend\",this.onDragEnd),window.addEventListener(\"contextmenu\",this.onDragEnd))},onLeftKeyDown:function(){this.disabled||(this.newPosition=parseFloat(this.currentPosition)-this.step/(this.max-this.min)*100,this.setPosition(this.newPosition))},onRightKeyDown:function(){this.disabled||(this.newPosition=parseFloat(this.currentPosition)+this.step/(this.max-this.min)*100,this.setPosition(this.newPosition))},onDragStart:function(e){this.dragging=!0,this.isClick=!0,\"touchstart\"===e.type&&(e.clientY=e.touches[0].clientY,e.clientX=e.touches[0].clientX),this.vertical?this.startY=e.clientY:this.startX=e.clientX,this.startPosition=parseFloat(this.currentPosition),this.newPosition=this.startPosition},onDragging:function(e){if(this.dragging){this.isClick=!1,this.displayTooltip(),this.$parent.resetSize();var t=0;\"touchmove\"===e.type&&(e.clientY=e.touches[0].clientY,e.clientX=e.touches[0].clientX),this.vertical?(this.currentY=e.clientY,t=(this.startY-this.currentY)/this.$parent.sliderSize*100):(this.currentX=e.clientX,t=(this.currentX-this.startX)/this.$parent.sliderSize*100),this.newPosition=this.startPosition+t,this.setPosition(this.newPosition)}},onDragEnd:function(){var e=this;this.dragging&&(setTimeout(function(){e.dragging=!1,e.hideTooltip(),e.isClick||(e.setPosition(e.newPosition),e.$parent.emitChange())},0),window.removeEventListener(\"mousemove\",this.onDragging),window.removeEventListener(\"touchmove\",this.onDragging),window.removeEventListener(\"mouseup\",this.onDragEnd),window.removeEventListener(\"touchend\",this.onDragEnd),window.removeEventListener(\"contextmenu\",this.onDragEnd))},setPosition:function(e){var t=this;if(null!==e&&!isNaN(e)){e<0?e=0:e>100&&(e=100);var i=100/((this.max-this.min)/this.step),n=Math.round(e/i),s=n*i*(this.max-this.min)*.01+this.min;s=parseFloat(s.toFixed(this.precision)),this.$emit(\"input\",s),this.$nextTick(function(){t.$refs.tooltip&&t.$refs.tooltip.updatePopper()}),this.dragging||this.value===this.oldValue||(this.oldValue=this.value)}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{ref:\"button\",staticClass:\"el-slider__button-wrapper\",class:{hover:e.hovering,dragging:e.dragging},style:e.wrapperStyle,attrs:{tabindex:\"0\"},on:{mouseenter:e.handleMouseEnter,mouseleave:e.handleMouseLeave,mousedown:e.onButtonDown,touchstart:e.onButtonDown,focus:e.handleMouseEnter,blur:e.handleMouseLeave,keydown:[function(t){return\"button\"in t||!e._k(t.keyCode,\"left\",37,t.key)?\"button\"in t&&0!==t.button?null:void e.onLeftKeyDown(t):null},function(t){return\"button\"in t||!e._k(t.keyCode,\"right\",39,t.key)?\"button\"in t&&2!==t.button?null:void e.onRightKeyDown(t):null},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"down\",40,t.key))return null;t.preventDefault(),e.onLeftKeyDown(t)},function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"up\",38,t.key))return null;t.preventDefault(),e.onRightKeyDown(t)}]}},[i(\"el-tooltip\",{ref:\"tooltip\",attrs:{placement:\"top\",\"popper-class\":e.tooltipClass,disabled:!e.showTooltip}},[i(\"span\",{attrs:{slot:\"content\"},slot:\"content\"},[e._v(e._s(e.formatValue))]),i(\"div\",{staticClass:\"el-slider__button\",class:{hover:e.hovering,dragging:e.dragging}})])],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-slider\",class:{\"is-vertical\":e.vertical,\"el-slider--with-input\":e.showInput},attrs:{role:\"slider\",\"aria-valuemin\":e.min,\"aria-valuemax\":e.max,\"aria-orientation\":e.vertical?\"vertical\":\"horizontal\",\"aria-disabled\":e.sliderDisabled}},[e.showInput&&!e.range?i(\"el-input-number\",{ref:\"input\",staticClass:\"el-slider__input\",attrs:{step:e.step,disabled:e.sliderDisabled,controls:e.showInputControls,min:e.min,max:e.max,debounce:e.debounce,size:e.inputSize},on:{change:function(t){e.$nextTick(e.emitChange)}},model:{value:e.firstValue,callback:function(t){e.firstValue=t},expression:\"firstValue\"}}):e._e(),i(\"div\",{ref:\"slider\",staticClass:\"el-slider__runway\",class:{\"show-input\":e.showInput,disabled:e.sliderDisabled},style:e.runwayStyle,on:{click:e.onSliderClick}},[i(\"div\",{staticClass:\"el-slider__bar\",style:e.barStyle}),i(\"slider-button\",{ref:\"button1\",attrs:{vertical:e.vertical,\"tooltip-class\":e.tooltipClass},model:{value:e.firstValue,callback:function(t){e.firstValue=t},expression:\"firstValue\"}}),e.range?i(\"slider-button\",{ref:\"button2\",attrs:{vertical:e.vertical,\"tooltip-class\":e.tooltipClass},model:{value:e.secondValue,callback:function(t){e.secondValue=t},expression:\"secondValue\"}}):e._e(),e._l(e.stops,function(t,n){return e.showStops?i(\"div\",{key:n,staticClass:\"el-slider__stop\",style:e.vertical?{bottom:t+\"%\"}:{left:t+\"%\"}}):e._e()})],2)],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(378),r=n(s),o=i(381),a=n(o);t.default={install:function(e){e.use(r.default),e.prototype.$loading=a.default},directive:r.default,service:a.default}},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(89),a=n(o),l=i(5),u=i(14),c=i(90),d=n(c),h=r.default.extend(a.default),f={};f.install=function(e){if(!e.prototype.$isServer){var t=function(t,n){n.value?e.nextTick(function(){n.modifiers.fullscreen?(t.originalPosition=(0,l.getStyle)(document.body,\"position\"),t.originalOverflow=(0,l.getStyle)(document.body,\"overflow\"),t.maskStyle.zIndex=u.PopupManager.nextZIndex(),(0,l.addClass)(t.mask,\"is-fullscreen\"),i(document.body,t,n)):((0,l.removeClass)(t.mask,\"is-fullscreen\"),n.modifiers.body?(t.originalPosition=(0,l.getStyle)(document.body,\"position\"),[\"top\",\"left\"].forEach(function(e){var i=\"top\"===e?\"scrollTop\":\"scrollLeft\";t.maskStyle[e]=t.getBoundingClientRect()[e]+document.body[i]+document.documentElement[i]-parseInt((0,l.getStyle)(document.body,\"margin-\"+e),10)+\"px\"}),[\"height\",\"width\"].forEach(function(e){t.maskStyle[e]=t.getBoundingClientRect()[e]+\"px\"}),i(document.body,t,n)):(t.originalPosition=(0,l.getStyle)(t,\"position\"),i(t,t,n)))}):((0,d.default)(t.instance,function(e){t.domVisible=!1;var i=n.modifiers.fullscreen||n.modifiers.body?document.body:t;(0,l.removeClass)(i,\"el-loading-parent--relative\"),(0,l.removeClass)(i,\"el-loading-parent--hidden\"),t.instance.hiding=!1},300,!0),t.instance.visible=!1,t.instance.hiding=!0)},i=function(t,i,n){i.domVisible||\"none\"===(0,l.getStyle)(i,\"display\")||\"hidden\"===(0,l.getStyle)(i,\"visibility\")||(Object.keys(i.maskStyle).forEach(function(e){i.mask.style[e]=i.maskStyle[e]}),\"absolute\"!==i.originalPosition&&\"fixed\"!==i.originalPosition&&(0,l.addClass)(t,\"el-loading-parent--relative\"),n.modifiers.fullscreen&&n.modifiers.lock&&(0,l.addClass)(t,\"el-loading-parent--hidden\"),i.domVisible=!0,t.appendChild(i.mask),e.nextTick(function(){i.instance.hiding?i.instance.$emit(\"after-leave\"):i.instance.visible=!0}),i.domInserted=!0)};e.directive(\"loading\",{bind:function(e,i,n){var s=e.getAttribute(\"element-loading-text\"),r=e.getAttribute(\"element-loading-spinner\"),o=e.getAttribute(\"element-loading-background\"),a=e.getAttribute(\"element-loading-custom-class\"),l=n.context,u=new h({el:document.createElement(\"div\"),data:{text:l&&l[s]||s,spinner:l&&l[r]||r,background:l&&l[o]||o,customClass:l&&l[a]||a,fullscreen:!!i.modifiers.fullscreen}});e.instance=u,e.mask=u.$el,e.maskStyle={},i.value&&t(e,i)},update:function(e,i){e.instance.setText(e.getAttribute(\"element-loading-text\")),i.oldValue!==i.value&&t(e,i)},unbind:function(e,i){e.domInserted&&(e.mask&&e.mask.parentNode&&e.mask.parentNode.removeChild(e.mask),t(e,{value:!1,modifiers:i.modifiers}))}})}},t.default=f},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={data:function(){return{text:null,spinner:null,background:null,fullscreen:!0,visible:!1,customClass:\"\"}},methods:{handleAfterLeave:function(){this.$emit(\"after-leave\")},setText:function(e){this.text=e}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-loading-fade\"},on:{\"after-leave\":e.handleAfterLeave}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],staticClass:\"el-loading-mask\",class:[e.customClass,{\"is-fullscreen\":e.fullscreen}],style:{backgroundColor:e.background||\"\"}},[i(\"div\",{staticClass:\"el-loading-spinner\"},[e.spinner?i(\"i\",{class:e.spinner}):i(\"svg\",{staticClass:\"circular\",attrs:{viewBox:\"25 25 50 50\"}},[i(\"circle\",{staticClass:\"path\",attrs:{cx:\"50\",cy:\"50\",r:\"20\",fill:\"none\"}})]),e.text?i(\"p\",{staticClass:\"el-loading-text\"},[e._v(e._s(e.text))]):e._e()])])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(89),a=n(o),l=i(5),u=i(14),c=i(90),d=n(c),h=i(10),f=n(h),p=r.default.extend(a.default),m={text:null,fullscreen:!0,body:!1,lock:!1,customClass:\"\"},v=void 0;p.prototype.originalPosition=\"\",p.prototype.originalOverflow=\"\",p.prototype.close=function(){var e=this;this.fullscreen&&(v=void 0),(0,d.default)(this,function(t){var i=e.fullscreen||e.body?document.body:e.target;(0,l.removeClass)(i,\"el-loading-parent--relative\"),(0,l.removeClass)(i,\"el-loading-parent--hidden\"),e.$el&&e.$el.parentNode&&e.$el.parentNode.removeChild(e.$el),e.$destroy()},300),this.visible=!1};var g=function(e,t,i){var n={};e.fullscreen?(i.originalPosition=(0,l.getStyle)(document.body,\"position\"),i.originalOverflow=(0,l.getStyle)(document.body,\"overflow\"),n.zIndex=u.PopupManager.nextZIndex()):e.body?(i.originalPosition=(0,l.getStyle)(document.body,\"position\"),[\"top\",\"left\"].forEach(function(t){var i=\"top\"===t?\"scrollTop\":\"scrollLeft\";n[t]=e.target.getBoundingClientRect()[t]+document.body[i]+document.documentElement[i]+\"px\"}),[\"height\",\"width\"].forEach(function(t){n[t]=e.target.getBoundingClientRect()[t]+\"px\"})):i.originalPosition=(0,l.getStyle)(t,\"position\"),Object.keys(n).forEach(function(e){i.$el.style[e]=n[e]})},b=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!r.default.prototype.$isServer){if(e=(0,f.default)({},m,e),\"string\"==typeof e.target&&(e.target=document.querySelector(e.target)),e.target=e.target||document.body,e.target!==document.body?e.fullscreen=!1:e.body=!0,e.fullscreen&&v)return v;var t=e.body?document.body:e.target,i=new p({el:document.createElement(\"div\"),data:e});return g(e,t,i),\"absolute\"!==i.originalPosition&&\"fixed\"!==i.originalPosition&&(0,l.addClass)(t,\"el-loading-parent--relative\"),e.fullscreen&&e.lock&&(0,l.addClass)(t,\"el-loading-parent--hidden\"),t.appendChild(i.$el),r.default.nextTick(function(){i.visible=!0}),e.fullscreen&&(v=i),i}};t.default=b},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(383),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(384),s=i.n(n),r=i(385),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElIcon\",props:{name:String}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"i\",{class:\"el-icon-\"+e.name})},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(387),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElRow\",componentName:\"ElRow\",props:{tag:{type:String,default:\"div\"},gutter:Number,type:String,justify:{type:String,default:\"start\"},align:{type:String,default:\"top\"}},computed:{style:function(){var e={};return this.gutter&&(e.marginLeft=\"-\"+this.gutter/2+\"px\",e.marginRight=e.marginLeft),e}},render:function(e){return e(this.tag,{class:[\"el-row\",\"start\"!==this.justify?\"is-justify-\"+this.justify:\"\",\"top\"!==this.align?\"is-align-\"+this.align:\"\",{\"el-row--flex\":\"flex\"===this.type}],style:this.style},this.$slots.default)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(389),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";t.__esModule=!0;var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};t.default={name:\"ElCol\",props:{span:{type:Number,default:24},tag:{type:String,default:\"div\"},offset:Number,pull:Number,push:Number,xs:[Number,Object],sm:[Number,Object],md:[Number,Object],lg:[Number,Object],xl:[Number,Object]},computed:{gutter:function(){for(var e=this.$parent;e&&\"ElRow\"!==e.$options.componentName;)e=e.$parent;return e?e.gutter:0}},render:function(e){var t=this,i=[],s={};return this.gutter&&(s.paddingLeft=this.gutter/2+\"px\",s.paddingRight=s.paddingLeft),[\"span\",\"offset\",\"pull\",\"push\"].forEach(function(e){(t[e]||0===t[e])&&i.push(\"span\"!==e?\"el-col-\"+e+\"-\"+t[e]:\"el-col-\"+t[e])}),[\"xs\",\"sm\",\"md\",\"lg\",\"xl\"].forEach(function(e){\"number\"==typeof t[e]?i.push(\"el-col-\"+e+\"-\"+t[e]):\"object\"===n(t[e])&&function(){var n=t[e];Object.keys(n).forEach(function(t){i.push(\"span\"!==t?\"el-col-\"+e+\"-\"+t+\"-\"+n[t]:\"el-col-\"+e+\"-\"+n[t])})}()}),e(this.tag,{class:[\"el-col\",i],style:s},this.$slots.default)}}},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(391),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(392),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}function s(){}t.__esModule=!0;var r=i(393),o=n(r),a=i(399),l=n(a),u=i(64),c=n(u),d=i(9),h=n(d);t.default={name:\"ElUpload\",mixins:[h.default],components:{ElProgress:c.default,UploadList:o.default,Upload:l.default},provide:function(){return{uploader:this}},inject:{elForm:{default:\"\"}},props:{action:{type:String,required:!0},headers:{type:Object,default:function(){return{}}},data:Object,multiple:Boolean,name:{type:String,default:\"file\"},drag:Boolean,dragger:Boolean,withCredentials:Boolean,showFileList:{type:Boolean,default:!0},accept:String,type:{type:String,default:\"select\"},beforeUpload:Function,beforeRemove:Function,onRemove:{type:Function,default:s},onChange:{type:Function,default:s},onPreview:{type:Function},onSuccess:{type:Function,default:s},onProgress:{type:Function,default:s},onError:{type:Function,default:s},fileList:{type:Array,default:function(){return[]}},autoUpload:{type:Boolean,default:!0},listType:{type:String,default:\"text\"},httpRequest:Function,disabled:Boolean,limit:Number,onExceed:{type:Function,default:s}},data:function(){return{uploadFiles:[],dragOver:!1,draging:!1,tempIndex:1}},computed:{uploadDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},watch:{fileList:{immediate:!0,handler:function(e){var t=this;this.uploadFiles=e.map(function(e){return e.uid=e.uid||Date.now()+t.tempIndex++,e.status=e.status||\"success\",e})}}},methods:{handleStart:function(e){e.uid=Date.now()+this.tempIndex++;var t={status:\"ready\",name:e.name,size:e.size,percentage:0,uid:e.uid,raw:e};if(\"picture-card\"===this.listType||\"picture\"===this.listType)try{t.url=URL.createObjectURL(e)}catch(e){return void console.error(\"[Element Error][Upload]\",e)}this.uploadFiles.push(t),this.onChange(t,this.uploadFiles)},handleProgress:function(e,t){var i=this.getFile(t);this.onProgress(e,i,this.uploadFiles),i.status=\"uploading\",i.percentage=e.percent||0},handleSuccess:function(e,t){var i=this.getFile(t);i&&(i.status=\"success\",i.response=e,this.onSuccess(e,i,this.uploadFiles),this.onChange(i,this.uploadFiles))},handleError:function(e,t){var i=this.getFile(t),n=this.uploadFiles;i.status=\"fail\",n.splice(n.indexOf(i),1),this.onError(e,i,this.uploadFiles),this.onChange(i,this.uploadFiles)},handleRemove:function(e,t){var i=this;t&&(e=this.getFile(t));var n=function(){i.abort(e);var t=i.uploadFiles;t.splice(t.indexOf(e),1),i.onRemove(e,t)};if(this.beforeRemove){if(\"function\"==typeof this.beforeRemove){var r=this.beforeRemove(e,this.uploadFiles);r&&r.then?r.then(function(){n()},s):!1!==r&&n()}}else n()},getFile:function(e){var t=this.uploadFiles,i=void 0;return t.every(function(t){return!(i=e.uid===t.uid?t:null)}),i},abort:function(e){this.$refs[\"upload-inner\"].abort(e)},clearFiles:function(){this.uploadFiles=[]},submit:function(){var e=this;this.uploadFiles.filter(function(e){return\"ready\"===e.status}).forEach(function(t){e.$refs[\"upload-inner\"].upload(t.raw)})},getMigratingConfig:function(){return{props:{\"default-file-list\":\"default-file-list is renamed to file-list.\",\"show-upload-list\":\"show-upload-list is renamed to show-file-list.\",\"thumbnail-mode\":\"thumbnail-mode has been deprecated, you can implement the same effect according to this case: http://element.eleme.io/#/zh-CN/component/upload#yong-hu-tou-xiang-shang-chuan\"}}}},beforeDestroy:function(){this.uploadFiles.forEach(function(e){e.url&&0===e.url.indexOf(\"blob:\")&&URL.revokeObjectURL(e.url)})},render:function(e){var t=void 0;this.showFileList&&(t=e(o.default,{attrs:{disabled:this.uploadDisabled,listType:this.listType,files:this.uploadFiles,handlePreview:this.onPreview},on:{remove:this.handleRemove}},[]));var i={props:{type:this.type,drag:this.drag,action:this.action,multiple:this.multiple,\"before-upload\":this.beforeUpload,\"with-credentials\":this.withCredentials,headers:this.headers,name:this.name,data:this.data,accept:this.accept,fileList:this.uploadFiles,autoUpload:this.autoUpload,listType:this.listType,disabled:this.uploadDisabled,limit:this.limit,\"on-exceed\":this.onExceed,\"on-start\":this.handleStart,\"on-progress\":this.handleProgress,\"on-success\":this.handleSuccess,\"on-error\":this.handleError,\"on-preview\":this.onPreview,\"on-remove\":this.handleRemove,\"http-request\":this.httpRequest},ref:\"upload-inner\"},n=this.$slots.trigger||this.$slots.default,s=e(\"upload\",i,[n]);return e(\"div\",null,[\"picture-card\"===this.listType?t:\"\",this.$slots.trigger?[s,this.$slots.default]:s,this.$slots.tip,\"picture-card\"!==this.listType?t:\"\"])}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(394),s=i.n(n),r=i(398),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(6),r=n(s),o=i(64),a=n(o);t.default={name:\"ElUploadList\",mixins:[r.default],data:function(){return{focusing:!1}},components:{ElProgress:a.default},props:{files:{type:Array,default:function(){return[]}},disabled:{type:Boolean,default:!1},handlePreview:Function,listType:String},methods:{parsePercentage:function(e){return parseInt(e,10)},handleClick:function(e){this.handlePreview&&this.handlePreview(e)}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(396),s=i.n(n),r=i(397),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElProgress\",props:{type:{type:String,default:\"line\",validator:function(e){return[\"line\",\"circle\"].indexOf(e)>-1}},percentage:{type:Number,default:0,required:!0,validator:function(e){return e>=0&&e<=100}},status:{type:String,validator:function(e){return[\"text\",\"success\",\"exception\"].indexOf(e)>-1}},strokeWidth:{type:Number,default:6},textInside:{type:Boolean,default:!1},width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:String,default:\"\"}},computed:{barStyle:function(){var e={};return e.width=this.percentage+\"%\",e.backgroundColor=this.color,e},relativeStrokeWidth:function(){return(this.strokeWidth/this.width*100).toFixed(1)},trackPath:function(){var e=parseInt(50-parseFloat(this.relativeStrokeWidth)/2,10);return\"M 50 50 m 0 -\"+e+\" a \"+e+\" \"+e+\" 0 1 1 0 \"+2*e+\" a \"+e+\" \"+e+\" 0 1 1 0 -\"+2*e},perimeter:function(){var e=50-parseFloat(this.relativeStrokeWidth)/2;return 2*Math.PI*e},circlePathStyle:function(){var e=this.perimeter;return{strokeDasharray:e+\"px,\"+e+\"px\",strokeDashoffset:(1-this.percentage/100)*e+\"px\",transition:\"stroke-dashoffset 0.6s ease 0s, stroke 0.6s ease\"}},stroke:function(){var e=void 0;if(this.color)e=this.color;else switch(this.status){case\"success\":e=\"#13ce66\";break;case\"exception\":e=\"#ff4949\";break;default:e=\"#20a0ff\"}return e},iconClass:function(){return\"line\"===this.type?\"success\"===this.status?\"el-icon-circle-check\":\"el-icon-circle-close\":\"success\"===this.status?\"el-icon-check\":\"el-icon-close\"},progressTextSize:function(){return\"line\"===this.type?12+.4*this.strokeWidth:.111111*this.width+2}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-progress\",class:[\"el-progress--\"+e.type,e.status?\"is-\"+e.status:\"\",{\"el-progress--without-text\":!e.showText,\"el-progress--text-inside\":e.textInside}],attrs:{role:\"progressbar\",\"aria-valuenow\":e.percentage,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}},[\"line\"===e.type?i(\"div\",{staticClass:\"el-progress-bar\"},[i(\"div\",{staticClass:\"el-progress-bar__outer\",style:{height:e.strokeWidth+\"px\"}},[i(\"div\",{staticClass:\"el-progress-bar__inner\",style:e.barStyle},[e.showText&&e.textInside?i(\"div\",{staticClass:\"el-progress-bar__innerText\"},[e._v(e._s(e.percentage)+\"%\")]):e._e()])])]):i(\"div\",{staticClass:\"el-progress-circle\",style:{height:e.width+\"px\",width:e.width+\"px\"}},[i(\"svg\",{attrs:{viewBox:\"0 0 100 100\"}},[i(\"path\",{staticClass:\"el-progress-circle__track\",attrs:{d:e.trackPath,stroke:\"#e5e9f2\",\"stroke-width\":e.relativeStrokeWidth,fill:\"none\"}}),i(\"path\",{staticClass:\"el-progress-circle__path\",style:e.circlePathStyle,attrs:{d:e.trackPath,\"stroke-linecap\":\"round\",stroke:e.stroke,\"stroke-width\":e.relativeStrokeWidth,fill:\"none\"}})])]),e.showText&&!e.textInside?i(\"div\",{staticClass:\"el-progress__text\",style:{fontSize:e.progressTextSize+\"px\"}},[e.status?[\"text\"===e.status?e._t(\"default\"):i(\"i\",{class:e.iconClass})]:[e._v(e._s(e.percentage)+\"%\")]],2):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition-group\",{class:[\"el-upload-list\",\"el-upload-list--\"+e.listType,{\"is-disabled\":e.disabled}],attrs:{tag:\"ul\",name:\"el-list\"}},e._l(e.files,function(t){return i(\"li\",{key:t.uid,class:[\"el-upload-list__item\",\"is-\"+t.status,e.focusing?\"focusing\":\"\"],attrs:{tabindex:\"0\"},on:{keydown:function(i){if(!(\"button\"in i)&&e._k(i.keyCode,\"delete\",[8,46],i.key))return null;!e.disabled&&e.$emit(\"remove\",t)},focus:function(t){e.focusing=!0},blur:function(t){e.focusing=!1},click:function(t){e.focusing=!1}}},[\"uploading\"!==t.status&&[\"picture-card\",\"picture\"].indexOf(e.listType)>-1?i(\"img\",{staticClass:\"el-upload-list__item-thumbnail\",attrs:{src:t.url,alt:\"\"}}):e._e(),i(\"a\",{staticClass:\"el-upload-list__item-name\",on:{click:function(i){e.handleClick(t)}}},[i(\"i\",{staticClass:\"el-icon-document\"}),e._v(e._s(t.name)+\"\\n    \")]),i(\"label\",{staticClass:\"el-upload-list__item-status-label\"},[i(\"i\",{class:{\"el-icon-upload-success\":!0,\"el-icon-circle-check\":\"text\"===e.listType,\"el-icon-check\":[\"picture-card\",\"picture\"].indexOf(e.listType)>-1}})]),e.disabled?e._e():i(\"i\",{staticClass:\"el-icon-close\",on:{click:function(i){e.$emit(\"remove\",t)}}}),e.disabled?e._e():i(\"i\",{staticClass:\"el-icon-close-tip\"},[e._v(e._s(e.t(\"el.upload.deleteTip\")))]),\"uploading\"===t.status?i(\"el-progress\",{attrs:{type:\"picture-card\"===e.listType?\"circle\":\"line\",\"stroke-width\":\"picture-card\"===e.listType?6:2,percentage:e.parsePercentage(t.percentage)}}):e._e(),\"picture-card\"===e.listType?i(\"span\",{staticClass:\"el-upload-list__item-actions\"},[e.handlePreview&&\"picture-card\"===e.listType?i(\"span\",{staticClass:\"el-upload-list__item-preview\",on:{click:function(i){e.handlePreview(t)}}},[i(\"i\",{staticClass:\"el-icon-zoom-in\"})]):e._e(),e.disabled?e._e():i(\"span\",{staticClass:\"el-upload-list__item-delete\",on:{click:function(i){e.$emit(\"remove\",t)}}},[i(\"i\",{staticClass:\"el-icon-delete\"})])]):e._e()],1)}))},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(400),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(91),r=n(s),o=i(401),a=n(o),l=i(402),u=n(l);t.default={inject:[\"uploader\"],components:{UploadDragger:u.default},props:{type:String,action:{type:String,required:!0},name:{type:String,default:\"file\"},data:Object,headers:Object,withCredentials:Boolean,multiple:Boolean,accept:String,onStart:Function,onProgress:Function,onSuccess:Function,onError:Function,beforeUpload:Function,drag:Boolean,onPreview:{type:Function,default:function(){}},onRemove:{type:Function,default:function(){}},fileList:Array,autoUpload:Boolean,listType:String,httpRequest:{type:Function,default:a.default},disabled:Boolean,limit:Number,onExceed:Function},data:function(){return{mouseover:!1,reqs:{}}},methods:{isImage:function(e){return-1!==e.indexOf(\"image\")},handleChange:function(e){var t=e.target.files;t&&this.uploadFiles(t)},uploadFiles:function(e){var t=this;if(this.limit&&this.fileList.length+e.length>this.limit)return void(this.onExceed&&this.onExceed(e,this.fileList));var i=Array.prototype.slice.call(e);this.multiple||(i=i.slice(0,1)),0!==i.length&&i.forEach(function(e){t.onStart(e),t.autoUpload&&t.upload(e)})},upload:function(e){var t=this;if(this.$refs.input.value=null,!this.beforeUpload)return this.post(e);var i=this.beforeUpload(e);i&&i.then?i.then(function(i){var n=Object.prototype.toString.call(i);if(\"[object File]\"===n||\"[object Blob]\"===n){\"[object Blob]\"===n&&(i=new File([i],e.name,{type:e.type}));for(var s in e)e.hasOwnProperty(s)&&(i[s]=e[s]);t.post(i)}else t.post(e)},function(){t.onRemove(null,e)}):!1!==i?this.post(e):this.onRemove(null,e)},abort:function(e){var t=this.reqs;if(e){var i=e;e.uid&&(i=e.uid),t[i]&&t[i].abort()}else Object.keys(t).forEach(function(e){t[e]&&t[e].abort(),delete t[e]})},post:function(e){var t=this,i=e.uid,n={headers:this.headers,withCredentials:this.withCredentials,file:e,data:this.data,filename:this.name,action:this.action,onProgress:function(i){t.onProgress(i,e)},onSuccess:function(n){t.onSuccess(n,e),delete t.reqs[i]},onError:function(n){t.onError(n,e),delete t.reqs[i]}},s=this.httpRequest(n);this.reqs[i]=s,s&&s.then&&s.then(n.onSuccess,n.onError)},handleClick:function(){this.disabled||(this.$refs.input.value=null,this.$refs.input.click())},handleKeydown:function(e){e.target===e.currentTarget&&(13!==e.keyCode&&32!==e.keyCode||this.handleClick())}},render:function(e){var t=this.handleClick,i=this.drag,n=this.name,s=this.handleChange,o=this.multiple,a=this.accept,l=this.listType,u=this.uploadFiles,c=this.disabled,d=this.handleKeydown,h={class:{\"el-upload\":!0},on:{click:t,keydown:d}};return h.class[\"el-upload--\"+l]=!0,e(\"div\",(0,r.default)([h,{attrs:{tabindex:\"0\"}}]),[i?e(\"upload-dragger\",{attrs:{disabled:c},on:{file:u}},[this.$slots.default]):this.$slots.default,e(\"input\",{class:\"el-upload__input\",attrs:{type:\"file\",name:n,multiple:o,accept:a},ref:\"input\",on:{change:s}},[])])}}},function(e,t,i){\"use strict\";function n(e,t,i){var n=void 0;n=i.response?\"\"+(i.response.error||i.response):i.responseText?\"\"+i.responseText:\"fail to post \"+e+\" \"+i.status;var s=new Error(n);return s.status=i.status,s.method=\"post\",s.url=e,s}function s(e){var t=e.responseText||e.response;if(!t)return t;try{return JSON.parse(t)}catch(e){return t}}function r(e){if(\"undefined\"!=typeof XMLHttpRequest){var t=new XMLHttpRequest,i=e.action;t.upload&&(t.upload.onprogress=function(t){t.total>0&&(t.percent=t.loaded/t.total*100),e.onProgress(t)});var r=new FormData;e.data&&Object.keys(e.data).forEach(function(t){r.append(t,e.data[t])}),r.append(e.filename,e.file,e.file.name),t.onerror=function(t){e.onError(t)},t.onload=function(){if(t.status<200||t.status>=300)return e.onError(n(i,e,t));e.onSuccess(s(t))},t.open(\"post\",i,!0),e.withCredentials&&\"withCredentials\"in t&&(t.withCredentials=!0);var o=e.headers||{};for(var a in o)o.hasOwnProperty(a)&&null!==o[a]&&t.setRequestHeader(a,o[a]);return t.send(r),t}}t.__esModule=!0,t.default=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(403),s=i.n(n),r=i(404),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElUploadDrag\",props:{disabled:Boolean},inject:{uploader:{default:\"\"}},data:function(){return{dragover:!1}},methods:{onDragover:function(){this.disabled||(this.dragover=!0)},onDrop:function(e){if(!this.disabled&&this.uploader){var t=this.uploader.accept;if(this.dragover=!1,!t)return void this.$emit(\"file\",e.dataTransfer.files);this.$emit(\"file\",[].slice.call(e.dataTransfer.files).filter(function(e){var i=e.type,n=e.name,s=n.indexOf(\".\")>-1?\".\"+n.split(\".\").pop():\"\",r=i.replace(/\\/.*$/,\"\");return t.split(\",\").map(function(e){return e.trim()}).filter(function(e){return e}).some(function(e){return/\\..+$/.test(e)?s===e:/\\/\\*$/.test(e)?r===e.replace(/\\/\\*$/,\"\"):!!/^[^\\/]+\\/[^\\/]+$/.test(e)&&i===e})}))}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-upload-dragger\",class:{\"is-dragover\":e.dragover},on:{drop:function(t){t.preventDefault(),e.onDrop(t)},dragover:function(t){t.preventDefault(),e.onDragover(t)},dragleave:function(t){t.preventDefault(),e.dragover=!1}}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(406),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(407),s=i.n(n),r=i(408),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElSpinner\",props:{type:String,radius:{type:Number,default:100},strokeWidth:{type:Number,default:5},strokeColor:{type:String,default:\"#efefef\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"span\",{staticClass:\"el-spinner\"},[i(\"svg\",{staticClass:\"el-spinner-inner\",style:{width:e.radius/2+\"px\",height:e.radius/2+\"px\"},attrs:{viewBox:\"0 0 50 50\"}},[i(\"circle\",{staticClass:\"path\",attrs:{cx:\"25\",cy:\"25\",r:\"20\",fill:\"none\",stroke:e.strokeColor,\"stroke-width\":e.strokeWidth}})])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(410),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default=s.default},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(411),a=n(o),l=i(14),u=i(34),c=r.default.extend(a.default),d=void 0,h=[],f=1,p=function e(t){if(!r.default.prototype.$isServer){t=t||{},\"string\"==typeof t&&(t={message:t});var i=t.onClose,n=\"message_\"+f++;return t.onClose=function(){e.close(n,i)},d=new c({data:t}),d.id=n,(0,u.isVNode)(d.message)&&(d.$slots.default=[d.message],d.message=null),d.vm=d.$mount(),document.body.appendChild(d.vm.$el),d.vm.visible=!0,d.dom=d.vm.$el,d.dom.style.zIndex=l.PopupManager.nextZIndex(),h.push(d),d.vm}};[\"success\",\"warning\",\"info\",\"error\"].forEach(function(e){p[e]=function(t){return\"string\"==typeof t&&(t={message:t}),t.type=e,p(t)}}),p.close=function(e,t){for(var i=0,n=h.length;i<n;i++)if(e===h[i].id){\"function\"==typeof t&&t(h[i]),h.splice(i,1);break}},p.closeAll=function(){for(var e=h.length-1;e>=0;e--)h[e].close()},t.default=p},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(412),s=i.n(n),r=i(413),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n={success:\"success\",info:\"info\",warning:\"warning\",error:\"error\"};t.default={data:function(){return{visible:!1,message:\"\",duration:3e3,type:\"info\",iconClass:\"\",customClass:\"\",onClose:null,showClose:!1,closed:!1,timer:null,dangerouslyUseHTMLString:!1,center:!1}},computed:{typeClass:function(){return this.type&&!this.iconClass?\"el-message__icon el-icon-\"+n[this.type]:\"\"}},watch:{closed:function(e){e&&(this.visible=!1,this.$el.addEventListener(\"transitionend\",this.destroyElement))}},methods:{destroyElement:function(){this.$el.removeEventListener(\"transitionend\",this.destroyElement),this.$destroy(!0),this.$el.parentNode.removeChild(this.$el)},close:function(){this.closed=!0,\"function\"==typeof this.onClose&&this.onClose(this)},clearTimer:function(){clearTimeout(this.timer)},startTimer:function(){var e=this;this.duration>0&&(this.timer=setTimeout(function(){e.closed||e.close()},this.duration))},keydown:function(e){27===e.keyCode&&(this.closed||this.close())}},mounted:function(){this.startTimer(),document.addEventListener(\"keydown\",this.keydown)},beforeDestroy:function(){document.removeEventListener(\"keydown\",this.keydown)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-message-fade\"}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.visible,expression:\"visible\"}],class:[\"el-message\",e.type&&!e.iconClass?\"el-message--\"+e.type:\"\",e.center?\"is-center\":\"\",e.showClose?\"is-closable\":\"\",e.customClass],attrs:{role:\"alert\"},on:{mouseenter:e.clearTimer,mouseleave:e.startTimer}},[e.iconClass?i(\"i\",{class:e.iconClass}):i(\"i\",{class:e.typeClass}),e._t(\"default\",[e.dangerouslyUseHTMLString?i(\"p\",{staticClass:\"el-message__content\",domProps:{innerHTML:e._s(e.message)}}):i(\"p\",{staticClass:\"el-message__content\"},[e._v(e._s(e.message))])]),e.showClose?i(\"i\",{staticClass:\"el-message__closeBtn el-icon-close\",on:{click:e.close}}):e._e()],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(415),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(416),s=i.n(n),r=i(417),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElBadge\",props:{value:{},max:Number,isDot:Boolean,hidden:Boolean,type:{type:String,validator:function(e){return[\"primary\",\"success\",\"warning\",\"info\",\"danger\"].indexOf(e)>-1}}},computed:{content:function(){if(!this.isDot){var e=this.value,t=this.max;return\"number\"==typeof e&&\"number\"==typeof t&&t<e?t+\"+\":e}}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-badge\"},[e._t(\"default\"),i(\"transition\",{attrs:{name:\"el-zoom-in-center\"}},[i(\"sup\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.hidden&&(e.content||0===e.content||e.isDot),expression:\"!hidden && (content || content === 0 || isDot)\"}],staticClass:\"el-badge__content\",class:[\"el-badge__content--\"+e.type,{\"is-fixed\":e.$slots.default,\"is-dot\":e.isDot}],domProps:{textContent:e._s(e.content)}})])],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(419),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(420),s=i.n(n),r=i(421),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElCard\",props:{header:{},bodyStyle:{},shadow:{type:String}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-card\",class:e.shadow?\"is-\"+e.shadow+\"-shadow\":\"is-always-shadow\"},[e.$slots.header||e.header?i(\"div\",{staticClass:\"el-card__header\"},[e._t(\"header\",[e._v(e._s(e.header))])],2):e._e(),i(\"div\",{staticClass:\"el-card__body\",style:e.bodyStyle},[e._t(\"default\")],2)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(423),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(424),s=i.n(n),r=i(425),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(5),s=i(9),r=function(e){return e&&e.__esModule?e:{default:e}}(s);t.default={name:\"ElRate\",mixins:[r.default],inject:{elForm:{default:\"\"}},data:function(){return{pointerAtLeftHalf:!0,currentValue:this.value,hoverIndex:-1}},props:{value:{type:Number,default:0},lowThreshold:{type:Number,default:2},highThreshold:{type:Number,default:4},max:{type:Number,default:5},colors:{type:Array,default:function(){return[\"#F7BA2A\",\"#F7BA2A\",\"#F7BA2A\"]}},voidColor:{type:String,default:\"#C6D1DE\"},disabledVoidColor:{type:String,default:\"#EFF2F7\"},iconClasses:{type:Array,default:function(){return[\"el-icon-star-on\",\"el-icon-star-on\",\"el-icon-star-on\"]}},voidIconClass:{type:String,default:\"el-icon-star-off\"},disabledVoidIconClass:{type:String,default:\"el-icon-star-on\"},disabled:{type:Boolean,default:!1},allowHalf:{type:Boolean,default:!1},showText:{type:Boolean,default:!1},showScore:{type:Boolean,default:!1},textColor:{type:String,default:\"#1f2d3d\"},texts:{type:Array,default:function(){return[\"极差\",\"失望\",\"一般\",\"满意\",\"惊喜\"]}},scoreTemplate:{type:String,default:\"{value}\"}},computed:{text:function(){var e=\"\";return this.showScore?e=this.scoreTemplate.replace(/\\{\\s*value\\s*\\}/,this.rateDisabled?this.value:this.currentValue):this.showText&&(e=this.texts[Math.ceil(this.currentValue)-1]),e},decimalStyle:function(){var e=\"\";return this.rateDisabled&&(e=(this.valueDecimal<50?0:50)+\"%\"),this.allowHalf&&(e=\"50%\"),{color:this.activeColor,width:e}},valueDecimal:function(){return 100*this.value-100*Math.floor(this.value)},decimalIconClass:function(){return this.getValueFromMap(this.value,this.classMap)},voidClass:function(){return this.rateDisabled?this.classMap.disabledVoidClass:this.classMap.voidClass},activeClass:function(){return this.getValueFromMap(this.currentValue,this.classMap)},colorMap:function(){return{lowColor:this.colors[0],mediumColor:this.colors[1],highColor:this.colors[2],voidColor:this.voidColor,disabledVoidColor:this.disabledVoidColor}},activeColor:function(){return this.getValueFromMap(this.currentValue,this.colorMap)},classes:function(){var e=[],t=0,i=this.currentValue;for(this.allowHalf&&this.currentValue!==Math.floor(this.currentValue)&&i--;t<i;t++)e.push(this.activeClass);for(;t<this.max;t++)e.push(this.voidClass);return e},classMap:function(){return{lowClass:this.iconClasses[0],mediumClass:this.iconClasses[1],highClass:this.iconClasses[2],voidClass:this.voidIconClass,disabledVoidClass:this.disabledVoidIconClass}},rateDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},watch:{value:function(e){this.currentValue=e,this.pointerAtLeftHalf=this.value!==Math.floor(this.value)}},methods:{getMigratingConfig:function(){return{props:{\"text-template\":\"text-template is renamed to score-template.\"}}},getValueFromMap:function(e,t){return e<=this.lowThreshold?t.lowColor||t.lowClass:e>=this.highThreshold?t.highColor||t.highClass:t.mediumColor||t.mediumClass},showDecimalIcon:function(e){var t=this.rateDisabled&&this.valueDecimal>0&&e-1<this.value&&e>this.value,i=this.allowHalf&&this.pointerAtLeftHalf&&e-.5<=this.currentValue&&e>this.currentValue;return t||i},getIconStyle:function(e){var t=this.rateDisabled?this.colorMap.disabledVoidColor:this.colorMap.voidColor;return{color:e<=this.currentValue?this.activeColor:t}},selectValue:function(e){this.rateDisabled||(this.allowHalf&&this.pointerAtLeftHalf?(this.$emit(\"input\",this.currentValue),this.$emit(\"change\",this.currentValue)):(this.$emit(\"input\",e),this.$emit(\"change\",e)))},handleKey:function(e){if(!this.rateDisabled){var t=this.currentValue,i=e.keyCode;38===i||39===i?(this.allowHalf?t+=.5:t+=1,e.stopPropagation(),e.preventDefault()):37!==i&&40!==i||(this.allowHalf?t-=.5:t-=1,e.stopPropagation(),e.preventDefault()),t=t<0?0:t,t=t>this.max?this.max:t,this.$emit(\"input\",t),this.$emit(\"change\",t)}},setCurrentValue:function(e,t){if(!this.rateDisabled){if(this.allowHalf){var i=t.target;(0,n.hasClass)(i,\"el-rate__item\")&&(i=i.querySelector(\".el-rate__icon\")),(0,n.hasClass)(i,\"el-rate__decimal\")&&(i=i.parentNode),this.pointerAtLeftHalf=2*t.offsetX<=i.clientWidth,this.currentValue=this.pointerAtLeftHalf?e-.5:e}else this.currentValue=e;this.hoverIndex=e}},resetCurrentValue:function(){this.rateDisabled||(this.allowHalf&&(this.pointerAtLeftHalf=this.value!==Math.floor(this.value)),this.currentValue=this.value,this.hoverIndex=-1)}},created:function(){this.value||this.$emit(\"input\",0)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-rate\",attrs:{role:\"slider\",\"aria-valuenow\":e.currentValue,\"aria-valuetext\":e.text,\"aria-valuemin\":\"0\",\"aria-valuemax\":e.max,tabindex:\"0\"},on:{keydown:e.handleKey}},[e._l(e.max,function(t,n){return i(\"span\",{key:n,staticClass:\"el-rate__item\",style:{cursor:e.rateDisabled?\"auto\":\"pointer\"},on:{mousemove:function(i){e.setCurrentValue(t,i)},mouseleave:e.resetCurrentValue,click:function(i){e.selectValue(t)}}},[i(\"i\",{staticClass:\"el-rate__icon\",class:[e.classes[t-1],{hover:e.hoverIndex===t}],style:e.getIconStyle(t)},[e.showDecimalIcon(t)?i(\"i\",{staticClass:\"el-rate__decimal\",class:e.decimalIconClass,style:e.decimalStyle}):e._e()])])}),e.showText||e.showScore?i(\"span\",{staticClass:\"el-rate__text\",style:{color:e.textColor}},[e._v(e._s(e.text))]):e._e()],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(427),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(428),s=i.n(n),r=i(429),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(9),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"ElSteps\",mixins:[s.default],props:{space:[Number,String],active:Number,direction:{type:String,default:\"horizontal\"},alignCenter:Boolean,simple:Boolean,finishStatus:{type:String,default:\"finish\"},processStatus:{type:String,default:\"process\"}},data:function(){return{steps:[],stepOffset:0}},methods:{getMigratingConfig:function(){return{props:{center:\"center is removed.\"}}}},watch:{active:function(e,t){this.$emit(\"change\",e,t)},steps:function(e){e.forEach(function(e,t){e.index=t})}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-steps\",class:[!e.simple&&\"el-steps--\"+e.direction,e.simple&&\"el-steps--simple\"]},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(431),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(432),s=i.n(n),r=i(433),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElStep\",props:{title:String,icon:String,description:String,status:String},data:function(){return{index:-1,lineStyle:{},internalStatus:\"\"}},beforeCreate:function(){this.$parent.steps.push(this)},beforeDestroy:function(){var e=this.$parent.steps,t=e.indexOf(this);t>=0&&e.splice(t,1)},computed:{currentStatus:function(){return this.status||this.internalStatus},prevStatus:function(){var e=this.$parent.steps[this.index-1];return e?e.currentStatus:\"wait\"},isCenter:function(){return this.$parent.alignCenter},isVertical:function(){return\"vertical\"===this.$parent.direction},isSimple:function(){return this.$parent.simple},isLast:function(){var e=this.$parent;return e.steps[e.steps.length-1]===this},stepsCount:function(){return this.$parent.steps.length},space:function(){var e=this.isSimple,t=this.$parent.space;return e?\"\":t},style:function(){var e={},t=this.$parent,i=t.steps.length,n=\"number\"==typeof this.space?this.space+\"px\":this.space?this.space:100/(i-(this.isCenter?0:1))+\"%\";return e.flexBasis=n,this.isVertical?e:(this.isLast?e.maxWidth=100/this.stepsCount+\"%\":e.marginRight=-this.$parent.stepOffset+\"px\",e)}},methods:{updateStatus:function(e){var t=this.$parent.$children[this.index-1];e>this.index?this.internalStatus=this.$parent.finishStatus:e===this.index&&\"error\"!==this.prevStatus?this.internalStatus=this.$parent.processStatus:this.internalStatus=\"wait\",t&&t.calcProgress(this.internalStatus)},calcProgress:function(e){var t=100,i={};i.transitionDelay=150*this.index+\"ms\",e===this.$parent.processStatus?(this.currentStatus,t=0):\"wait\"===e&&(t=0,i.transitionDelay=-150*this.index+\"ms\"),i.borderWidth=t?\"1px\":0,\"vertical\"===this.$parent.direction?i.height=t+\"%\":i.width=t+\"%\",this.lineStyle=i}},mounted:function(){var e=this,t=this.$watch(\"index\",function(i){e.$watch(\"$parent.active\",e.updateStatus,{immediate:!0}),t()})}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-step\",class:[!e.isSimple&&\"is-\"+e.$parent.direction,e.isSimple&&\"is-simple\",e.isLast&&!e.space&&!e.isCenter&&\"is-flex\",e.isCenter&&!e.isVertical&&!e.isSimple&&\"is-center\"],style:e.style},[i(\"div\",{staticClass:\"el-step__head\",class:\"is-\"+e.currentStatus},[i(\"div\",{staticClass:\"el-step__line\",style:e.isLast?\"\":{marginRight:e.$parent.stepOffset+\"px\"}},[i(\"i\",{staticClass:\"el-step__line-inner\",style:e.lineStyle})]),i(\"div\",{staticClass:\"el-step__icon\",class:\"is-\"+(e.icon?\"icon\":\"text\")},[\"success\"!==e.currentStatus&&\"error\"!==e.currentStatus?e._t(\"icon\",[e.icon?i(\"i\",{staticClass:\"el-step__icon-inner\",class:[e.icon]}):e._e(),e.icon||e.isSimple?e._e():i(\"div\",{staticClass:\"el-step__icon-inner\"},[e._v(e._s(e.index+1))])]):i(\"i\",{staticClass:\"el-step__icon-inner is-status\",class:[\"el-icon-\"+(\"success\"===e.currentStatus?\"check\":\"close\")]})],2)]),i(\"div\",{staticClass:\"el-step__main\"},[i(\"div\",{ref:\"title\",staticClass:\"el-step__title\",class:[\"is-\"+e.currentStatus]},[e._t(\"title\",[e._v(e._s(e.title))])],2),e.isSimple?i(\"div\",{staticClass:\"el-step__arrow\"}):i(\"div\",{staticClass:\"el-step__description\",class:[\"is-\"+e.currentStatus]},[e._t(\"description\",[e._v(e._s(e.description))])],2)])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(435),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(436),s=i.n(n),r=i(437),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(68),s=function(e){return e&&e.__esModule?e:{default:e}}(n),r=i(27);t.default={name:\"ElCarousel\",props:{initialIndex:{type:Number,default:0},height:String,trigger:{type:String,default:\"hover\"},autoplay:{type:Boolean,default:!0},interval:{type:Number,default:3e3},indicatorPosition:String,indicator:{type:Boolean,default:!0},arrow:{type:String,default:\"hover\"},type:String,loop:{type:Boolean,default:!0}},data:function(){return{items:[],activeIndex:-1,containerWidth:0,timer:null,hover:!1}},computed:{hasLabel:function(){return this.items.some(function(e){return e.label.toString().length>0})}},watch:{items:function(e){e.length>0&&this.setActiveItem(this.initialIndex)},activeIndex:function(e,t){this.resetItemPosition(t),this.$emit(\"change\",e,t)},autoplay:function(e){e?this.startTimer():this.pauseTimer()},loop:function(){this.setActiveItem(this.activeIndex)}},methods:{handleMouseEnter:function(){this.hover=!0,this.pauseTimer()},handleMouseLeave:function(){this.hover=!1,this.startTimer()},itemInStage:function(e,t){var i=this.items.length;return t===i-1&&e.inStage&&this.items[0].active||e.inStage&&this.items[t+1]&&this.items[t+1].active?\"left\":!!(0===t&&e.inStage&&this.items[i-1].active||e.inStage&&this.items[t-1]&&this.items[t-1].active)&&\"right\"},handleButtonEnter:function(e){var t=this;this.items.forEach(function(i,n){e===t.itemInStage(i,n)&&(i.hover=!0)})},handleButtonLeave:function(){this.items.forEach(function(e){e.hover=!1})},updateItems:function(){this.items=this.$children.filter(function(e){return\"ElCarouselItem\"===e.$options.name})},resetItemPosition:function(e){var t=this;this.items.forEach(function(i,n){i.translateItem(n,t.activeIndex,e)})},playSlides:function(){this.activeIndex<this.items.length-1?this.activeIndex++:this.loop&&(this.activeIndex=0)},pauseTimer:function(){clearInterval(this.timer)},startTimer:function(){this.interval<=0||!this.autoplay||(this.timer=setInterval(this.playSlides,this.interval))},setActiveItem:function(e){if(\"string\"==typeof e){var t=this.items.filter(function(t){return t.name===e});t.length>0&&(e=this.items.indexOf(t[0]))}if(e=Number(e),!isNaN(e)&&e===Math.floor(e)){var i=this.items.length,n=this.activeIndex;this.activeIndex=e<0?this.loop?i-1:0:e>=i?this.loop?0:i-1:e,n===this.activeIndex&&this.resetItemPosition(n)}},prev:function(){this.setActiveItem(this.activeIndex-1)},next:function(){this.setActiveItem(this.activeIndex+1)},handleIndicatorClick:function(e){this.activeIndex=e},handleIndicatorHover:function(e){\"hover\"===this.trigger&&e!==this.activeIndex&&(this.activeIndex=e)}},created:function(){var e=this;this.throttledArrowClick=(0,s.default)(300,!0,function(t){e.setActiveItem(t)}),this.throttledIndicatorHover=(0,s.default)(300,function(t){e.handleIndicatorHover(t)})},mounted:function(){var e=this;this.updateItems(),this.$nextTick(function(){(0,r.addResizeListener)(e.$el,e.resetItemPosition),e.initialIndex<e.items.length&&e.initialIndex>=0&&(e.activeIndex=e.initialIndex),e.startTimer()})},beforeDestroy:function(){this.$el&&(0,r.removeResizeListener)(this.$el,this.resetItemPosition)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-carousel\",class:{\"el-carousel--card\":\"card\"===e.type},on:{mouseenter:function(t){t.stopPropagation(),e.handleMouseEnter(t)},mouseleave:function(t){t.stopPropagation(),e.handleMouseLeave(t)}}},[i(\"div\",{staticClass:\"el-carousel__container\",style:{height:e.height}},[i(\"transition\",{attrs:{name:\"carousel-arrow-left\"}},[\"never\"!==e.arrow?i(\"button\",{directives:[{name:\"show\",rawName:\"v-show\",value:(\"always\"===e.arrow||e.hover)&&(e.loop||e.activeIndex>0),expression:\"(arrow === 'always' || hover) && (loop || activeIndex > 0)\"}],staticClass:\"el-carousel__arrow el-carousel__arrow--left\",attrs:{type:\"button\"},on:{mouseenter:function(t){e.handleButtonEnter(\"left\")},mouseleave:e.handleButtonLeave,click:function(t){t.stopPropagation(),e.throttledArrowClick(e.activeIndex-1)}}},[i(\"i\",{staticClass:\"el-icon-arrow-left\"})]):e._e()]),i(\"transition\",{attrs:{name:\"carousel-arrow-right\"}},[\"never\"!==e.arrow?i(\"button\",{directives:[{name:\"show\",rawName:\"v-show\",value:(\"always\"===e.arrow||e.hover)&&(e.loop||e.activeIndex<e.items.length-1),expression:\"(arrow === 'always' || hover) && (loop || activeIndex < items.length - 1)\"}],staticClass:\"el-carousel__arrow el-carousel__arrow--right\",attrs:{type:\"button\"},on:{mouseenter:function(t){e.handleButtonEnter(\"right\")},mouseleave:e.handleButtonLeave,click:function(t){t.stopPropagation(),e.throttledArrowClick(e.activeIndex+1)}}},[i(\"i\",{staticClass:\"el-icon-arrow-right\"})]):e._e()]),e._t(\"default\")],2),\"none\"!==e.indicatorPosition?i(\"ul\",{staticClass:\"el-carousel__indicators\",class:{\"el-carousel__indicators--labels\":e.hasLabel,\"el-carousel__indicators--outside\":\"outside\"===e.indicatorPosition||\"card\"===e.type}},e._l(e.items,function(t,n){return i(\"li\",{staticClass:\"el-carousel__indicator\",class:{\"is-active\":n===e.activeIndex},on:{mouseenter:function(t){e.throttledIndicatorHover(n)},click:function(t){t.stopPropagation(),e.handleIndicatorClick(n)}}},[i(\"button\",{staticClass:\"el-carousel__button\"},[e.hasLabel?i(\"span\",[e._v(e._s(t.label))]):e._e()])])})):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(439),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(440),s=i.n(n),r=i(441),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;t.default={name:\"ElCarouselItem\",props:{name:String,label:{type:[String,Number],default:\"\"}},data:function(){return{hover:!1,translate:0,scale:1,active:!1,ready:!1,inStage:!1,animating:!1}},methods:{processIndex:function(e,t,i){return 0===t&&e===i-1?-1:t===i-1&&0===e?i:e<t-1&&t-e>=i/2?i+1:e>t+1&&e-t>=i/2?-2:e},calculateTranslate:function(e,t,i){return this.inStage?i*(1.17*(e-t)+1)/4:e<t?-1.83*i/4:3.83*i/4},translateItem:function(e,t,i){var n=this.$parent.$el.offsetWidth,s=this.$parent.items.length;\"card\"!==this.$parent.type&&void 0!==i&&(this.animating=e===t||e===i),e!==t&&s>2&&this.$parent.loop&&(e=this.processIndex(e,t,s)),\"card\"===this.$parent.type?(this.inStage=Math.round(Math.abs(e-t))<=1,this.active=e===t,this.translate=this.calculateTranslate(e,t,n),this.scale=this.active?1:.83):(this.active=e===t,this.translate=n*(e-t)),this.ready=!0},handleItemClick:function(){var e=this.$parent;if(e&&\"card\"===e.type){var t=e.items.indexOf(this);e.setActiveItem(t)}}},created:function(){this.$parent&&this.$parent.updateItems()},destroyed:function(){this.$parent&&this.$parent.updateItems()}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.ready,expression:\"ready\"}],staticClass:\"el-carousel__item\",class:{\"is-active\":e.active,\"el-carousel__item--card\":\"card\"===e.$parent.type,\"is-in-stage\":e.inStage,\"is-hover\":e.hover,\"is-animating\":e.animating},style:{msTransform:\"translateX(\"+e.translate+\"px) scale(\"+e.scale+\")\",webkitTransform:\"translateX(\"+e.translate+\"px) scale(\"+e.scale+\")\",transform:\"translateX(\"+e.translate+\"px) scale(\"+e.scale+\")\"},on:{click:e.handleItemClick}},[\"card\"===e.$parent.type?i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.active,expression:\"!active\"}],staticClass:\"el-carousel__mask\"}):e._e(),e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(443),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(444),s=i.n(n),r=i(445),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElCollapse\",componentName:\"ElCollapse\",props:{accordion:Boolean,value:{type:[Array,String,Number],default:function(){return[]}}},data:function(){return{activeNames:[].concat(this.value)}},provide:function(){return{collapse:this}},watch:{value:function(e){this.activeNames=[].concat(e)}},methods:{setActiveNames:function(e){e=[].concat(e);var t=this.accordion?e[0]:e;this.activeNames=e,this.$emit(\"input\",t),this.$emit(\"change\",t)},handleItemClick:function(e){if(this.accordion)this.setActiveNames(!this.activeNames[0]&&0!==this.activeNames[0]||this.activeNames[0]!==e.name?e.name:\"\");else{var t=this.activeNames.slice(0),i=t.indexOf(e.name);i>-1?t.splice(i,1):t.push(e.name),this.setActiveNames(t)}}},created:function(){this.$on(\"item-click\",this.handleItemClick)}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{staticClass:\"el-collapse\",attrs:{role:\"tablist\",\"aria-multiselectable\":\"true\"}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(447),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(448),s=i.n(n),r=i(449),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(32),r=n(s),o=i(1),a=n(o),l=i(4);t.default={name:\"ElCollapseItem\",componentName:\"ElCollapseItem\",mixins:[a.default],components:{ElCollapseTransition:r.default},data:function(){return{contentWrapStyle:{height:\"auto\",display:\"block\"},contentHeight:0,focusing:!1,isClick:!1}},inject:[\"collapse\"],props:{title:String,name:{type:[String,Number],default:function(){return this._uid}}},computed:{isActive:function(){return this.collapse.activeNames.indexOf(this.name)>-1},id:function(){return(0,l.generateId)()}},methods:{handleFocus:function(){var e=this;setTimeout(function(){e.isClick?e.isClick=!1:e.focusing=!0},50)},handleHeaderClick:function(){this.dispatch(\"ElCollapse\",\"item-click\",this),this.focusing=!1,this.isClick=!0},handleEnterClick:function(){this.dispatch(\"ElCollapse\",\"item-click\",this)}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-collapse-item\",class:{\"is-active\":e.isActive}},[i(\"div\",{attrs:{role:\"tab\",\"aria-expanded\":e.isActive,\"aria-controls\":\"el-collapse-content-\"+e.id,\"aria-describedby\":\"el-collapse-content-\"+e.id}},[i(\"div\",{staticClass:\"el-collapse-item__header\",class:{focusing:e.focusing,\"is-active\":e.isActive},attrs:{role:\"button\",id:\"el-collapse-head-\"+e.id,tabindex:\"0\"},on:{click:e.handleHeaderClick,keyup:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"space\",32,t.key)&&e._k(t.keyCode,\"enter\",13,t.key))return null;t.stopPropagation(),e.handleEnterClick(t)},focus:e.handleFocus,blur:function(t){e.focusing=!1}}},[e._t(\"title\",[e._v(e._s(e.title))]),i(\"i\",{staticClass:\"el-collapse-item__arrow el-icon-arrow-right\",class:{\"is-active\":e.isActive}})],2)]),i(\"el-collapse-transition\",[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.isActive,expression:\"isActive\"}],staticClass:\"el-collapse-item__wrap\",attrs:{role:\"tabpanel\",\"aria-hidden\":!e.isActive,\"aria-labelledby\":\"el-collapse-head-\"+e.id,id:\"el-collapse-content-\"+e.id}},[i(\"div\",{staticClass:\"el-collapse-item__content\"},[e._t(\"default\")],2)])])],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(451),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(452),s=i.n(n),r=i(455),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(2),r=n(s),o=i(453),a=n(o),l=i(8),u=n(l),c=i(11),d=n(c),h=i(12),f=n(h),p=i(1),m=n(p),v=i(6),g=n(v),b=i(17),y=i(18),_=n(y),C=i(4),x={props:{placement:{type:String,default:\"bottom-start\"},appendToBody:d.default.props.appendToBody,arrowOffset:d.default.props.arrowOffset,offset:d.default.props.offset,boundariesPadding:d.default.props.boundariesPadding,popperOptions:d.default.props.popperOptions},methods:d.default.methods,data:d.default.data,beforeDestroy:d.default.beforeDestroy};t.default={name:\"ElCascader\",directives:{Clickoutside:f.default},mixins:[x,m.default,g.default],inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},components:{ElInput:u.default},props:{options:{type:Array,required:!0},props:{type:Object,default:function(){return{children:\"children\",label:\"label\",value:\"value\",disabled:\"disabled\"}}},value:{type:Array,default:function(){return[]}},separator:{type:String,default:\"/\"},placeholder:{type:String,default:function(){return(0,b.t)(\"el.cascader.placeholder\")}},disabled:Boolean,clearable:{type:Boolean,default:!1},changeOnSelect:Boolean,popperClass:String,expandTrigger:{type:String,default:\"click\"},filterable:Boolean,size:String,showAllLevels:{type:Boolean,default:!0},debounce:{type:Number,default:300},beforeFilter:{type:Function,default:function(){return function(){}}},hoverThreshold:{type:Number,default:500}},data:function(){return{currentValue:this.value||[],menu:null,debouncedInputChange:function(){},menuVisible:!1,inputHover:!1,inputValue:\"\",flatOptions:null,id:(0,C.generateId)(),needFocus:!0,isOnComposition:!1}},computed:{labelKey:function(){return this.props.label||\"label\"},valueKey:function(){return this.props.value||\"value\"},childrenKey:function(){return this.props.children||\"children\"},disabledKey:function(){return this.props.disabled||\"disabled\"},currentLabels:function(){var e=this,t=this.options,i=[];return this.currentValue.forEach(function(n){var s=t&&t.filter(function(t){return t[e.valueKey]===n})[0];s&&(i.push(s[e.labelKey]),t=s[e.childrenKey])}),i},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},cascaderSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},cascaderDisabled:function(){return this.disabled||(this.elForm||{}).disabled},readonly:function(){return!this.filterable||!(0,C.isIE)()&&!(0,C.isEdge)()&&!this.menuVisible}},watch:{menuVisible:function(e){this.$refs.input.$refs.input.setAttribute(\"aria-expanded\",e),e?this.showMenu():this.hideMenu(),this.$emit(\"visible-change\",e)},value:function(e){this.currentValue=e},currentValue:function(e){this.dispatch(\"ElFormItem\",\"el.form.change\",[e])},currentLabels:function(e){var t=this.showAllLevels?e.join(\"/\"):e[e.length-1];this.$refs.input.$refs.input.setAttribute(\"value\",t)},options:{deep:!0,handler:function(e){this.menu||this.initMenu(),this.flatOptions=this.flattenOptions(this.options),this.menu.options=e}}},methods:{initMenu:function(){this.menu=new r.default(a.default).$mount(),this.menu.options=this.options,this.menu.props=this.props,this.menu.expandTrigger=this.expandTrigger,this.menu.changeOnSelect=this.changeOnSelect,this.menu.popperClass=this.popperClass,this.menu.hoverThreshold=this.hoverThreshold,this.popperElm=this.menu.$el,this.menu.$refs.menus[0].setAttribute(\"id\",\"cascader-menu-\"+this.id),this.menu.$on(\"pick\",this.handlePick),this.menu.$on(\"activeItemChange\",this.handleActiveItemChange),this.menu.$on(\"menuLeave\",this.doDestroy),this.menu.$on(\"closeInside\",this.handleClickoutside)},showMenu:function(){var e=this;this.menu||this.initMenu(),this.menu.value=this.currentValue.slice(0),this.menu.visible=!0,this.menu.options=this.options,this.$nextTick(function(t){e.updatePopper(),e.menu.inputWidth=e.$refs.input.$el.offsetWidth-2})},hideMenu:function(){this.inputValue=\"\",this.menu.visible=!1,this.needFocus?this.$refs.input.focus():this.needFocus=!0},handleActiveItemChange:function(e){var t=this;this.$nextTick(function(e){t.updatePopper()}),this.$emit(\"active-item-change\",e)},handleKeydown:function(e){var t=this,i=e.keyCode;13===i?this.handleClick():40===i?(this.menuVisible=!0,setTimeout(function(){t.popperElm.querySelectorAll(\".el-cascader-menu\")[0].querySelectorAll(\"[tabindex='-1']\")[0].focus()}),e.stopPropagation(),e.preventDefault()):27!==i&&9!==i||(this.inputValue=\"\",this.menu&&(this.menu.visible=!1))},handlePick:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.currentValue=e,this.$emit(\"input\",e),this.$emit(\"change\",e),t?this.menuVisible=!1:this.$nextTick(this.updatePopper)},handleInputChange:function(e){var t=this;if(this.menuVisible){var i=this.flatOptions;if(!e)return this.menu.options=this.options,void this.$nextTick(this.updatePopper);var n=i.filter(function(i){return i.some(function(i){return new RegExp((0,C.escapeRegexpString)(e),\"i\").test(i[t.labelKey])})});n=n.length>0?n.map(function(i){return{__IS__FLAT__OPTIONS:!0,value:i.map(function(e){return e[t.valueKey]}),label:t.renderFilteredOptionLabel(e,i),disabled:i.some(function(e){return e[t.disabledKey]})}}):[{__IS__FLAT__OPTIONS:!0,label:this.t(\"el.cascader.noMatch\"),value:\"\",disabled:!0}],this.menu.options=n,this.$nextTick(this.updatePopper)}},renderFilteredOptionLabel:function(e,t){var i=this;return t.map(function(t,n){var s=t[i.labelKey],r=s.toLowerCase().indexOf(e.toLowerCase()),o=s.slice(r,e.length+r),a=r>-1?i.highlightKeyword(s,o):s;return 0===n?a:[\" \"+i.separator+\" \",a]})},highlightKeyword:function(e,t){var i=this,n=this._c;return e.split(t).map(function(e,s){return 0===s?e:[n(\"span\",{class:{\"el-cascader-menu__item__keyword\":!0}},[i._v(t)]),e]})},flattenOptions:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[];return e.forEach(function(e){var s=i.concat(e);e[t.childrenKey]?(t.changeOnSelect&&n.push(s),n=n.concat(t.flattenOptions(e[t.childrenKey],s))):n.push(s)}),n},clearValue:function(e){e.stopPropagation(),this.handlePick([],!0)},handleClickoutside:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.menuVisible&&!e&&(this.needFocus=!1),this.menuVisible=!1},handleClick:function(){if(!this.cascaderDisabled){if(this.$refs.input.focus(),this.filterable)return void(this.menuVisible=!0);this.menuVisible=!this.menuVisible}},handleFocus:function(e){this.$emit(\"focus\",e)},handleBlur:function(e){this.$emit(\"blur\",e)},handleComposition:function(e){this.isOnComposition=\"compositionend\"!==e.type}},created:function(){var e=this;this.debouncedInputChange=(0,_.default)(this.debounce,function(t){var i=e.beforeFilter(t);i&&i.then?(e.menu.options=[{__IS__FLAT__OPTIONS:!0,label:e.t(\"el.cascader.loading\"),value:\"\",disabled:!0}],i.then(function(){e.$nextTick(function(){e.handleInputChange(t)})})):!1!==i&&e.$nextTick(function(){e.handleInputChange(t)})})},mounted:function(){this.flatOptions=this.flattenOptions(this.options)}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(454),s=i.n(n),r=i(0),o=r(s.a,null,!1,null,null,null);t.default=o.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(91),r=n(s),o=i(43),a=i(45),l=n(a),u=i(4),c=function e(t,i){if(!t||!Array.isArray(t)||!i)return t;var n=[],s=[\"__IS__FLAT__OPTIONS\",\"label\",\"value\",\"disabled\"],r=i.children||\"children\";return t.forEach(function(t){var o={};s.forEach(function(e){var n=i[e],s=t[n];void 0===s&&(n=e,s=t[n]),void 0!==s&&(o[n]=s)}),Array.isArray(t[r])&&(o[r]=e(t[r],i)),n.push(o)}),n};t.default={name:\"ElCascaderMenu\",data:function(){return{inputWidth:0,options:[],props:{},visible:!1,activeValue:[],value:[],expandTrigger:\"click\",changeOnSelect:!1,popperClass:\"\",hoverTimer:0,clicking:!1,id:(0,u.generateId)()}},watch:{visible:function(e){e&&(this.activeValue=this.value)},value:{immediate:!0,handler:function(e){this.activeValue=e}}},computed:{activeOptions:{cache:!1,get:function(){var e=this,t=this.activeValue,i=[\"label\",\"value\",\"children\",\"disabled\"],n=c(this.options,this.props);return function t(n){n.forEach(function(n){n.__IS__FLAT__OPTIONS||(i.forEach(function(t){var i=n[e.props[t]||t];void 0!==i&&(n[t]=i)}),Array.isArray(n.children)&&t(n.children))})}(n),function e(i){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],s=n.length;n[s]=i;var r=t[s];return(0,o.isDef)(r)&&(i=i.filter(function(e){return e.value===r})[0])&&i.children&&e(i.children,n),n}(n)}}},methods:{select:function(e,t){e.__IS__FLAT__OPTIONS?this.activeValue=e.value:t?this.activeValue.splice(t,this.activeValue.length-1,e.value):this.activeValue=[e.value],this.$emit(\"pick\",this.activeValue.slice())},handleMenuLeave:function(){this.$emit(\"menuLeave\")},activeItem:function(e,t){var i=this.activeOptions.length;this.activeValue.splice(t,i,e.value),this.activeOptions.splice(t+1,i,e.children),this.changeOnSelect?this.$emit(\"pick\",this.activeValue.slice(),!1):this.$emit(\"activeItemChange\",this.activeValue)},scrollMenu:function(e){(0,l.default)(e,e.getElementsByClassName(\"is-active\")[0])},handleMenuEnter:function(){var e=this;this.$nextTick(function(){return e.$refs.menus.forEach(function(t){return e.scrollMenu(t)})})}},render:function(e){var t=this,i=this.activeValue,n=this.activeOptions,s=this.visible,o=this.expandTrigger,a=this.popperClass,l=this.hoverThreshold,u=null,c=0,d={},h=function(e){var i=d.activeMenu;if(i){var n=e.offsetX,s=i.offsetWidth,r=i.offsetHeight;if(e.target===d.activeItem){clearTimeout(t.hoverTimer);var o=d,a=o.activeItem,u=a.offsetTop,c=u+a.offsetHeight;d.hoverZone.innerHTML='\\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M'+n+\" \"+u+\" L\"+s+\" 0 V\"+u+' Z\" />\\n          <path style=\"pointer-events: auto;\" fill=\"transparent\" d=\"M'+n+\" \"+c+\" L\"+s+\" \"+r+\" V\"+c+' Z\" />\\n        '}else t.hoverTimer||(t.hoverTimer=setTimeout(function(){d.hoverZone.innerHTML=\"\"},l))}},f=this._l(n,function(n,s){var a=!1,l=\"menu-\"+t.id+\"-\"+s,d=\"menu-\"+t.id+\"-\"+(s+1),f=t._l(n,function(n){var h={on:{}};return n.__IS__FLAT__OPTIONS&&(a=!0),n.disabled||(h.on.keydown=function(e){var i=e.keyCode;if(!([37,38,39,40,13,9,27].indexOf(i)<0)){var r=e.target,o=t.$refs.menus[s],a=o.querySelectorAll(\"[tabindex='-1']\"),l=Array.prototype.indexOf.call(a,r),u=void 0,c=void 0;if([38,40].indexOf(i)>-1)38===i?u=0!==l?l-1:l:40===i&&(u=l!==a.length-1?l+1:l),a[u].focus();else if(37===i){if(0!==s){var d=t.$refs.menus[s-1];d.querySelector(\"[aria-expanded=true]\").focus()}}else if(39===i)n.children&&(c=t.$refs.menus[s+1],c.querySelectorAll(\"[tabindex='-1']\")[0].focus());else if(13===i){if(!n.children){var h=r.getAttribute(\"id\");o.setAttribute(\"aria-activedescendant\",h),t.select(n,s),t.$nextTick(function(){return t.scrollMenu(t.$refs.menus[s])})}}else 9!==i&&27!==i||t.$emit(\"closeInside\")}},n.children?function(){var e={click:\"click\",hover:\"mouseenter\"}[o],i=function(){t.visible&&(t.activeItem(n,s),t.$nextTick(function(){t.scrollMenu(t.$refs.menus[s]),t.scrollMenu(t.$refs.menus[s+1])}))};h.on[e]=i,\"mouseenter\"===e&&t.changeOnSelect&&(h.on.click=function(){-1!==t.activeValue.indexOf(n.value)&&t.$emit(\"closeInside\",!0)}),h.on.mousedown=function(){t.clicking=!0},h.on.focus=function(){if(t.clicking)return void(t.clicking=!1);i()}}():h.on.click=function(){t.select(n,s),t.$nextTick(function(){return t.scrollMenu(t.$refs.menus[s])})}),n.disabled||n.children||(u=l+\"-\"+c,c++),e(\"li\",(0,r.default)([{class:{\"el-cascader-menu__item\":!0,\"el-cascader-menu__item--extensible\":n.children,\"is-active\":n.value===i[s],\"is-disabled\":n.disabled},ref:n.value===i[s]?\"activeItem\":null},h,{attrs:{tabindex:n.disabled?null:-1,role:\"menuitem\",\"aria-haspopup\":!!n.children,\"aria-expanded\":n.value===i[s],id:u,\"aria-owns\":n.children?d:null}}]),[n.label])}),p={};a&&(p.minWidth=t.inputWidth+\"px\");var m=\"hover\"===o&&i.length-1===s,v={on:{}};return m&&(v.on.mousemove=h,p.position=\"relative\"),e(\"ul\",(0,r.default)([{class:{\"el-cascader-menu\":!0,\"el-cascader-menu--flexible\":a}},v,{style:p,refInFor:!0,ref:\"menus\",attrs:{role:\"menu\",id:l}}]),[f,m?e(\"svg\",{ref:\"hoverZone\",style:{position:\"absolute\",top:0,height:\"100%\",width:\"100%\",left:0,pointerEvents:\"none\"}},[]):null])});return\"hover\"===o&&this.$nextTick(function(){var e=t.$refs.activeItem;if(e){var i=e.parentElement,n=t.$refs.hoverZone;d={activeMenu:i,activeItem:e,hoverZone:n}}else d={}}),e(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"before-enter\":this.handleMenuEnter,\"after-leave\":this.handleMenuLeave}},[e(\"div\",{directives:[{name:\"show\",value:s}],class:[\"el-cascader-menus el-popper\",a],ref:\"wrapper\"},[e(\"div\",{attrs:{\"x-arrow\":!0},class:\"popper__arrow\"},[]),f])])}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"span\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.handleClickoutside,expression:\"handleClickoutside\"}],ref:\"reference\",staticClass:\"el-cascader\",class:[{\"is-opened\":e.menuVisible,\"is-disabled\":e.cascaderDisabled},e.cascaderSize?\"el-cascader--\"+e.cascaderSize:\"\"],on:{click:e.handleClick,mouseenter:function(t){e.inputHover=!0},focus:function(t){e.inputHover=!0},mouseleave:function(t){e.inputHover=!1},blur:function(t){e.inputHover=!1},keydown:e.handleKeydown}},[i(\"el-input\",{ref:\"input\",class:{\"is-focus\":e.menuVisible},attrs:{readonly:e.readonly,placeholder:e.currentLabels.length?void 0:e.placeholder,\"validate-event\":!1,size:e.size,disabled:e.cascaderDisabled},on:{input:e.debouncedInputChange,focus:e.handleFocus,blur:e.handleBlur},nativeOn:{compositionstart:function(t){e.handleComposition(t)},compositionend:function(t){e.handleComposition(t)}},model:{value:e.inputValue,callback:function(t){e.inputValue=t},expression:\"inputValue\"}},[i(\"template\",{attrs:{slot:\"suffix\"},slot:\"suffix\"},[e.clearable&&e.inputHover&&e.currentLabels.length?i(\"i\",{key:\"1\",staticClass:\"el-input__icon el-icon-circle-close el-cascader__clearIcon\",on:{click:e.clearValue}}):i(\"i\",{key:\"2\",staticClass:\"el-input__icon el-icon-arrow-down\",class:{\"is-reverse\":e.menuVisible}})])],2),i(\"span\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"\"===e.inputValue&&!e.isOnComposition,expression:\"inputValue === '' && !isOnComposition\"}],staticClass:\"el-cascader__label\"},[e.showAllLevels?[e._l(e.currentLabels,function(t,n){return[e._v(\"\\n        \"+e._s(t)+\"\\n        \"),n<e.currentLabels.length-1?i(\"span\",{key:n},[e._v(\" \"+e._s(e.separator)+\" \")]):e._e()]})]:[e._v(\"\\n      \"+e._s(e.currentLabels[e.currentLabels.length-1])+\"\\n    \")]],2)],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(457),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(458),s=i.n(n),r=i(474),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(92),r=n(s),o=i(459),a=n(o),l=i(12),u=n(l),c=i(1),d=n(c);t.default={name:\"ElColorPicker\",mixins:[d.default],props:{value:String,showAlpha:Boolean,colorFormat:String,disabled:Boolean,size:String,popperClass:String,predefine:Array},inject:{elForm:{default:\"\"},elFormItem:{default:\"\"}},directives:{Clickoutside:u.default},computed:{displayedColor:function(){return this.value||this.showPanelColor?this.displayedRgb(this.color,this.showAlpha):\"transparent\"},_elFormItemSize:function(){return(this.elFormItem||{}).elFormItemSize},colorSize:function(){return this.size||this._elFormItemSize||(this.$ELEMENT||{}).size},colorDisabled:function(){return this.disabled||(this.elForm||{}).disabled}},watch:{value:function(e){e?e&&e!==this.color.value&&this.color.fromString(e):this.showPanelColor=!1},color:{deep:!0,handler:function(){this.showPanelColor=!0}},displayedColor:function(e){if(this.showPicker){var t=new r.default({enableAlpha:this.showAlpha,format:this.colorFormat});t.fromString(this.value);e!==this.displayedRgb(t,this.showAlpha)&&this.$emit(\"active-change\",e)}}},methods:{handleTrigger:function(){this.colorDisabled||(this.showPicker=!this.showPicker)},confirmValue:function(){var e=this.color.value;this.$emit(\"input\",e),this.$emit(\"change\",e),this.dispatch(\"ElFormItem\",\"el.form.change\",e),this.showPicker=!1},clearValue:function(){this.$emit(\"input\",null),this.$emit(\"change\",null),null!==this.value&&this.dispatch(\"ElFormItem\",\"el.form.change\",null),this.showPanelColor=!1,this.showPicker=!1,this.resetColor()},hide:function(){this.showPicker=!1,this.resetColor()},resetColor:function(){var e=this;this.$nextTick(function(t){e.value?e.color.fromString(e.value):e.showPanelColor=!1})},displayedRgb:function(e,t){if(!(e instanceof r.default))throw Error(\"color should be instance of Color Class\");var i=e.toRgb(),n=i.r,s=i.g,o=i.b;return t?\"rgba(\"+n+\", \"+s+\", \"+o+\", \"+e.get(\"alpha\")/100+\")\":\"rgb(\"+n+\", \"+s+\", \"+o+\")\"}},mounted:function(){var e=this.value;e&&this.color.fromString(e),this.popperElm=this.$refs.dropdown.$el},data:function(){return{color:new r.default({enableAlpha:this.showAlpha,format:this.colorFormat}),showPicker:!1,showPanelColor:!1}},components:{PickerDropdown:a.default}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(460),s=i.n(n),r=i(473),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(461),r=n(s),o=i(464),a=n(o),l=i(467),u=n(l),c=i(470),d=n(c),h=i(11),f=n(h),p=i(6),m=n(p),v=i(8),g=n(v),b=i(19),y=n(b);t.default={name:\"el-color-picker-dropdown\",mixins:[f.default,m.default],components:{SvPanel:r.default,HueSlider:a.default,AlphaSlider:u.default,ElInput:g.default,ElButton:y.default,Predefine:d.default},props:{color:{required:!0},showAlpha:Boolean,predefine:Array},data:function(){return{customInput:\"\"}},computed:{currentColor:function(){var e=this.$parent;return e.value||e.showPanelColor?e.color.value:\"\"}},methods:{confirmValue:function(){this.$emit(\"pick\")},handleConfirm:function(){this.color.fromString(this.customInput)}},mounted:function(){this.$parent.popperElm=this.popperElm=this.$el,this.referenceElm=this.$parent.$el},watch:{showPopper:function(e){var t=this;!0===e&&this.$nextTick(function(){var e=t.$refs,i=e.sl,n=e.hue,s=e.alpha;i&&i.update(),n&&n.update(),s&&s.update()})},currentColor:{immediate:!0,handler:function(e){this.customInput=e}}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(462),s=i.n(n),r=i(463),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(65),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"el-sl-panel\",props:{color:{required:!0}},computed:{colorValue:function(){return{hue:this.color.get(\"hue\"),value:this.color.get(\"value\")}}},watch:{colorValue:function(){this.update()}},methods:{update:function(){var e=this.color.get(\"saturation\"),t=this.color.get(\"value\"),i=this.$el,n=i.clientWidth,s=i.clientHeight;this.cursorLeft=e*n/100,this.cursorTop=(100-t)*s/100,this.background=\"hsl(\"+this.color.get(\"hue\")+\", 100%, 50%)\"},handleDrag:function(e){var t=this.$el,i=t.getBoundingClientRect(),n=e.clientX-i.left,s=e.clientY-i.top;n=Math.max(0,n),n=Math.min(n,i.width),s=Math.max(0,s),s=Math.min(s,i.height),this.cursorLeft=n,this.cursorTop=s,this.color.set({saturation:n/i.width*100,value:100-s/i.height*100})}},mounted:function(){var e=this;(0,s.default)(this.$el,{drag:function(t){e.handleDrag(t)},end:function(t){e.handleDrag(t)}}),this.update()},data:function(){return{cursorTop:0,cursorLeft:0,background:\"hsl(0, 100%, 50%)\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-color-svpanel\",style:{backgroundColor:e.background}},[i(\"div\",{staticClass:\"el-color-svpanel__white\"}),i(\"div\",{staticClass:\"el-color-svpanel__black\"}),i(\"div\",{staticClass:\"el-color-svpanel__cursor\",style:{top:e.cursorTop+\"px\",left:e.cursorLeft+\"px\"}},[i(\"div\")])])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(465),s=i.n(n),r=i(466),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(65),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"el-color-hue-slider\",props:{color:{required:!0},vertical:Boolean},data:function(){return{thumbLeft:0,thumbTop:0}},computed:{hueValue:function(){return this.color.get(\"hue\")}},watch:{hueValue:function(){this.update()}},methods:{handleClick:function(e){var t=this.$refs.thumb;e.target!==t&&this.handleDrag(e)},handleDrag:function(e){var t=this.$el.getBoundingClientRect(),i=this.$refs.thumb,n=void 0;if(this.vertical){var s=e.clientY-t.top;s=Math.min(s,t.height-i.offsetHeight/2),s=Math.max(i.offsetHeight/2,s),n=Math.round((s-i.offsetHeight/2)/(t.height-i.offsetHeight)*360)}else{var r=e.clientX-t.left;r=Math.min(r,t.width-i.offsetWidth/2),r=Math.max(i.offsetWidth/2,r),n=Math.round((r-i.offsetWidth/2)/(t.width-i.offsetWidth)*360)}this.color.set(\"hue\",n)},getThumbLeft:function(){if(this.vertical)return 0;var e=this.$el,t=this.color.get(\"hue\");if(!e)return 0;var i=this.$refs.thumb;return Math.round(t*(e.offsetWidth-i.offsetWidth/2)/360)},getThumbTop:function(){if(!this.vertical)return 0;var e=this.$el,t=this.color.get(\"hue\");if(!e)return 0;var i=this.$refs.thumb;return Math.round(t*(e.offsetHeight-i.offsetHeight/2)/360)},update:function(){this.thumbLeft=this.getThumbLeft(),this.thumbTop=this.getThumbTop()}},mounted:function(){var e=this,t=this.$refs,i=t.bar,n=t.thumb,r={drag:function(t){e.handleDrag(t)},end:function(t){e.handleDrag(t)}};(0,s.default)(i,r),(0,s.default)(n,r),this.update()}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-color-hue-slider\",class:{\"is-vertical\":e.vertical}},[i(\"div\",{ref:\"bar\",staticClass:\"el-color-hue-slider__bar\",on:{click:e.handleClick}}),i(\"div\",{ref:\"thumb\",staticClass:\"el-color-hue-slider__thumb\",style:{left:e.thumbLeft+\"px\",top:e.thumbTop+\"px\"}})])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(468),s=i.n(n),r=i(469),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(65),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={name:\"el-color-alpha-slider\",props:{color:{required:!0},vertical:Boolean},watch:{\"color._alpha\":function(){this.update()},\"color.value\":function(){this.update()}},methods:{handleClick:function(e){var t=this.$refs.thumb;e.target!==t&&this.handleDrag(e)},handleDrag:function(e){var t=this.$el.getBoundingClientRect(),i=this.$refs.thumb;if(this.vertical){var n=e.clientY-t.top;n=Math.max(i.offsetHeight/2,n),n=Math.min(n,t.height-i.offsetHeight/2),this.color.set(\"alpha\",Math.round((n-i.offsetHeight/2)/(t.height-i.offsetHeight)*100))}else{var s=e.clientX-t.left;s=Math.max(i.offsetWidth/2,s),s=Math.min(s,t.width-i.offsetWidth/2),this.color.set(\"alpha\",Math.round((s-i.offsetWidth/2)/(t.width-i.offsetWidth)*100))}},getThumbLeft:function(){if(this.vertical)return 0;var e=this.$el,t=this.color._alpha;if(!e)return 0;var i=this.$refs.thumb;return Math.round(t*(e.offsetWidth-i.offsetWidth/2)/100)},getThumbTop:function(){if(!this.vertical)return 0;var e=this.$el,t=this.color._alpha;if(!e)return 0;var i=this.$refs.thumb;return Math.round(t*(e.offsetHeight-i.offsetHeight/2)/100)},getBackground:function(){if(this.color&&this.color.value){var e=this.color.toRgb(),t=e.r,i=e.g,n=e.b;return\"linear-gradient(to right, rgba(\"+t+\", \"+i+\", \"+n+\", 0) 0%, rgba(\"+t+\", \"+i+\", \"+n+\", 1) 100%)\"}return null},update:function(){this.thumbLeft=this.getThumbLeft(),this.thumbTop=this.getThumbTop(),this.background=this.getBackground()}},data:function(){return{thumbLeft:0,thumbTop:0,background:null}},mounted:function(){var e=this,t=this.$refs,i=t.bar,n=t.thumb,r={drag:function(t){e.handleDrag(t)},end:function(t){e.handleDrag(t)}};(0,s.default)(i,r),(0,s.default)(n,r),this.update()}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-color-alpha-slider\",class:{\"is-vertical\":e.vertical}},[i(\"div\",{ref:\"bar\",staticClass:\"el-color-alpha-slider__bar\",style:{background:e.background},on:{click:e.handleClick}}),i(\"div\",{ref:\"thumb\",staticClass:\"el-color-alpha-slider__thumb\",style:{left:e.thumbLeft+\"px\",top:e.thumbTop+\"px\"}})])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(471),s=i.n(n),r=i(472),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(92),s=function(e){return e&&e.__esModule?e:{default:e}}(n);t.default={props:{colors:{type:Array,required:!0},color:{required:!0}},data:function(){return{rgbaColors:this.parseColors(this.colors,this.color)}},methods:{handleSelect:function(e){this.color.fromString(this.colors[e])},parseColors:function(e,t){return e.map(function(e){var i=new s.default;return i.enableAlpha=!0,i.format=\"rgba\",i.fromString(e),i.selected=i.value===t.value,i})}},watch:{\"$parent.currentColor\":function(e){var t=new s.default;t.fromString(e),this.rgbaColors.forEach(function(e){e.selected=t.compare(e)})},colors:function(e){this.rgbaColors=this.parseColors(e,this.color)},color:function(e){this.rgbaColors=this.parseColors(this.colors,e)}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-color-predefine\"},[i(\"div\",{staticClass:\"el-color-predefine__colors\"},e._l(e.rgbaColors,function(t,n){return i(\"div\",{key:e.colors[n],staticClass:\"el-color-predefine__color-selector\",class:{selected:t.selected,\"is-alpha\":t._alpha<100},on:{click:function(t){e.handleSelect(n)}}},[i(\"div\",{style:{\"background-color\":t.value}})])}))])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"transition\",{attrs:{name:\"el-zoom-in-top\"},on:{\"after-leave\":e.doDestroy}},[i(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.showPopper,expression:\"showPopper\"}],staticClass:\"el-color-dropdown\"},[i(\"div\",{staticClass:\"el-color-dropdown__main-wrapper\"},[i(\"hue-slider\",{ref:\"hue\",staticStyle:{float:\"right\"},attrs:{color:e.color,vertical:\"\"}}),i(\"sv-panel\",{ref:\"sl\",attrs:{color:e.color}})],1),e.showAlpha?i(\"alpha-slider\",{ref:\"alpha\",attrs:{color:e.color}}):e._e(),e.predefine?i(\"predefine\",{attrs:{color:e.color,colors:e.predefine}}):e._e(),i(\"div\",{staticClass:\"el-color-dropdown__btns\"},[i(\"span\",{staticClass:\"el-color-dropdown__value\"},[i(\"el-input\",{attrs:{\"validate-event\":!1,size:\"mini\"},on:{blur:e.handleConfirm},nativeOn:{keyup:function(t){if(!(\"button\"in t)&&e._k(t.keyCode,\"enter\",13,t.key))return null;e.handleConfirm(t)}},model:{value:e.customInput,callback:function(t){e.customInput=t},expression:\"customInput\"}})],1),i(\"el-button\",{staticClass:\"el-color-dropdown__link-btn\",attrs:{size:\"mini\",type:\"text\"},on:{click:function(t){e.$emit(\"clear\")}}},[e._v(\"\\n        \"+e._s(e.t(\"el.colorpicker.clear\"))+\"\\n      \")]),i(\"el-button\",{staticClass:\"el-color-dropdown__btn\",attrs:{plain:\"\",size:\"mini\"},on:{click:e.confirmValue}},[e._v(\"\\n        \"+e._s(e.t(\"el.colorpicker.confirm\"))+\"\\n      \")])],1)],1)])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{directives:[{name:\"clickoutside\",rawName:\"v-clickoutside\",value:e.hide,expression:\"hide\"}],class:[\"el-color-picker\",e.colorDisabled?\"is-disabled\":\"\",e.colorSize?\"el-color-picker--\"+e.colorSize:\"\"]},[e.colorDisabled?i(\"div\",{staticClass:\"el-color-picker__mask\"}):e._e(),i(\"div\",{staticClass:\"el-color-picker__trigger\",on:{click:e.handleTrigger}},[i(\"span\",{staticClass:\"el-color-picker__color\",class:{\"is-alpha\":e.showAlpha}},[i(\"span\",{staticClass:\"el-color-picker__color-inner\",style:{backgroundColor:e.displayedColor}}),e.value||e.showPanelColor?e._e():i(\"span\",{staticClass:\"el-color-picker__empty el-icon-close\"})]),i(\"span\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.value||e.showPanelColor,expression:\"value || showPanelColor\"}],staticClass:\"el-color-picker__icon el-icon-arrow-down\"})]),i(\"picker-dropdown\",{ref:\"dropdown\",class:[\"el-color-picker__panel\",e.popperClass||\"\"],attrs:{color:e.color,\"show-alpha\":e.showAlpha,predefine:e.predefine},on:{pick:e.confirmValue,clear:e.clearValue},model:{value:e.showPicker,callback:function(t){e.showPicker=t},expression:\"showPicker\"}})],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(476),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(477),s=i.n(n),r=i(481),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(19),r=n(s),o=i(1),a=n(o),l=i(6),u=n(l),c=i(478),d=n(c),h=i(9),f=n(h);t.default={name:\"ElTransfer\",mixins:[a.default,u.default,f.default],components:{TransferPanel:d.default,ElButton:r.default},props:{data:{type:Array,default:function(){return[]}},titles:{type:Array,default:function(){return[]}},buttonTexts:{type:Array,default:function(){return[]}},filterPlaceholder:{type:String,default:\"\"},filterMethod:Function,leftDefaultChecked:{type:Array,default:function(){return[]}},rightDefaultChecked:{type:Array,default:function(){return[]}},renderContent:Function,value:{type:Array,default:function(){return[]}},format:{type:Object,default:function(){return{}}},filterable:Boolean,props:{type:Object,default:function(){return{label:\"label\",key:\"key\",disabled:\"disabled\"}}},targetOrder:{type:String,default:\"original\"}},data:function(){return{leftChecked:[],rightChecked:[]}},computed:{dataObj:function(){var e=this.props.key;return this.data.reduce(function(t,i){return(t[i[e]]=i)&&t},{})},sourceData:function(){var e=this;return this.data.filter(function(t){return-1===e.value.indexOf(t[e.props.key])})},targetData:function(){var e=this;return\"original\"===this.targetOrder?this.data.filter(function(t){return e.value.indexOf(t[e.props.key])>-1}):this.value.reduce(function(t,i){var n=e.dataObj[i];return n&&t.push(n),t},[])},hasButtonTexts:function(){return 2===this.buttonTexts.length}},watch:{value:function(e){this.dispatch(\"ElFormItem\",\"el.form.change\",e)}},methods:{getMigratingConfig:function(){return{props:{\"footer-format\":\"footer-format is renamed to format.\"}}},onSourceCheckedChange:function(e,t){this.leftChecked=e,void 0!==t&&this.$emit(\"left-check-change\",e,t)},onTargetCheckedChange:function(e,t){this.rightChecked=e,void 0!==t&&this.$emit(\"right-check-change\",e,t)},addToLeft:function(){var e=this.value.slice();this.rightChecked.forEach(function(t){var i=e.indexOf(t);i>-1&&e.splice(i,1)}),this.$emit(\"input\",e),this.$emit(\"change\",e,\"left\",this.rightChecked)},addToRight:function(){var e=this,t=this.value.slice(),i=[],n=this.props.key;this.data.forEach(function(t){var s=t[n];e.leftChecked.indexOf(s)>-1&&-1===e.value.indexOf(s)&&i.push(s)}),t=\"unshift\"===this.targetOrder?i.concat(t):t.concat(i),this.$emit(\"input\",t),this.$emit(\"change\",t,\"right\",this.leftChecked)},clearQuery:function(e){\"left\"===e?this.$refs.leftPanel.query=\"\":\"right\"===e&&(this.$refs.rightPanel.query=\"\")}}}},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(479),s=i.n(n),r=i(480),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var s=i(47),r=n(s),o=i(15),a=n(o),l=i(8),u=n(l),c=i(6),d=n(c);t.default={mixins:[d.default],name:\"ElTransferPanel\",componentName:\"ElTransferPanel\",components:{ElCheckboxGroup:r.default,ElCheckbox:a.default,ElInput:u.default,OptionContent:{props:{option:Object},render:function(e){var t=function e(t){return\"ElTransferPanel\"===t.$options.componentName?t:t.$parent?e(t.$parent):t}(this),i=t.$parent||t;return t.renderContent?t.renderContent(e,this.option):i.$scopedSlots.default?i.$scopedSlots.default({option:this.option}):e(\"span\",null,[this.option[t.labelProp]||this.option[t.keyProp]])}}},props:{data:{type:Array,default:function(){return[]}},renderContent:Function,placeholder:String,title:String,filterable:Boolean,format:Object,filterMethod:Function,defaultChecked:Array,props:Object},data:function(){return{checked:[],allChecked:!1,query:\"\",inputHover:!1,checkChangeByUser:!0}},watch:{checked:function(e,t){if(this.updateAllChecked(),this.checkChangeByUser){var i=e.concat(t).filter(function(i){return-1===e.indexOf(i)||-1===t.indexOf(i)});this.$emit(\"checked-change\",e,i)}else this.$emit(\"checked-change\",e),this.checkChangeByUser=!0},data:function(){var e=this,t=[],i=this.filteredData.map(function(t){return t[e.keyProp]});this.checked.forEach(function(e){i.indexOf(e)>-1&&t.push(e)}),this.checkChangeByUser=!1,this.checked=t},checkableData:function(){this.updateAllChecked()},defaultChecked:{immediate:!0,handler:function(e,t){var i=this;if(!t||e.length!==t.length||!e.every(function(e){return t.indexOf(e)>-1})){var n=[],s=this.checkableData.map(function(e){return e[i.keyProp]});e.forEach(function(e){s.indexOf(e)>-1&&n.push(e)}),this.checkChangeByUser=!1,this.checked=n}}}},computed:{filteredData:function(){var e=this;return this.data.filter(function(t){return\"function\"==typeof e.filterMethod?e.filterMethod(e.query,t):(t[e.labelProp]||t[e.keyProp].toString()).toLowerCase().indexOf(e.query.toLowerCase())>-1})},checkableData:function(){var e=this;return this.filteredData.filter(function(t){return!t[e.disabledProp]})},checkedSummary:function(){var e=this.checked.length,t=this.data.length,i=this.format,n=i.noChecked,s=i.hasChecked;return n&&s?e>0?s.replace(/\\${checked}/g,e).replace(/\\${total}/g,t):n.replace(/\\${total}/g,t):e+\"/\"+t},isIndeterminate:function(){var e=this.checked.length;return e>0&&e<this.checkableData.length},hasNoMatch:function(){return this.query.length>0&&0===this.filteredData.length},inputIcon:function(){return this.query.length>0&&this.inputHover?\"circle-close\":\"search\"},labelProp:function(){return this.props.label||\"label\"},keyProp:function(){return this.props.key||\"key\"},disabledProp:function(){return this.props.disabled||\"disabled\"},hasFooter:function(){return!!this.$slots.default}},methods:{updateAllChecked:function(){var e=this,t=this.checkableData.map(function(t){return t[e.keyProp]});this.allChecked=t.length>0&&t.every(function(t){return e.checked.indexOf(t)>-1})},handleAllCheckedChange:function(e){var t=this;this.checked=e?this.checkableData.map(function(e){return e[t.keyProp]}):[]},clearQuery:function(){\"circle-close\"===this.inputIcon&&(this.query=\"\")}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-transfer-panel\"},[i(\"p\",{staticClass:\"el-transfer-panel__header\"},[i(\"el-checkbox\",{attrs:{indeterminate:e.isIndeterminate},on:{change:e.handleAllCheckedChange},model:{value:e.allChecked,callback:function(t){e.allChecked=t},expression:\"allChecked\"}},[e._v(\"\\n      \"+e._s(e.title)+\"\\n      \"),i(\"span\",[e._v(e._s(e.checkedSummary))])])],1),i(\"div\",{class:[\"el-transfer-panel__body\",e.hasFooter?\"is-with-footer\":\"\"]},[e.filterable?i(\"el-input\",{staticClass:\"el-transfer-panel__filter\",attrs:{size:\"small\",placeholder:e.placeholder},nativeOn:{mouseenter:function(t){e.inputHover=!0},mouseleave:function(t){e.inputHover=!1}},model:{value:e.query,callback:function(t){e.query=t},expression:\"query\"}},[i(\"i\",{class:[\"el-input__icon\",\"el-icon-\"+e.inputIcon],attrs:{slot:\"prefix\"},on:{click:e.clearQuery},slot:\"prefix\"})]):e._e(),i(\"el-checkbox-group\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.hasNoMatch&&e.data.length>0,expression:\"!hasNoMatch && data.length > 0\"}],staticClass:\"el-transfer-panel__list\",class:{\"is-filterable\":e.filterable},model:{value:e.checked,callback:function(t){e.checked=t},expression:\"checked\"}},e._l(e.filteredData,function(t){return i(\"el-checkbox\",{key:t[e.keyProp],staticClass:\"el-transfer-panel__item\",attrs:{label:t[e.keyProp],disabled:t[e.disabledProp]}},[i(\"option-content\",{attrs:{option:t}})],1)})),i(\"p\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.hasNoMatch,expression:\"hasNoMatch\"}],staticClass:\"el-transfer-panel__empty\"},[e._v(e._s(e.t(\"el.transfer.noMatch\")))]),i(\"p\",{directives:[{name:\"show\",rawName:\"v-show\",value:0===e.data.length&&!e.hasNoMatch,expression:\"data.length === 0 && !hasNoMatch\"}],staticClass:\"el-transfer-panel__empty\"},[e._v(e._s(e.t(\"el.transfer.noData\")))])],1),e.hasFooter?i(\"p\",{staticClass:\"el-transfer-panel__footer\"},[e._t(\"default\")],2):e._e()])},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i(\"div\",{staticClass:\"el-transfer\"},[i(\"transfer-panel\",e._b({ref:\"leftPanel\",attrs:{data:e.sourceData,title:e.titles[0]||e.t(\"el.transfer.titles.0\"),\"default-checked\":e.leftDefaultChecked,placeholder:e.filterPlaceholder||e.t(\"el.transfer.filterPlaceholder\")},on:{\"checked-change\":e.onSourceCheckedChange}},\"transfer-panel\",e.$props,!1),[e._t(\"left-footer\")],2),i(\"div\",{staticClass:\"el-transfer__buttons\"},[i(\"el-button\",{class:[\"el-transfer__button\",e.hasButtonTexts?\"is-with-texts\":\"\"],attrs:{type:\"primary\",disabled:0===e.rightChecked.length},nativeOn:{click:function(t){e.addToLeft(t)}}},[i(\"i\",{staticClass:\"el-icon-arrow-left\"}),void 0!==e.buttonTexts[0]?i(\"span\",[e._v(e._s(e.buttonTexts[0]))]):e._e()]),i(\"el-button\",{class:[\"el-transfer__button\",e.hasButtonTexts?\"is-with-texts\":\"\"],attrs:{type:\"primary\",disabled:0===e.leftChecked.length},nativeOn:{click:function(t){e.addToRight(t)}}},[void 0!==e.buttonTexts[1]?i(\"span\",[e._v(e._s(e.buttonTexts[1]))]):e._e(),i(\"i\",{staticClass:\"el-icon-arrow-right\"})])],1),i(\"transfer-panel\",e._b({ref:\"rightPanel\",attrs:{data:e.targetData,title:e.titles[1]||e.t(\"el.transfer.titles.1\"),\"default-checked\":e.rightDefaultChecked,placeholder:e.filterPlaceholder||e.t(\"el.transfer.filterPlaceholder\")},on:{\"checked-change\":e.onTargetCheckedChange}},\"transfer-panel\",e.$props,!1),[e._t(\"right-footer\")],2)],1)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(483),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(484),s=i.n(n),r=i(485),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElContainer\",componentName:\"ElContainer\",props:{direction:String},computed:{isVertical:function(){return\"vertical\"===this.direction||\"horizontal\"!==this.direction&&(!(!this.$slots||!this.$slots.default)&&this.$slots.default.some(function(e){var t=e.componentOptions&&e.componentOptions.tag;return\"el-header\"===t||\"el-footer\"===t}))}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"section\",{staticClass:\"el-container\",class:{\"is-vertical\":e.isVertical}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(487),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(488),s=i.n(n),r=i(489),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElHeader\",componentName:\"ElHeader\",props:{height:{type:String,default:\"60px\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"header\",{staticClass:\"el-header\",style:{height:e.height}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(491),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(492),s=i.n(n),r=i(493),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElAside\",componentName:\"ElAside\",props:{width:{type:String,default:\"300px\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"aside\",{staticClass:\"el-aside\",style:{width:e.width}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(495),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(496),s=i.n(n),r=i(497),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElMain\",componentName:\"ElMain\"}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"main\",{staticClass:\"el-main\"},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r},function(e,t,i){\"use strict\";t.__esModule=!0;var n=i(499),s=function(e){return e&&e.__esModule?e:{default:e}}(n);s.default.install=function(e){e.component(s.default.name,s.default)},t.default=s.default},function(e,t,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=i(500),s=i.n(n),r=i(501),o=i(0),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,i){\"use strict\";t.__esModule=!0,t.default={name:\"ElFooter\",componentName:\"ElFooter\",props:{height:{type:String,default:\"60px\"}}}},function(e,t,i){\"use strict\";var n=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"footer\",{staticClass:\"el-footer\",style:{height:e.height}},[e._t(\"default\")],2)},s=[],r={render:n,staticRenderFns:s};t.a=r}])});"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/element/styles/fonts/iconfont.css",
    "content": "\n@font-face {font-family: \"iconfont\";\n  src: url('iconfont.eot?t=1545906456142'); /* IE9*/\n  src: url('iconfont.eot?t=1545906456142#iefix') format('embedded-opentype'), /* IE6-IE8 */\n  url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABDgAAsAAAAAGWQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8eknTY21hcAAAAYAAAADHAAAClLYPuqVnbHlmAAACSAAADAIAABFknfX9DGhlYWQAAA5MAAAAMQAAADYUAdgtaGhlYQAADoAAAAAgAAAAJAgsA9hobXR4AAAOoAAAAB4AAABAQJv//GxvY2EAAA7AAAAAIgAAACInRCKWbWF4cAAADuQAAAAfAAAAIAEnAKZuYW1lAAAPBAAAAUUAAAJtPlT+fXBvc3QAABBMAAAAkwAAAMLsflf6eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk4WKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMT+/xtzwv4EhhrmRoREozAiSAwDwrAzJeJzlkr0Ng0AMhR/hJ38kpENCKYJERyrWYQGWYJVMkyoNqRATPMYg7zAtLBCfvpPsO1uWnwGEAHzxFAHgfeHB2UdRb477OM3xAC/5d9wUiRkyZcacBUtWrNmwZcdh7KcJoL/1umqeqj9WjuvuigR7dexjh7O6uuCACEflxUqONir/i8Xz/V68xClhOG25oDmCoTH/SQ3NFswMtxfMDbcfLAxNHiwNaQBWhtsR1oZ0ARtDCoGtIa3AzpBq4GC4PRt7A/EP7SNP4wB4nI1Ya2wcVxW+5877PbOzO2Ovd9eeWe+O37H3NXbs2us6iWPHacCJkzaFkgdpQlowCUoACdTQVqJCCKMGlQIp/IDylFqQqAhFQIVaAT+gFaoK4QeNSBBCvKRCC4J6wrm7doiaIuFM7j3nzJlz5577nccs4a4l1+7jKfcR8iB5lHyGkJJncuEImCCZ4HuSyRXDclQcgVBEQThCoxGIG2UcJVESoxEubsTTUGOC2jSNG57voYBuAVSb5qoVzy9AhalUKwXqe/hMoaVVAMaYkMYH8N8ECJVpWhuhoUnTBVqdoNw6J1lel+sHYah3KZZmifmwZCkpjupbl6Z0MZMvR92SCIoudlpDab/DsvWMrVDODer1QDUU09UUWw3mc4bOAUd5Xgz7SprpcHq8NKkLKdXuLRYUgedMrb47kLOy08lzjhKO9geSqPMJHbt9tlSavf3o/tlyeXZ/5VWjXO42JJHTjNyOHs9TXEuxlLBSCQxdczxNyridszlbBZB5Uegp9xsdkjG1tNXgOnPFoEsSKGeoWSMq2Z6YEm3fkl01PzwQKK5idVhKWujZURcsgcr2TE8qw+Gj4zovqNbR0q0Hjh5gr4LTrSVCNIJ/3AH6baR80kP6SY00yW5yJzlBzpIH8AxHIJqGGH1sAocniQSyI8DhITUqXlqMmOMrjVpZCqPyDDQ8C0R/BOq1Ch5M1UtzYfmWlmoe0qJU3gLlafC6gR2fFF7nTCiFeO4zMA0FYBbCGxjaffh5Rfn5oaPPy/Lzh+/6liQ+ceSdT4rSU28fiOO94+P94fDw3PDwDo4TBVHSRJ4LOkMHwEvJqqSptqa9TxMdjrdMLsUJEn9KFjsEQBSwEeo8Lwm8w5smjuIRSQOhU7B0EDvEb8I9Bw/eA+3xJL1r+9xhyh2ZnXtH8m+I9+La8TeBrTw33KC4H8EUOW4fBJ2K4vjgQE6Vx2VNw0GVQA0lU+KlomTydFDsEi0N2KgOUt5EKY93Q3VItVDIXq1LJBwh185xf+FOE4eUyBwhEEYKiGG5FkOj4gM6n0VUrRFXK426w3yccUwQMMIiZxoYV4BJPAlUKKDzByGDT7ykSkklqUiuKcFvZFeClyXrp19RTVP9SqbLTJvQSGa/2t8AMJDuSn/S0P6qGob6KwPGZfhbYsh2WqaiLK//S07byU4Lj67gQU6zLC25OjQJMDkEf2xxGa/wB80EMD3rD5pFiIH7eYZ7hmsi1lySJSEZQLRN4s52kWXyNnKU3IN7vAFjLLKL5agRI26iAkAj9iqx52eQDVHiohM8XwyjRsQUpkFCTipOg4sOqDIaH0AoCqiCViq+6DOBCTGzWTWBkh+sC8L6D1rjR/MBf5nqdw5s3+Xk40PJZ6mx5cgWg1Jj9DBO+4yc0esN7B/wglxqYT469MRb79TpZT7Ibz43v5DKxYcghYqlDCpmenKpXdtRceVAS5Frbi6F4+XBQ7WlXcaSpy3OmxPJ7xd38PyOxfGFeZ6fX4AvAuy6g+fvaG7brfr9E+e7jIXbaoeSM/jQbQvGkq/u3mZOLAPsWeH5lW3bdmvedSUMZ7GFm09jHi6RMXILuY0cIh8mxG/DImaRiE5GbPgBsg6K6+UGIsRH8EiYXD0GFYYrdwM2jI4QRpPQzgRVZkJoVLoxfeMRYISGLEm7bJIYPmcgQpA2rt/3vfSPR5uUNkctL+gDqPXDKxFCrL9IM9boLMDsaPKPq5bnWVetTMa6Tr2YsUvQHBttQp+dSULBlGYekhzeMM4rNr8ow0vITE1JjiZNTkqSaU5NiY5gGDidQ5P062NNyNgNqTtY/2FfHaDeR2eDgtBIeWh0fT9beDTT3YEXvn2m4HmFzFVcqP1CuPSfeH76IWb3U4KwKNvJe0URTRuOMIlrCrqOjGiZU5OCQ+DaNUJ4id5OjiOGy5gM0CvtSyqypMcuykqb2YK1JKa9xgw6pptiGQMkMQtuUn61EaPSNNSjSqOKBa/NbYEZukE04gb3mmILvbVht7PWU66PjMRDlUZ/vmpq6cFGt+DYgmD2eUuC6YiLPZqey+3gUMjN58qxAVrKoEZ3fiLjGWDamsHL3LjRpTV5y5GEZjSWXRRSJoiLlaJO3yoI8uRoaFhZHdMAgKppelYWjdLYtCyotpKrd+6SUhoVF7Ky5Bh3y44synermnFKNaimrvIA/KqqcaZ8ilqcIpxQJNFWTrgFb0ECw5Z2jo1nCREYZnngzpEiGSITZJ6sEBKzklBvkNgjPtaOVuZDpyBgEahpVvgx222WHy4UMw4jMROWI+Z4ZFgJGYFiaLaKDKrhMTxp6/NLIgSXLkEg7prXuzu0qRn+1YsX/y40pxReScN2x/NCz3Nak2/b+qre0W2syoKS1vW0IsireuCj0NB3fvduZkVMXr507OKC5nfrt1zYf/FVXvj7xQOfm1Z8z8DyFvh+4NH3+3YSoUUHLtn+HtBW9Z4OfVXxfcPwfWVV83v0VY3wLT/sQT9IrSzpI5rqQSZwAofDQfDjSIokn0MRfS55LjnL7/n863/m3KTv7Hfj+88+HM/BpSTixvbsWZ+kz61fgo+9dPbp+CNnHx5Pnv485gZ5w887iYXWe0kfGSdTZIm8BddhdaOOYGOpIIN5O1OtA6vQGM4s1r00+pST/PhNFd9M9okrGIAYaldaEZX8+Qp8Yqh4OgxPF+9oT8OnTp1OyBu16E0SYOF8g3DflSvJN/5rhk2wcur06fXcm+jdJCIbfniG+wnWolmsPnvIQXIXOUXOkHPoh6gcsrDNtOY6g0ybb0FoBjKtSL3ONuI6Bje2rnV/k0VPxH6G6cQZqQ4ZifHsZhT7Uiy17KIIVVENzdSjOpqMmB0m4S5+R7bl71ig4qTaGwxYjFDBwpyzwbSkjFU3mPWda2trxyw4Mw/ja2v+CRSf+NHi4uLXvAeQfMC7z4JsFqz75ud/uYbzsbU1+ouTPH9SSSki9rQ4tbkXWwTjeX6Ta4sZz3RbXPLy8peXl3NbldQHHl3pW0l+8/jy8uPGFM9PdQ0ODh42lnh+ycgtKKlHLOuRlLKwt29///Cy9YGUMtmFmq1zuHYN8UgQ7wyPRRKRGDsCdiIEgnZEVwNs+rFKMfy7gQlvlJVabt88prSPPo7gBj2WD5gefC85bqaxqfmM5QK4Y4iMlfBmERxSc+rPVLxa0+8uXHgM3pUct1zXYmptJe4+1/qvLDkOK0kRmGjTGhOdv26ETU899thjyc9uUkIfsJh/Fvuiftz9PNlL7sCuu459D4Z6OaoXsd3BiMcyksGeBsMPG6BqHQtEjE0M5jmK5x+x2sJAOEM3igqiSsA9o2YQsb1XfcwY3BeWpezW4tbicGUYx61ZafmNgjHB1cxsdyrVnTU1V6D0DXxyJHmFy1WSkYeSX0MzeeXyR+Gp169+vf14l7i8LHZt2pvo3Vygd6I4LP0Pg5v80/D60M/vf/0Jruf+6Y0e5mXuXq6AuOjALDWGcbpIiBsUoPUdEYwA+6rwr2f//32j/eVRDNrfIX4otm/8lL7HKxS89YdxXMP/Q/n82v8l4nAl7wQabU9VyKNwKJ8kN4mZerJe8I4zEzjU8sN5vBjuWb27zK1xPcTETrhMKpiFSau0BZu9GSZ89o0VB6wJi26g4xvpolNtN3H0t7jw+j/aL0CnXkj+aKUxY2fYeAMdJ4+36DsRhK/Vai11+uDGe6/34Uy/lCjgFlhAFNzn34Tavv5utsSgl9+o24jdc1ipBkiDzJD34z42MmGjhvUbsx1+m2O/43sufpQUaFrcbBixw2z1+VGr53fZflirCWVs17GFan3PF7CrN2k4QuNyo/X7QL39c0H7e79AK2iB/WgA0gvOqPNCNYt/x25tfqx56zFGvn3g5NmTe4eG+p8VdOHZ/qGhf247SOnBbe1xYGJi38QEfL93urffSoOhlYPJQYDBM+e/dP4MIyaDsmZA2uovzvTauZzd+6ELT1z4ECMh/6LjvFiba358du54VzbbdXxu9uPNObgwMDy8794P3jvwE57/8SASyZPXl9t2ECiwFfdNrL+WTWsydSzNprLqFhWlWHLdEptdVaa2ZjlU1tJZvVQr6dkonY5a5H8AohX6hAAAeJxjYGRgYADiatO2JfH8Nl8ZuFkYQOCG1ykJGP3/3/96Fn/mRiCXg4EJJAoAPl4L7wAAAHicY2BkYGBu+N/AEMPi9//f/58s/gxAERQgAACtogcLeJxjYWBgYGH4/4/FG0Qj4///wbQfFjEkDAACRAbTAAAAAAAAANoBqAIQAsQDfgQeBKIE0gVWBhoGnAcmB5YH+giyAAB4nGNgZGBgEGCYxcDLAAJMQMwFhAwM/8F8BgAaLwHOAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG2LSxKCMBBE0/xEJIoH4RAu3XmFQIVkqnT4OYVwemOx9a26+nWrSO0U6j8VIsRIkCLDATmOKHBCCY0zLqhwVdlgafOUb96yWw0nvn/ZchTDjXyIF8tpa2dPaUM/25lGshBCkztD1PZcx7fHXbfe8EDswvFJerbvOqiOnEw262SRkTRbmnp2+yQZZRWlvuh6LpsA') format('woff'),\n  url('iconfont.ttf?t=1545906456142') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/\n  url('iconfont.svg?t=1545906456142#iconfont') format('svg'); /* iOS 4.1- */\n}\n\n.iconfont {\n  font-family:\"iconfont\" !important;\n  font-size:16px;\n  font-style:normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-peizhi:before { content: \"\\e6d8\"; }\n\n.icon-zhengyan:before { content: \"\\e624\"; }\n\n.icon-home:before { content: \"\\e621\"; }\n\n.icon-quanbuxinwen:before { content: \"\\e603\"; }\n\n.icon-ceshi:before { content: \"\\e61a\"; }\n\n.icon-biyan:before { content: \"\\e67d\"; }\n\n.icon-fabu:before { content: \"\\e617\"; }\n\n.icon-yanshi:before { content: \"\\e668\"; }\n\n.icon-gaiicon-:before { content: \"\\e6cf\"; }\n\n.icon-API:before { content: \"\\e632\"; }\n\n.icon-chanpinguanli:before { content: \"\\e62b\"; }\n\n.icon-set-configure:before { content: \"\\e7d6\"; }\n\n.icon-fuwuqi:before { content: \"\\e65b\"; }\n\n.icon-neirongguanli:before { content: \"\\e604\"; }\n\n.icon-quyu:before { content: \"\\e605\"; }\n\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/element/styles/fonts/iconfont.js",
    "content": "!function(h){var c,o='<svg><symbol id=\"icon-peizhi\" viewBox=\"0 0 1024 1024\"><path d=\"M1021.376 651.136c1.472 8.832 1.152 19.392-1.152 31.872-2.112 12.48-5.824 25.152-10.944 37.952-5.12 12.864-11.328 24.384-18.624 34.624-7.296 10.304-15.488 17.6-24.128 22.016-8.832 4.48-16.512 6.656-23.104 6.656-6.592 0-13.824-1.408-21.888-4.416-7.296-2.176-16.512-4.224-27.456-6.08-11.072-1.792-22.144-2.112-33.536-1.088-11.328 1.088-22.656 3.456-33.984 7.104-11.264 3.584-21.12 9.92-29.056 18.688-17.6 18.304-27.968 39.232-30.848 62.72-2.88 23.488 0.384 45.824 9.92 67.072 7.296 14.72 6.208 29.312-3.264 43.968-4.352 5.888-11.456 11.904-20.864 18.112-9.536 6.272-20.032 11.968-31.296 17.088-11.264 5.184-23.232 9.152-35.776 12.16C672.896 1022.528 661.952 1024 652.352 1024c-6.592 0-12.672-2.56-18.624-7.68-5.824-5.184-9.792-10.688-12.096-16.512L620.48 999.808c-8.064-22.784-21.76-42.304-41.152-58.816-19.392-16.512-41.856-24.768-67.584-24.768-24.896 0-47.424 8.256-67.52 24.768-20.16 16.512-34.24 35.712-42.304 57.728-3.648 8.832-9.152 15.232-16.512 19.264C378.24 1022.016 370.176 1024 361.344 1024c-10.24 0-21.76-1.792-34.56-5.568-12.8-3.648-25.664-8.256-38.464-13.76-12.8-5.504-24.384-11.904-34.624-19.264-10.24-7.296-17.92-14.656-23.04-21.952-3.648-5.184-5.696-11.2-6.08-18.112-0.384-6.976 2.368-16.704 8.256-29.184 8.064-16.896 11.136-36.096 9.344-57.792-1.792-21.632-11.136-41.6-28.032-59.904-10.24-11.008-22.656-18.112-37.312-21.44-14.656-3.328-28.544-4.608-41.728-3.84-15.424 0.704-31.104 3.648-47.232 8.832-10.24 2.88-20.48 2.112-30.784-2.24-8.064-2.88-15.552-9.664-22.528-20.288-6.976-10.624-13.12-22.464-18.688-35.2-5.504-12.864-9.664-25.984-12.608-39.616-2.88-13.568-3.648-24.704-2.176-33.536C3.264 635.008 10.56 624.768 23.04 620.352c21.952-8.832 41.664-23.296 59.264-43.52 17.6-20.16 26.368-42.688 26.368-67.648 0-25.6-8.768-48-26.368-67.072C64.704 422.976 44.928 409.088 22.976 400.256c-6.4-2.048-11.904-7.36-16.256-15.808C2.304 376 0.064 367.36 0.064 358.656c0-9.536 1.472-20.224 4.352-31.936 2.88-11.712 6.784-23.104 11.52-34.112C20.736 281.6 26.304 271.552 32.448 262.336 38.72 253.248 45.504 246.4 52.736 241.984c5.888-3.648 11.584-5.12 17.088-4.416 5.504 0.704 11.52 2.176 18.112 4.416 21.952 8.832 44.864 11.52 68.672 8.256 23.744-3.264 44.864-13.76 63.168-31.296 8.768-8.832 15.168-19.648 19.2-32.448 3.968-12.928 6.656-25.536 7.68-38.016 1.152-12.48 1.152-23.808 0-34.048C245.568 104.128 244.608 96.832 243.904 92.48c-1.472-4.416-2.752-9.6-3.84-15.424C238.912 71.168 239.488 65.984 241.664 61.632c4.352-10.24 12.224-19.2 23.616-26.88 11.328-7.68 23.552-14.144 36.8-19.264 13.184-5.184 26.048-8.96 38.464-11.648C352.96 1.28 362.88 0 370.176 0 379.648 0 387.2 3.072 392.704 9.344c5.504 6.272 9.28 12.736 11.456 19.328 8.064 19.776 21.248 37.12 39.552 52.224 18.304 15.04 39.936 22.592 64.832 22.592 25.664 0 48.32-7.168 68.096-21.504C596.416 67.648 610.304 49.536 618.368 27.52 621.248 21.632 625.92 15.552 632.064 9.408c6.208-6.272 12.544-9.344 19.264-9.344 10.176 0 21.376 1.408 33.472 4.416 12.096 2.88 24 6.976 35.648 12.16 11.84 5.12 22.656 11.712 32.448 19.776 9.92 8.064 17.728 16.832 23.616 26.368 3.648 5.888 4.736 12.288 3.264 19.2-1.472 6.976-2.88 11.904-4.352 14.848-9.536 21.312-12.416 43.584-8.832 67.072 3.648 23.424 14.336 44.032 31.808 61.632 17.6 17.6 39.232 27.264 64.832 29.184 25.664 1.792 49.472-2.368 71.424-12.672 5.824-3.648 12.928-5.184 21.376-4.416 8.448 0.768 15.488 4.096 21.376 9.856 10.944 10.24 20.608 25.856 29.056 46.784 8.448 20.928 14.08 41.984 17.024 63.232 1.472 12.48-0.512 22.208-5.952 29.184-5.568 6.912-11.2 11.52-17.152 13.76-22.656 8.064-41.984 22.208-58.112 42.304-16.128 20.096-24.128 43.072-24.128 68.736 0 24.96 6.784 46.784 20.224 65.472 13.568 18.624 31.296 32.064 53.184 40.128 5.184 2.88 9.536 5.888 13.184 8.768C1012.992 632.448 1018.496 640.896 1021.376 651.136L1021.376 651.136 1021.376 651.136 1021.376 651.136zM510.72 750.144c32.896 0 64.128-6.272 93.312-18.688 29.312-12.48 54.784-29.696 76.416-51.648 21.632-22.08 38.656-47.488 51.072-76.48 12.416-28.992 18.624-59.968 18.624-92.928 0-33.024-6.208-64-18.624-92.928-12.416-28.992-29.44-54.336-51.072-75.904-21.632-21.632-47.04-38.72-76.416-51.136C574.848 277.952 543.616 271.68 510.72 271.68c-32.896 0-63.936 6.272-92.864 18.688-28.8 12.48-54.144 29.568-75.648 51.2C320.64 363.136 303.552 388.544 291.136 417.472 278.656 446.4 272.448 477.44 272.448 510.4s6.272 63.936 18.688 92.928c12.416 28.928 29.504 54.4 51.072 76.48 21.568 22.016 46.912 39.168 75.776 51.648C446.912 743.872 477.824 750.144 510.72 750.144L510.72 750.144 510.72 750.144 510.72 750.144zM510.72 750.144\"  ></path></symbol><symbol id=\"icon-zhengyan\" viewBox=\"0 0 1099 1024\"><path d=\"M542.66 720.4c-118.1 0-312.4-80.5-312.4-198.3S423.46 324 541.46 324c120.1 0 313.5 80.3 313.5 198.1C855.06 639.9 660.86 720.4 542.66 720.4zM542.66 357.5c-116.3 0-277.3 75.1-277.3 164.6 0 86.9 155.2 165.8 277.3 165.8 126.8 0 281.3-82.2 281.3-165.8C823.86 435.2 657.36 357.5 542.66 357.5zM542.66 621.5c-54 0-97.9-43.9-97.9-97.9s43.9-97.9 97.9-97.9 97.9 43.9 97.9 97.9C640.66 577.6 596.66 621.5 542.66 621.5zM542.66 444.4c-43.7 0-79.3 35.6-79.3 79.2 0 43.7 35.6 79.2 79.3 79.2s79.2-35.5 79.2-79.2S586.36 444.4 542.66 444.4zM506.06 499.3c-2.2 0-4.5-0.8-6.3-2.4-3.8-3.5-4.1-9.4-0.6-13.1 1.9-2 3.8-3.9 6-5.7 4-3.3 9.9-2.7 13.1 1.3 3.3 4 2.7 9.9-1.3 13.1-1.5 1.2-2.9 2.5-4.1 3.9C511.06 498.3 508.56 499.3 506.06 499.3zM542.66 582.7c-32.6 0-59.1-26.5-59.1-59 0-5.2 4.2-9.3 9.3-9.3 5.2 0 9.3 4.2 9.3 9.3 0 22.3 18.1 40.4 40.4 40.4 5.2 0 9.3 4.2 9.3 9.3C551.96 578.5 547.76 582.7 542.66 582.7zM541.46 298.3c-10.3 0-18.7-8.3-18.7-18.7l0-56c0-10.3 8.3-18.7 18.7-18.7 10.3 0 18.7 8.3 18.7 18.7l0 56C560.16 289.9 551.76 298.3 541.46 298.3zM434.06 304.6c-6.9 0-13.4-3.8-16.6-10.3L400.06 260c-4.6-9.2-0.9-20.4 8.3-25 9.2-4.6 20.4-0.9 25 8.3l17.3 34.3c4.6 9.2 0.9 20.4-8.3 25C439.76 303.9 436.86 304.6 434.06 304.6zM325.16 347.9c-5.1 0-10.2-2.1-13.8-6.2l-24.3-27c-6.9-7.7-6.2-19.4 1.4-26.4 7.6-6.9 19.4-6.3 26.4 1.4l24.3 27c6.9 7.7 6.2 19.4-1.4 26.4C334.16 346.3 329.66 347.9 325.16 347.9zM641.36 304.6c-2.8 0-5.7-0.6-8.4-2-9.2-4.6-12.9-15.8-8.3-25l17.3-34.3c4.6-9.2 15.8-12.9 25-8.3 9.2 4.6 12.9 15.8 8.3 25l-17.3 34.3C654.76 300.9 648.16 304.6 641.36 304.6zM750.16 347.9c-4.4 0-8.9-1.6-12.4-4.8-7.7-6.9-8.3-18.7-1.4-26.4l24.3-27c6.9-7.6 18.7-8.3 26.4-1.4 7.7 6.9 8.3 18.7 1.4 26.4l-24.3 27C760.36 345.8 755.26 347.9 750.16 347.9z\"  ></path></symbol><symbol id=\"icon-home\" viewBox=\"0 0 1024 1024\"><path d=\"M981.735378 583.916922c-6.122924 0-12.245848-2.528837-16.917256-7.585505L503.14643 76.890125 41.478762 576.331416c-9.347845 10.113336-24.491696 10.113336-33.838535 0-9.347845-10.111325-9.347845-26.493441 0-36.606777L486.228168 21.980965c9.346839-10.11233 24.489684-10.11233 33.838535 0l478.58593 517.74468c9.347845 10.113336 9.347845 26.495452 0 36.606777C993.981226 581.38909 987.858302 583.916922 981.735378 583.916922zM790.300201 1023.99995 622.793415 1023.99995c-13.224591 0-23.929397-11.577929-23.929397-25.886882 0-14.308953 10.704807-25.885876 23.929397-25.885876l167.506786 0c26.383797 0 47.858794-23.235325 47.858794-51.775776L838.158995 635.691691c0-14.309959 10.702795-25.886882 23.929397-25.886882 13.224591 0 23.929397 11.577929 23.929397 25.886882l0 284.759725C886.017789 977.559477 843.089926 1023.99995 790.300201 1023.99995zM383.50045 1023.99995 215.995677 1023.99995c-52.790731 0-95.7196-46.440473-95.7196-103.548534L120.276076 428.592612c0-14.308953 10.704807-25.886882 23.929397-25.886882 13.227608 0 23.929397 11.577929 23.929397 25.886882l0 491.858804c0 28.540451 21.476003 51.775776 47.860806 51.775776l143.575377 0L359.571053 739.240225c0-14.308953 10.701789-25.886882 23.929397-25.886882l239.292965 0c13.227608 0 23.929397 11.578935 23.929397 25.886882 0 14.309959-10.701789 25.886882-23.929397 25.886882l-215.363568 0 0 232.984955C407.429847 1012.42202 396.727053 1023.99995 383.50045 1023.99995z\"  ></path></symbol><symbol id=\"icon-quanbuxinwen\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64a448 448 0 1 0 0 896A448 448 0 0 0 512 64z m324.672 228.8a388.288 388.288 0 0 1 66.24 191.168h-224.128a1081.088 1081.088 0 0 0-14.08-151.424c60.672-8.512 118.4-21.888 171.968-39.744z m-38.528-48.32c-45.76 14.464-94.016 25.472-144.32 32.896a919.04 919.04 0 0 0-45.696-145.024 392.704 392.704 0 0 1 190.016 112.128z m-396.8 239.552c1.472-49.344 5.952-97.792 14.4-144.384 31.488 2.752 63.552 4.352 96.256 4.352s64.768-1.6 96.256-4.352c8.512 46.592 12.992 95.04 14.464 144.384H401.344z m221.312 56a965.504 965.504 0 0 1-14.4 144.384A1079.296 1079.296 0 0 0 512 680c-32.704 0-64.768 1.6-96.256 4.352a973.12 973.12 0 0 1-14.4-144.32h221.312zM484.8 121.344c9.024-0.576 17.984-1.344 27.2-1.344s18.176 0.768 27.2 1.344c23.808 49.664 43.136 104.896 57.408 163.456-27.84 2.432-56.064 3.904-84.608 3.904s-56.768-1.472-84.608-3.904c14.272-58.56 33.6-113.792 57.408-163.456z m-68.928 11.008c-18.688 45.056-33.92 93.696-45.632 145.024a920.704 920.704 0 0 1-144.384-32.896 392.96 392.96 0 0 1 190.016-112.128zM187.328 292.8c53.632 17.792 111.296 31.168 171.968 39.744-8.32 48.576-12.672 99.392-14.08 151.488H121.088a388.288 388.288 0 0 1 66.24-191.232z m0 438.4a388.288 388.288 0 0 1-66.24-191.168h224.128c1.408 52.032 5.76 102.848 14.016 151.424-60.608 8.576-118.272 21.888-171.904 39.744z m38.528 48.32a934.528 934.528 0 0 1 144.32-32.896c11.712 51.264 27.008 100.032 45.632 145.024a393.088 393.088 0 0 1-189.952-112.128z m313.344 123.136c-9.024 0.576-17.984 1.344-27.2 1.344s-18.176-0.768-27.2-1.344a832.192 832.192 0 0 1-57.408-163.456c27.84-2.432 56.064-3.904 84.608-3.904s56.768 1.408 84.608 3.904a837.888 837.888 0 0 1-57.408 163.456z m68.928-11.008c18.624-44.992 33.92-93.76 45.696-145.024 50.304 7.424 98.56 18.432 144.32 32.896a392.704 392.704 0 0 1-190.016 112.128z m228.544-160.448a988.992 988.992 0 0 0-171.968-39.744c8.256-48.576 12.608-99.392 14.08-151.424h224.128a388.288 388.288 0 0 1-66.24 191.168z\" fill=\"#323333\" ></path></symbol><symbol id=\"icon-ceshi\" viewBox=\"0 0 1024 1024\"><path d=\"M199.111111 1024c-62.577778 0-113.777778-51.2-113.777778-113.777778V227.555556c0-62.577778 51.2-113.777778 113.777778-113.777778 19.911111 0 36.977778 17.066667 36.977778 36.977778v54.044444c-42.666667 11.377778-73.955556 25.6-73.955556 71.111111V853.333333c0 51.2 39.822222 93.866667 93.866667 93.866667h497.777778c51.2 0 93.866667-42.666667 93.866666-93.866667V275.911111c0-45.511111-31.288889-59.733333-76.8-68.266667V153.6c-2.844444-22.755556 14.222222-39.822222 34.133334-39.822222 62.577778 0 113.777778 51.2 113.777778 113.777778v682.666666c0 62.577778-51.2 113.777778-113.777778 113.777778H199.111111z m341.333333-304.355556h227.555556c19.911111 0 36.977778 17.066667 36.977778 36.977778S787.911111 796.444444 768 796.444444h-227.555556c-19.911111 0-36.977778-17.066667-36.977777-36.977777s17.066667-39.822222 36.977777-39.822223z m0-301.511111h227.555556c19.911111 0 36.977778 17.066667 36.977778 36.977778s-17.066667 36.977778-36.977778 36.977778h-227.555556c-19.911111 0-36.977778-17.066667-36.977777-36.977778s17.066667-36.977778 36.977777-36.977778z m-227.555555-227.555555V150.755556c0-19.911111 17.066667-36.977778 36.977778-36.977778h36.977777c0-62.577778 51.2-113.777778 113.777778-113.777778s113.777778 51.2 113.777778 113.777778H654.222222c19.911111 0 36.977778 17.066667 36.977778 36.977778v36.977777L312.888889 190.577778z m-99.555556 233.244444c5.688889-5.688889 17.066667-5.688889 25.6 0l62.577778 62.577778 136.533333-136.533333c8.533333-8.533333 22.755556-8.533333 28.444445 0 8.533333 8.533333 8.533333 19.911111 0 28.444444l-147.911111 147.911111c-5.688889 2.844444-11.377778 5.688889-17.066667 5.688889-5.688889 0-8.533333-2.844444-11.377778-5.688889l-73.955555-73.955555c-11.377778-11.377778-11.377778-22.755556-2.844445-28.444445z m207.644445 403.911111c-8.533333 8.533333-22.755556 8.533333-28.444445 0L332.8 768l-59.733333 59.733333c-8.533333 8.533333-22.755556 8.533333-28.444445 0-8.533333-8.533333-8.533333-22.755556 0-28.444444l59.733334-59.733333-59.733334-59.733334c-8.533333-8.533333-8.533333-22.755556 0-28.444444 8.533333-8.533333 19.911111-8.533333 28.444445 0l59.733333 59.733333 59.733333-59.733333c8.533333-8.533333 22.755556-8.533333 28.444445 0 8.533333 8.533333 8.533333 19.911111 0 28.444444L361.244444 739.555556l59.733334 59.733333c8.533333 5.688889 8.533333 19.911111 0 28.444444z\" fill=\"#666666\" ></path></symbol><symbol id=\"icon-biyan\" viewBox=\"0 0 1024 1024\"><path d=\"M1013.628587 302.933333c-10.666667-6.4-23.466667-2.133333-29.866667 8.533334-23.466667 38.4-53.333333 74.666667-87.466667 106.666666l-44.8 34.133334c-12.8 8.533333-27.733333 17.066667-44.8 27.733333l-51.2 25.6c-21.333333 8.533333-44.8 17.066667-70.4 25.6l-53.333333 12.8c-29.866667 6.4-61.866667 10.666667-91.733333 10.666667h-55.466667c-29.866667 0-59.733333-4.266667-93.866667-10.666667l-53.333333-10.666667c-27.733333-8.533333-51.2-14.933333-70.4-23.466666l-51.2-25.6c-19.2-10.666667-32-19.2-44.8-27.733334l-42.666667-36.266666c-36.266667-32-64-70.4-85.333333-110.933334-6.4-10.666667-19.2-14.933333-29.866667-8.533333-10.666667 6.4-14.933333 19.2-8.533333 29.866667 19.2 38.4 46.933333 72.533333 76.8 106.666666L4.56192 512c-6.4 8.533333-6.4 23.466667 2.133333 29.866667 8.533333 8.533333 23.466667 6.4 29.866667-2.133334l74.666667-72.533333 32 25.6c14.933333 10.666667 29.866667 19.2 51.2 32l27.733333 12.8L151.76192 640c-4.266667 10.666667 0 23.466667 10.666667 29.866667 10.666667 4.266667 23.466667 0 27.733333-10.666667l70.4-102.4c19.2 6.4 40.533333 14.933333 66.133333 21.333333l55.466667 12.8-12.8 113.066667c-2.133333 12.8 6.4 23.466667 19.2 23.466667 10.666667 2.133333 21.333333-6.4 23.466667-19.2l12.8-110.933334c21.333333 2.133333 40.533333 4.266667 59.733333 4.266667h57.6c14.933333 0 27.733333-2.133333 42.666667-4.266667l12.8 110.933334c2.133333 12.8 12.8 21.333333 23.466666 19.2 10.666667-2.133333 19.2-12.8 19.2-23.466667l-12.8-113.066667c4.266667 0 10.666667-2.133333 14.933334-2.133333l55.466666-14.933333c17.066667-4.266667 36.266667-10.666667 51.2-17.066667l64 104.533333c4.266667 10.666667 17.066667 17.066667 27.733334 12.8 10.666667-4.266667 17.066667-17.066667 10.666666-27.733333l-64-104.533333 38.4-19.2c19.2-10.666667 34.133333-21.333333 49.066667-29.866667l25.6-21.333333 74.666667 72.533333c6.4 8.533333 21.333333 10.666667 29.866666 2.133333 8.533333-8.533333 10.666667-21.333333 2.133334-29.866666l-74.666667-72.533334c34.133333-32 61.866667-68.266667 85.333333-104.533333 8.533333-17.066667 6.4-29.866667-4.266666-36.266667z\" fill=\"#666767\" ></path></symbol><symbol id=\"icon-fabu\" viewBox=\"0 0 1024 1024\"><path d=\"M175.341883 883.081846a39.384615 39.384615 0 0 1-28.041846-11.736615A509.006769 509.006769 0 0 1 0.001575 512C0.001575 229.691077 229.692652 0 512.001575 0S1024.001575 229.691077 1024.001575 512a509.321846 509.321846 0 0 1-145.959384 357.927385 39.384615 39.384615 0 0 1-56.32-55.059693A430.946462 430.946462 0 0 0 945.232345 512C945.232345 273.092923 750.829883 78.769231 512.001575 78.769231A433.703385 433.703385 0 0 0 78.770806 512c0 114.530462 44.268308 222.444308 124.612923 304.049231a39.384615 39.384615 0 0 1-28.041846 67.032615zM512.001575 945.230769a39.384615 39.384615 0 1 0 0 78.769231 39.384615 39.384615 0 0 0 0-78.769231z\" fill=\"#999999\" ></path><path d=\"M512.001575 315.076923a39.384615 39.384615 0 0 0-39.384615 39.305846v472.615385a39.384615 39.384615 0 1 0 78.769231 0.078769v-472.615385a39.384615 39.384615 0 0 0-39.384616-39.384615z\" fill=\"#999999\" ></path><path d=\"M512.001575 236.307692a39.384615 39.384615 0 0 0-27.884307 11.579077L372.737575 359.266462a39.384615 39.384615 0 0 0 55.768616 55.689846l111.379692-111.379693A39.384615 39.384615 0 0 0 512.001575 236.307692z\" fill=\"#999999\" ></path><path d=\"M512.001575 236.307692a39.384615 39.384615 0 0 0-27.884307 67.268923L595.49696 414.956308a39.227077 39.227077 0 0 0 55.768615 0 39.384615 39.384615 0 0 0 0-55.689846L539.885883 247.886769A39.384615 39.384615 0 0 0 512.001575 236.307692z\" fill=\"#999999\" ></path></symbol><symbol id=\"icon-yanshi\" viewBox=\"0 0 1102 1024\"><path d=\"M708.923077 78.769231V0H393.846154v78.769231H0v708.923077h1102.769231V78.769231z m236.307692 551.384615H157.538462V236.307692h787.692307z\" fill=\"#272536\" ></path><path d=\"M472.615385 449.772308l118.153846 118.153846 185.107692-185.895385-55.138461-55.138461L590.769231 456.073846 472.615385 337.92 326.892308 484.430769l55.138461 55.138462L472.615385 449.772308zM315.076923 866.461538h472.615385v157.538462H315.076923z\" fill=\"#272536\" ></path></symbol><symbol id=\"icon-gaiicon-\" viewBox=\"0 0 1024 1024\"><path d=\"M398.222222 512H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778V170.666667c0-62.577778 51.2-113.777778 113.777778-113.777778h227.555555c62.577778 0 113.777778 51.2 113.777778 113.777778v227.555555c0 62.577778-51.2 113.777778-113.777778 113.777778zM170.666667 170.666667v227.555555h227.555555V170.666667H170.666667zM796.444444 512c-28.444444 0-56.888889-11.377778-79.644444-34.133333l-113.777778-113.777778c-45.511111-45.511111-45.511111-113.777778 0-159.288889l113.777778-113.777778c45.511111-45.511111 113.777778-45.511111 159.288889 0l113.777778 113.777778c45.511111 45.511111 45.511111 113.777778 0 159.288889l-113.777778 113.777778c-22.755556 22.755556-51.2 34.133333-79.644445 34.133333z m0-341.333333l-113.777777 113.777777 113.777777 113.777778 113.777778-113.777778-113.777778-113.777777zM398.222222 1024H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778v-227.555555c0-62.577778 51.2-113.777778 113.777778-113.777778h227.555555c62.577778 0 113.777778 51.2 113.777778 113.777778v227.555555c0 62.577778-51.2 113.777778-113.777778 113.777778z m-227.555555-341.333333v227.555555h227.555555v-227.555555H170.666667zM910.222222 1024h-227.555555c-62.577778 0-113.777778-51.2-113.777778-113.777778v-227.555555c0-62.577778 51.2-113.777778 113.777778-113.777778h227.555555c62.577778 0 113.777778 51.2 113.777778 113.777778v227.555555c0 62.577778-51.2 113.777778-113.777778 113.777778z m-227.555555-341.333333v227.555555h227.555555v-227.555555h-227.555555z\"  ></path></symbol><symbol id=\"icon-API\" viewBox=\"0 0 1024 1024\"><path d=\"M952 173.7L768.7 68.3c-4.9-2.8-10.4-4.2-15.8-4.2s-10.9 1.4-15.8 4.2L553.8 173.7c-9.8 5.7-15.8 16.1-15.8 27.5v8.9l-10.1-5.8c-4.9-2.8-10.4-4.2-15.8-4.2s-10.9 1.4-15.8 4.2l-10.2 5.9v-9c0-11.3-6.1-21.8-15.9-27.5L286.8 68.3c-4.9-2.8-10.4-4.2-15.8-4.2s-10.9 1.4-15.8 4.2L71.9 173.7C62 179.4 56 189.8 56 201.2v211.6c0 11.3 6 21.8 15.9 27.5l183.3 105.4c4.9 2.8 10.3 4.2 15.8 4.2s10.9-1.4 15.8-4.2l10.2-5.9v9c0 11.3 6.1 21.8 15.9 27.5l6.5 3.7-6.5 3.7c-9.8 5.7-15.9 16.1-15.9 27.5v211.6c0 11.3 6.1 21.8 15.9 27.5l183.3 105.4c4.9 2.8 10.4 4.2 15.8 4.2s10.9-1.4 15.8-4.2l183.3-105.4c9.8-5.7 15.9-16.1 15.9-27.5V611.3c0-11.3-6.1-21.8-15.9-27.5l-6.5-3.7 6.5-3.7c9.8-5.7 15.9-16.1 15.9-27.5V540l10.1 5.8c4.9 2.8 10.4 4.2 15.8 4.2s10.9-1.4 15.8-4.2L952 440.3c9.8-5.7 16-16.1 16-27.5V201.2c0-11.4-6.1-21.8-16-27.5z m-681 298l-143-82.2v-165l143-82.2 143 82.2v27.1l-101.1 58.1c-9.8 5.7-15.9 16.1-15.9 27.5v119.6l-26 14.9z m143-167v84.9l-71 40.8v-84.9l71-40.8z m241 329.9v165l-143 82.2-143-82.2v-165l22.6-13 104.6 60.1c4.9 2.8 10.4 4.2 15.8 4.2s10.9-1.4 15.8-4.2l104.6-60.1 22.6 13zM437.8 595l74.2-42.7 74.2 42.7-74.2 42.7-74.2-42.7zM681 540.6l-22.5 13-130.7-75.1c-4.9-2.8-10.4-4.2-15.8-4.2s-10.9 1.4-15.8 4.2l-130.7 75.1-22.5-13v-27.2l127.1-73.1c9.8-5.7 15.9-16.1 15.9-27.5V263.3l26.1-15 25.9 14.9v149.7c0 11.3 6 21.8 15.8 27.5L681 513.5v27.1z m0-110.2l-71-40.9v-85l71 40.9v85z m215-40.9l-143.1 82.2-25.9-14.8V337.2c0-11.3-6-21.8-15.8-27.5L610 251.5v-27l143-82.2 143 82.2v165z\"  ></path></symbol><symbol id=\"icon-chanpinguanli\" viewBox=\"0 0 1024 1024\"><path d=\"M443.499757 0.539023h-409.384391a34.115366 34.115366 0 0 0-34.115366 34.115366v409.384391a34.115366 34.115366 0 0 0 34.115366 34.115365h409.384391a34.115366 34.115366 0 0 0 34.115366-34.115365v-409.384391a34.115366 34.115366 0 0 0-34.115366-34.115366zM409.384391 409.923414H68.230732V68.769755h341.153659zM443.499757 546.384877h-409.384391a34.115366 34.115366 0 0 0-34.115366 34.115366v409.384391a34.115366 34.115366 0 0 0 34.115366 34.115366h409.384391a34.115366 34.115366 0 0 0 34.115366-34.115366v-409.384391a34.115366 34.115366 0 0 0-34.115366-34.115366zM409.384391 955.769268H68.230732V614.615609h341.153659zM760.77266 467.919536a34.115366 34.115366 0 0 0 48.443819 0l204.692196-204.692196a34.115366 34.115366 0 0 0 0-48.443819l-204.692196-204.692196a34.115366 34.115366 0 0 0-48.443819 0l-204.692196 204.692196a34.115366 34.115366 0 0 0 0 48.443819z m23.880756-385.503635l156.248376 156.930683-156.248376 156.248376L628.40504 239.346584zM989.345611 546.384877h-409.384391a34.115366 34.115366 0 0 0-34.115365 34.115366v409.384391a34.115366 34.115366 0 0 0 34.115365 34.115366h409.384391a34.115366 34.115366 0 0 0 34.115366-34.115366v-409.384391a34.115366 34.115366 0 0 0-34.115366-34.115366z m-34.115366 409.384391H614.076586V614.615609h341.153659z\" fill=\"#666666\" ></path></symbol><symbol id=\"icon-set-configure\" viewBox=\"0 0 1024 1024\"><path d=\"M927 725.9v-50h-81.8c-4.2-29.6-15.9-56.9-33.1-79.8l57.8-57.8-35.4-35.4-57.8 57.8c-22.9-17.2-50.2-28.8-79.8-33.1v-81.8h-50v81.8c-29.6 4.2-56.9 15.9-79.8 33.1l-57.8-57.8-35.3 35.3 57.8 57.8c-17.2 22.9-28.8 50.2-33.1 79.8H417v50h81.8c4.2 29.6 15.9 56.9 33.1 79.8L474 863.5l35.4 35.4 57.8-57.8c22.9 17.2 50.2 28.8 79.8 33.1V956h50v-81.8c29.6-4.2 56.9-15.9 79.8-33.1l57.8 57.8 35.4-35.4-57.8-57.8c17.2-22.9 28.8-50.2 33.1-79.8H927z m-131.3-7.1c-2.9 20.6-11.1 40.2-23.6 56.9l-10.8 14.5-14.5 10.8c-16.7 12.5-36.3 20.6-56.9 23.6l-17.9 2.6-17.9-2.6c-20.6-2.9-40.2-11.1-56.9-23.6l-14.5-10.8-10.8-14.5c-12.5-16.7-20.6-36.3-23.6-56.9l-2.6-17.9 2.6-17.9c2.9-20.6 11.1-40.2 23.6-56.9l10.8-14.5 14.5-10.8c16.7-12.5 36.3-20.6 56.9-23.6l17.9-2.6 17.9 2.6c20.6 2.9 40.2 11.1 56.9 23.6l14.5 10.8 10.8 14.5c12.5 16.7 20.6 36.3 23.6 56.9l2.6 17.9-2.6 17.9zM384.1 887H114V379.5h796V423h50V217H493.5L358 87H64v850h320.1v-50zM114 137h223.9l121 116.1 14.5 13.9H910v62.5H114V137z\" fill=\"\" ></path></symbol><symbol id=\"icon-fuwuqi\" viewBox=\"0 0 1024 1024\"><path d=\"M200.8 98.2h622.5c28.6 0 51.9 23.2 51.9 51.9v103.7c0 28.6-23.2 51.9-51.9 51.9H200.8c-28.6 0-51.9-23.2-51.9-51.9V150.1c0-28.6 23.2-51.9 51.9-51.9z m121 51.9c-28.6 0-51.9 23.2-51.9 51.9s23.2 51.9 51.9 51.9c28.6 0 51.9-23.2 51.9-51.9s-23.3-51.9-51.9-51.9z m-121 259.4h622.5c28.6 0 51.9 23.2 51.9 51.9v103.7c0 28.6-23.2 51.9-51.9 51.9H200.8c-28.6 0-51.9-23.2-51.9-51.9V461.3c0-28.6 23.2-51.8 51.9-51.8z m121 51.8c-28.6 0-51.9 23.2-51.9 51.9 0 28.6 23.2 51.9 51.9 51.9 28.6 0 51.9-23.2 51.9-51.9 0-28.6-23.3-51.9-51.9-51.9z m-121 259.4h622.5c28.6 0 51.9 23.2 51.9 51.9v103.7c0 28.6-23.2 51.9-51.9 51.9H200.8c-28.6 0-51.9-23.2-51.9-51.9V772.6c0-28.7 23.2-51.9 51.9-51.9z m121 51.9c-28.6 0-51.9 23.2-51.9 51.9 0 28.6 23.2 51.9 51.9 51.9 28.6 0 51.9-23.2 51.9-51.9s-23.3-51.9-51.9-51.9z\"  ></path></symbol><symbol id=\"icon-neirongguanli\" viewBox=\"0 0 1024 1024\"><path d=\"M737.5 252V148c0-28.7-23.3-52-52-52H165c-28.7 0-52 23.3-52 52v728c0 28.7 23.3 52 52 52h572.4V252zM529.3 754.7H251.8c-19.1 0-34.7-15.6-34.7-34.7s15.6-34.7 34.7-34.7h277.6c19.1 0 34.7 15.6 34.7 34.7-0.1 19.1-15.7 34.7-34.8 34.7z m0-208H251.8c-19.1 0-34.7-15.6-34.7-34.7s15.6-34.7 34.7-34.7h277.6c19.1 0 34.7 15.6 34.7 34.7-0.1 19.1-15.7 34.7-34.8 34.7z m69.4-208h-347c-19.1 0-34.7-15.6-34.7-34.7s15.6-34.7 34.7-34.7h347c19.1 0 34.7 15.6 34.7 34.7s-15.6 34.7-34.7 34.7zM859 269.3h-52V928h52c28.6 0 52-23.4 52-52V321.3c0-28.6-23.4-52-52-52z\"  ></path></symbol><symbol id=\"icon-quyu\" viewBox=\"0 0 1024 1024\"><path d=\"M262.6 610.6l208.6 212.2c10.9 11.1 25.4 17.1 40.8 17.1s29.9-6.1 40.8-17.1l208.6-212.2c33.5-34 59.4-73.9 77-118.3 17-42.9 25.6-88.2 25.6-134.7s-8.6-91.8-25.6-134.7c-17.6-44.5-43.6-84.3-77-118.3-33.5-34.1-72.7-60.5-116.5-78.5C602.6 8.8 557.9 0 512 0c-45.9 0-90.6 8.8-132.9 26.2-43.8 18-83 44.4-116.5 78.5-33.5 34-59.4 73.9-77 118.3-17 42.9-25.6 88.2-25.6 134.7s8.6 91.8 25.6 134.7c17.7 44.4 43.6 84.2 77 118.2z m42.8-463.9C360.4 90.8 433.7 60 512 60c78.3 0 151.6 30.8 206.6 86.7 55.1 56.1 85.4 131 85.4 210.9s-30.3 154.9-85.4 210.9L522.7 767.9c-5.9 6-15.5 6-21.4 0L305.4 568.6c-55.1-56.1-85.4-131-85.4-210.9s30.3-154.9 85.4-211z\" fill=\"\" ></path><path d=\"M512 526c88.2 0 160-71.8 160-160s-71.8-160-160-160-160 71.8-160 160 71.8 160 160 160z m0-260c55.1 0 100 44.9 100 100s-44.9 100-100 100-100-44.9-100-100 44.9-100 100-100zM914.9 789.2c-23.7-17.5-56.9-32.9-98.4-45.8-23.5-7.3-49.3-13.7-76.7-19.1-18.5-3.6-35.8 10.5-35.8 29.4 0 14.3 10.1 26.7 24.2 29.4 25.3 4.9 48.9 10.8 70.5 17.5C878.8 825.7 900 853 900 864s-21.2 38.3-101.3 63.3C722.5 951 620.7 964 512 964s-210.5-13-286.7-36.7C145.2 902.3 124 875 124 864s21.2-38.3 101.3-63.3c21.6-6.7 45.2-12.6 70.5-17.5 14-2.7 24.2-15.1 24.2-29.4 0-18.9-17.3-33.1-35.8-29.4-27.4 5.4-53.2 11.7-76.7 19.1-41.6 12.9-74.7 28.3-98.4 45.8C88.5 804.3 64 829.6 64 864s24.5 59.7 45.1 74.8c23.7 17.5 56.9 32.9 98.4 45.8C289.3 1010 397.4 1024 512 1024s222.7-14 304.5-39.4c41.6-12.9 74.7-28.3 98.4-45.8 20.6-15.1 45.1-40.4 45.1-74.8s-24.5-59.7-45.1-74.8z\" fill=\"\" ></path></symbol></svg>',l=(c=document.getElementsByTagName(\"script\"))[c.length-1].getAttribute(\"data-injectcss\");if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState))setTimeout(c,0);else{var l=function(){document.removeEventListener(\"DOMContentLoaded\",l,!1),c()};document.addEventListener(\"DOMContentLoaded\",l,!1)}else document.attachEvent&&(t=c,a=h.document,e=!1,i=function(){e||(e=!0,t())},(o=function(){try{a.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(o,50)}i()})(),a.onreadystatechange=function(){\"complete\"==a.readyState&&(a.onreadystatechange=null,i())});var t,a,e,i,o}(function(){var c,l,t,a,e,i;(c=document.createElement(\"div\")).innerHTML=o,o=null,(l=c.getElementsByTagName(\"svg\")[0])&&(l.setAttribute(\"aria-hidden\",\"true\"),l.style.position=\"absolute\",l.style.width=0,l.style.height=0,l.style.overflow=\"hidden\",t=l,(a=document.body).firstChild?(e=t,(i=a.firstChild).parentNode.insertBefore(e,i)):a.appendChild(t))})}(window);"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/element/styles/index.css",
    "content": "@charset \"UTF-8\";.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*,.el-table--hidden{visibility:hidden}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}@font-face{font-family:element-icons;src:url(fonts/element-icons.woff) format(\"woff\"),url(fonts/element-icons.ttf) format(\"truetype\");font-weight:400;font-style:normal}[class*=\" el-icon-\"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-info:before{content:\"\\e61a\"}.el-icon-error:before{content:\"\\e62c\"}.el-icon-success:before{content:\"\\e62d\"}.el-icon-warning:before{content:\"\\e62e\"}.el-icon-question:before{content:\"\\e634\"}.el-icon-back:before{content:\"\\e606\"}.el-icon-arrow-left:before{content:\"\\e600\"}.el-icon-arrow-down:before{content:\"\\e603\"}.el-icon-arrow-right:before{content:\"\\e604\"}.el-icon-arrow-up:before{content:\"\\e605\"}.el-icon-caret-left:before{content:\"\\e60a\"}.el-icon-caret-bottom:before{content:\"\\e60b\"}.el-icon-caret-top:before{content:\"\\e60c\"}.el-icon-caret-right:before{content:\"\\e60e\"}.el-icon-d-arrow-left:before{content:\"\\e610\"}.el-icon-d-arrow-right:before{content:\"\\e613\"}.el-icon-minus:before{content:\"\\e621\"}.el-icon-plus:before{content:\"\\e62b\"}.el-icon-remove:before{content:\"\\e635\"}.el-icon-circle-plus:before{content:\"\\e601\"}.el-icon-remove-outline:before{content:\"\\e63c\"}.el-icon-circle-plus-outline:before{content:\"\\e602\"}.el-icon-close:before{content:\"\\e60f\"}.el-icon-check:before{content:\"\\e611\"}.el-icon-circle-close:before{content:\"\\e607\"}.el-icon-circle-check:before{content:\"\\e639\"}.el-icon-circle-close-outline:before{content:\"\\e609\"}.el-icon-circle-check-outline:before{content:\"\\e63e\"}.el-icon-zoom-out:before{content:\"\\e645\"}.el-icon-zoom-in:before{content:\"\\e641\"}.el-icon-d-caret:before{content:\"\\e615\"}.el-icon-sort:before{content:\"\\e640\"}.el-icon-sort-down:before{content:\"\\e630\"}.el-icon-sort-up:before{content:\"\\e631\"}.el-icon-tickets:before{content:\"\\e63f\"}.el-icon-document:before{content:\"\\e614\"}.el-icon-goods:before{content:\"\\e618\"}.el-icon-sold-out:before{content:\"\\e63b\"}.el-icon-news:before{content:\"\\e625\"}.el-icon-message:before{content:\"\\e61b\"}.el-icon-date:before{content:\"\\e608\"}.el-icon-printer:before{content:\"\\e62f\"}.el-icon-time:before{content:\"\\e642\"}.el-icon-bell:before{content:\"\\e622\"}.el-icon-mobile-phone:before{content:\"\\e624\"}.el-icon-service:before{content:\"\\e63a\"}.el-icon-view:before{content:\"\\e643\"}.el-icon-menu:before{content:\"\\e620\"}.el-icon-more:before{content:\"\\e646\"}.el-icon-more-outline:before{content:\"\\e626\"}.el-icon-star-on:before{content:\"\\e637\"}.el-icon-star-off:before{content:\"\\e63d\"}.el-icon-location:before{content:\"\\e61d\"}.el-icon-location-outline:before{content:\"\\e61f\"}.el-icon-phone:before{content:\"\\e627\"}.el-icon-phone-outline:before{content:\"\\e628\"}.el-icon-picture:before{content:\"\\e629\"}.el-icon-picture-outline:before{content:\"\\e62a\"}.el-icon-delete:before{content:\"\\e612\"}.el-icon-search:before{content:\"\\e619\"}.el-icon-edit:before{content:\"\\e61c\"}.el-icon-edit-outline:before{content:\"\\e616\"}.el-icon-rank:before{content:\"\\e632\"}.el-icon-refresh:before{content:\"\\e633\"}.el-icon-share:before{content:\"\\e636\"}.el-icon-setting:before{content:\"\\e638\"}.el-icon-upload:before{content:\"\\e60d\"}.el-icon-upload2:before{content:\"\\e644\"}.el-icon-download:before{content:\"\\e617\"}.el-icon-loading:before{content:\"\\e61e\"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:\"\"}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #fff;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#c0c4cc;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#c0c4cc}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#fff}.el-dialog,.el-pager li{background:#fff;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-radio,.el-table th{-webkit-user-select:none}.el-date-table,.el-radio,.el-table th{-moz-user-select:none;-ms-user-select:none}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#c0c4cc}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #e4e7ed;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto;background-color:#fff}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button:hover::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item--divided:before,.el-menu,.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #ebeef5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px}.el-menu::after,.el-menu::before,.el-radio__inner::after,.el-switch__core:after{content:\"\"}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0}.el-menu::after,.el-menu::before{display:table}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #e4e7ed;border-radius:2px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio{color:#606266;font-weight:500;line-height:1;cursor:pointer;white-space:nowrap;outline:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio+.el-radio{margin-left:30px}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio-button__inner,.el-switch__core{-webkit-box-sizing:border-box;vertical-align:middle}.el-radio__inner:hover{border-color:#409EFF}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#fff;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio-button,.el-radio-button__inner{display:inline-block;position:relative;outline:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{font-size:14px;padding-left:10px}.el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0}.el-radio-button__inner{line-height:1;white-space:nowrap;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s}.el-switch__core:after{position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:\"\\E611\";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#c0c4cc}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#c0c4cc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#c0c4cc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#e4e7ed}.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#c0c4cc;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#c0c4cc;right:-7px;top:0;color:#fff}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#fff}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#f5f7fa}.el-table th,.el-table tr{background-color:#fff}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table th div,.el-table th>.cell{-webkit-box-sizing:border-box;display:inline-block}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table .cell,.el-table th div{padding-right:10px;overflow:hidden;text-overflow:ellipsis}.el-table .cell,.el-table th div,.el-table--border td:first-child .cell,.el-table--border th:first-child .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #ebeef5}.el-table th.is-sortable{cursor:pointer}.el-table th{white-space:nowrap;overflow:hidden;user-select:none}.el-table th div{line-height:40px;box-sizing:border-box;white-space:nowrap}.el-table th>.cell{position:relative;word-wrap:normal;text-overflow:ellipsis;vertical-align:middle;width:100%;box-sizing:border-box}.el-table th>.cell.highlight{color:#409EFF}.el-table th.required>div::before{display:inline-block;content:\"\";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;white-space:normal;word-break:break-all;line-height:23px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #ebeef5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#ebeef5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #ebeef5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #ebeef5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #ebeef5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#ebeef5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #ebeef5;background-color:#f5f7fa;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #ebeef5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #ebeef5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#c0c4cc;top:5px}.el-table .sort-caret.descending{border-top-color:#c0c4cc;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td,.el-table__body tr.current-row>td,.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #ebeef5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #ebeef5;border-radius:2px;background-color:#fff;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #ebeef5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#f2f6fc}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-webkit-user-select:none;user-select:none}.el-slider__button-wrapper,.el-time-panel{-moz-user-select:none;-ms-user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;height:30px;padding:4px 0;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-month-table td .cell,.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px}.el-date-table td.next-month,.el-date-table td.prev-month{color:#c0c4cc}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#fff}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#fff;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#fff}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#c0c4cc}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#f2f6fc;border-radius:15px}.el-date-table td.selected div:hover{background-color:#f2f6fc}.el-date-table td.selected span{background-color:#409EFF;color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #ebeef5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-month-table td.disabled .cell:hover{color:#c0c4cc}.el-month-table td .cell{color:#606266;margin:0 auto}.el-month-table td .cell:hover,.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-year-table td.disabled .cell:hover{color:#c0c4cc}.el-year-table td .cell{color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content.is-right .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #ebeef5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#e4e7ed;cursor:not-allowed}.time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#c0c4cc;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input:-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::placeholder{color:#c0c4cc}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#c0c4cc;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:#409EFF}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#e4e7ed}.el-range-editor.is-disabled input{background-color:#f5f7fa;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::placeholder{color:#c0c4cc}.el-range-editor.is-disabled .el-range-separator{color:#c0c4cc}.el-picker-panel{color:#606266;border:1px solid #e4e7ed;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:\"\";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#c0c4cc;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #e4e7ed;background-color:#fff;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:\"\";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #e4e7ed;border-bottom:1px solid #e4e7ed}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #e4e7ed}.el-popover{position:absolute;background:#fff;min-width:150px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #ebeef5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:\"\";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#f56c6c}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{position:relative;padding:10px 15px;color:#606266;font-size:14px}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67c23a}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#e6a23c}.el-message-box__status.el-icon-error{color:#f56c6c}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#f56c6c;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:\"\"}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form-item__content .el-input-group,.el-form-item__label,.el-tag .el-icon-close{vertical-align:middle}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:\"\"}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label{text-align:right;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:\"\"}.el-form-item__content::after{clear:both}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item.is-success .el-input__inner,.el-form-item.is-success .el-input__inner:focus,.el-form-item.is-success .el-textarea__inner,.el-form-item.is-success .el-textarea__inner:focus{border-color:#67c23a}.el-form-item.is-success .el-input-group__append .el-input__inner,.el-form-item.is-success .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-success .el-input__validateIcon{color:#67c23a}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:\"\";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409eff inset;box-shadow:0 0 2px 2px #409eff inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-alert,.el-tag{-webkit-box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin:-1px -1px 0;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card .el-tabs__item:last-child,.el-tabs--top .el-tabs--left .el-tabs__item:last-child,.el-tabs--top .el-tabs--right .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card .el-tabs__item:last-child,.el-tabs--top.el-tabs--card .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #e4e7ed;border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #e4e7ed;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tag,.slideInLeft-transition,.slideInRight-transition{display:inline-block}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #e4e7ed;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tag{background-color:rgba(64,158,255,.1);padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#409EFF;border-radius:4px;box-sizing:border-box;border:1px solid rgba(64,158,255,.2);white-space:nowrap}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;top:-1px;right:-5px;color:#409EFF}.el-tag .el-icon-close::before{display:block}.el-tag .el-icon-close:hover{background-color:#409EFF;color:#fff}.el-tag--info,.el-tag--info .el-tag__close{color:#909399}.el-tag--info{background-color:rgba(144,147,153,.1);border-color:rgba(144,147,153,.2)}.el-tag--info.is-hit{border-color:#909399}.el-tag--info .el-tag__close:hover{background-color:#909399;color:#fff}.el-tag--success{background-color:rgba(103,194,58,.1);border-color:rgba(103,194,58,.2);color:#67c23a}.el-tag--success.is-hit{border-color:#67c23a}.el-tag--success .el-tag__close{color:#67c23a}.el-tag--success .el-tag__close:hover{background-color:#67c23a;color:#fff}.el-tag--warning{background-color:rgba(230,162,60,.1);border-color:rgba(230,162,60,.2);color:#e6a23c}.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--warning .el-tag__close:hover{background-color:#e6a23c;color:#fff}.el-tag--danger{background-color:rgba(245,108,108,.1);border-color:rgba(245,108,108,.2);color:#f56c6c}.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--danger .el-tag__close:hover{background-color:#f56c6c;color:#fff}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-tree{position:relative;cursor:default;background:#fff;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#6f7180}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#f5f7fa}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#f5f7fa}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#c0c4cc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#c0c4cc}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success{background-color:#f0f9eb;color:#67c23a}.el-alert--success .el-alert__description{color:#67c23a}.el-alert--info{background-color:#f4f4f5;color:#909399}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning .el-alert__description{color:#e6a23c}.el-alert--error{background-color:#fef0f0;color:#f56c6c}.el-alert--error .el-alert__description{color:#f56c6c}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;color:#c0c4cc;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #dcdfe6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #dcdfe6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#e4e7ed;color:#e4e7ed}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#e4e7ed;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #dcdfe6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #dcdfe6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:\" \";border-width:5px}.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-upload-cover::after{content:\"\"}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{vertical-align:middle;display:inline-block}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#e4e7ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button{border-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;position:absolute;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;user-select:none;line-height:normal}.el-slider__button,.el-step__icon-inner{-moz-user-select:none;-ms-user-select:none}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;user-select:none}.el-button,.el-checkbox,.el-step__icon-inner{-webkit-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{position:absolute;height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #dcdfe6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#c0c4cc}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:768px){.el-col-xs-0{display:none;width:0}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#c0c4cc;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #dcdfe6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67c23a}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover{background-color:#f5f7fa}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle{display:inline-block}.el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner::after{height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,transform .4s;transition:opacity .3s,transform .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}.el-card{border:1px solid #ebeef5;background-color:#fff;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#c0c4cc;border-color:#c0c4cc}.el-step__head.is-success{color:#67c23a;border-color:#67c23a}.el-step__head.is-error{color:#f56c6c;border-color:#f56c6c}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-button,.el-checkbox{-moz-user-select:none;-ms-user-select:none}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#c0c4cc}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#c0c4cc}.el-step__title.is-success{color:#67c23a}.el-step__title.is-error{color:#f56c6c}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#c0c4cc}.el-step__description.is-success{color:#67c23a}.el-step__description.is-error{color:#f56c6c}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#c0c4cc}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{overflow-x:hidden;position:relative}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin:0;padding:0;z-index:2}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{display:inline-block;background-color:transparent;padding:12px 4px;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-carousel__mask,.el-cascader-menu,.el-cascader-menu__item.is-disabled:hover,.el-collapse-item__header,.el-collapse-item__wrap{background-color:#fff}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #ebeef5;border-bottom:1px solid #ebeef5}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;color:#303133;cursor:pointer;border-bottom:1px solid #ebeef5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #ebeef5}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:\" \";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader .el-input,.el-cascader .el-input__inner{cursor:pointer}.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input__icon{-webkit-transition:none;transition:none}.el-cascader .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-icon-circle-close{z-index:2;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-cascader .el-icon-circle-close:hover{color:#909399}.el-cascader__clearIcon{z-index:2;position:relative}.el-cascader__label{position:absolute;left:0;top:0;height:100%;padding:0 25px 0 15px;color:#606266;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:left;font-size:inherit}.el-cascader__label span{color:#000}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#c0c4cc}.el-cascader-menus{white-space:nowrap;background:#fff;position:absolute;margin:5px 0;z-index:2;border:1px solid #e4e7ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader-menu{display:inline-block;vertical-align:top;height:204px;overflow:auto;border-right:solid 1px #e4e7ed;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:6px 0;min-width:160px}.el-cascader-menu:last-child{border-right:0}.el-cascader-menu__item{font-size:14px;padding:8px 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;outline:0}.el-cascader-menu__item--extensible:after{font-family:element-icons;content:\"\\e604\";font-size:14px;color:#bfcbd9;position:absolute;right:15px}.el-cascader-menu__item.is-disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-cascader-menu__item.is-active{color:#409EFF}.el-cascader-menu__item:focus:not(:active),.el-cascader-menu__item:hover{background-color:#f5f7fa}.el-cascader-menu__item.selected{color:#fff;background-color:#f5f7fa}.el-cascader-menu__item__keyword{font-weight:700}.el-cascader-menu--flexible{height:auto;max-height:180px;overflow:auto}.el-cascader-menu--flexible .el-cascader-menu__item{overflow:visible}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:linear-gradient(to top,#000,transparent)}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{content:\"\";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#fff;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#fff;background-image:none;border:1px solid #dcdfe6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea__inner:hover{border-color:#c0c4cc}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#c0c4cc}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-button-group>.el-button.is-active,.el-button-group>.el-button.is-disabled,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#c0c4cc;font-size:14px;line-height:16px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#c0c4cc;text-align:center}.el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input__inner::placeholder{color:#c0c4cc}.el-input__inner:hover{border-color:#c0c4cc}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{right:5px;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#fff;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#fff;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#ebeef5;color:#c0c4cc}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:\"\"}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:first-child{border-right-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:last-child{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:rgba(255,255,255,.5);border-right-color:rgba(255,255,255,.5)}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#ebeef5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#dcdfe6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#c0c4cc}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#c0c4cc}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#c0c4cc;border-color:#c0c4cc}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#c0c4cc;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #dcdfe6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409EFF}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:\"\";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{position:relative;display:inline-block}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox+.el-checkbox{margin-left:30px}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #dcdfe6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#ebeef5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#409EFF;font-size:0}.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #dcdfe6;background-color:#f5f7fa;color:#c0c4cc}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer-panel{border:1px solid #ebeef5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-container,.el-header{-webkit-box-sizing:border-box}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #ebeef5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside,.el-main{overflow:auto;-webkit-box-sizing:border-box}.el-aside{box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;padding:20px}.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/iview/js/iview-editor.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(\"iviewEditor\",[],t):\"object\"==typeof exports?exports.iviewEditor=t():e.iviewEditor=t()}(\"undefined\"!=typeof self?self:this,function(){return function(e){function t(Z){if(Y[Z])return Y[Z].exports;var n=Y[Z]={i:Z,l:!1,exports:{}};return e[Z].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var Y={};return t.m=e,t.c=Y,t.d=function(e,Y,Z){t.o(e,Y)||Object.defineProperty(e,Y,{configurable:!1,enumerable:!0,get:Z})},t.n=function(e){var Y=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(Y,\"a\",Y),Y},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/dist/\",t(t.s=4)}([function(e,t){e.exports=function(e,t,Y,Z,n,L){var X,J=e=e||{},S=typeof e.default;\"object\"!==S&&\"function\"!==S||(X=e,J=e.default);var r=\"function\"==typeof J?J.options:J;t&&(r.render=t.render,r.staticRenderFns=t.staticRenderFns,r._compiled=!0),Y&&(r.functional=!0),n&&(r._scopeId=n);var i;if(L?(i=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),Z&&Z.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(L)},r._ssrRegister=i):Z&&(i=Z),i){var s=r.functional,o=s?r.render:r.beforeCreate;s?(r._injectStyles=i,r.render=function(e,t){return i.call(t),o(e,t)}):r.beforeCreate=o?[].concat(o,i):[i]}return{esModule:X,exports:J,options:r}}},function(e,t,Y){\"use strict\";function Z(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var n=Y(6),L=Z(n),X=Y(7),J=Z(X),S=Y(9),r=Z(S);t.default={name:\"iEditor\",components:{Upload:J.default,Markdown:r.default},props:{affix:Boolean,offsetTop:Number,placeholder:String,autosize:Object,writeName:{type:String,default:\"内容\"},changeScroll:Boolean,cover:String,showSummary:{type:Boolean,default:!1},config:{type:Object,default:function(){return{action:\"/\",maxSize:5120}}},value:{type:String,default:\"\"},beforeUpload:{type:Function,default:function(){return!0}},imgUrl:{type:Function,default:function(e){return e}},highlight:{type:Function,default:function(e){return e}},paste:{type:Boolean,default:!1}},data:function(){return{tabType:\"write\",content:this.value,showMdTip:!1,showDiff:!1,showDiffEditor:!1,summary:\"\"}},watch:{showDiff:function(e){var t=this;this.$nextTick(function(){t.showDiffEditor=e})},value:function(e){this.content=e},content:function(e){this.$emit(\"input\",e)}},computed:{},methods:{handleChangeTab:function(e){var t=this;\"write\"===e?this.$nextTick(function(){t.$refs.content.focus()}):\"preview\"===e?this.changeScroll&&this.$nextTick(function(){var e=t.$refs.markdown.$el;window.scrollTo(0,e.offsetTop)}):\"summary\"===e&&this.$nextTick(function(){t.$refs.summary.focus()})},handleUploadSuccess:function(e){var t=this,Y=this.imgUrl(e),Z=\"![](\"+Y+\")\",n=this.$refs.content.$refs.textarea;(0,L.default)(n,Z),this.$nextTick(function(){t.content=n.value,t.$refs.content.focus()})},handleImportMd:function(e){var t=this;\"\"!==this.content?this.$Modal.confirm({title:\"导入确认\",content:\"导入后将覆盖您已经输入的内容，是否继续导入？\",onOk:function(){t.content=e}}):this.content=e},focus:function(){this.$refs.content&&this.$refs.content.focus()}}}},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={props:{type:{type:String,default:\"select\"},styles:{type:Number,default:0},cover:String,info:{type:Boolean,default:!1},showBtn:Boolean,config:Object,beforeUpload:Function,paste:Boolean},data:function(){return{uploadForm:{},uploadPercent:0,uploadStatus:0,noUploadAccess:!1}},computed:{},methods:{beforeUploadFile:function(e){if(6===this.styles){if(\"text/markdown\"!==e.type)return this.$Notice.warning({title:\"文件格式不正确\",desc:\"您上传的文件 \"+e.name+\" 格式不符合要求，请上传 .md 格式的文件。\",duration:6}),!1;var t=new FileReader;t.readAsText(e);var Y=this;return t.onload=function(){Y.$emit(\"on-success\",this.result)},!1}return this.beforeUpload(e)},handleSuccess:function(e){this.uploadStatus=0,3===this.styles&&100===this.uploadPercent&&this.showUploadProgress&&(this.showUploadProgress(),this.showUploadProgress=null),this.$emit(\"on-success\",e)},handleError:function(){this.uploadStatus=0,this.$emit(\"on-error\"),3===this.styles&&this.showUploadProgress&&(this.showUploadProgress(),this.showUploadProgress=null)},handleFormatError:function(e){this.$Notice.warning({title:\"文件格式不正确\",desc:\"您上传的文件 \"+e.name+\" 格式不符合要求，请上传 jpg、png、gif 格式的文件。\",duration:6})},handleMaxSize:function(e){this.$Notice.warning({title:\"文件过大\",desc:\"您上传的文件 \"+e.name+\" 体积过大，请上传不超过 \"+this.config.maxSize/1024+\" 的文件。\",duration:6})},handleProgress:function(e){var t=this;if(this.$emit(\"on-progress\",e),this.uploadStatus=1,this.uploadPercent=parseInt(e.percent),3===this.styles){if(this.noUploadAccess)return;this.showUploadProgress||(this.showUploadProgress=this.$Message.loading({duration:0,render:function(e){return e(\"span\",\"图片上传中（\"+t.uploadPercent+\"%）\")}}))}}}}},function(e,t,Y){\"use strict\";function Z(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var n=Y(10),L=Z(n),X=Y(12),J=Z(X);t.default={props:{content:String,highlight:Function},data:function(){return{html:\"\"}},watch:{content:function(){this.renderMd()}},methods:{renderMd:function(){var e=new L.default.Renderer;e.heading=function(e,t){var Y=J.default.getFirstLetter(e);return Y=Y.replace(/\\s/g,\"_\").replace(/\\?|？|,/g,\"\"),\"<h\"+t+' id=\"'+Y+'\">'+e+\"</h\"+t+\">\"};var t=this;this.html=(0,L.default)(this.content,{breaks:!0,headerIds:!1,highlight:function(e){return t.highlight(e)},renderer:e})}},mounted:function(){this.renderMd()}}},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var Z=Y(5),n=function(e){return e&&e.__esModule?e:{default:e}}(Z),L={iEditor:n.default},X=function(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.component(\"i-editor\",n.default)};\"undefined\"!=typeof window&&window.Vue&&X(window.Vue),t.default=Object.assign(L,{install:X})},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var Z=Y(1),n=Y.n(Z);for(var L in Z)\"default\"!==L&&function(e){Y.d(t,e,function(){return Z[e]})}(L);var X=Y(15),J=Y(0),S=J(n.a,X.a,!1,null,null,null);t.default=S.exports},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t){if(document.selection){document.selection.createRange().text=t}else if(\"number\"==typeof e.selectionStart&&\"number\"==typeof e.selectionEnd){var Y=e.selectionStart,Z=e.selectionEnd,n=Y,L=e.value;e.value=L.substring(0,Y)+t+L.substring(Z,L.length),n+=t.length,e.selectionStart=e.selectionEnd=n}else e.value+=t}},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var Z=Y(2),n=Y.n(Z);for(var L in Z)\"default\"!==L&&function(e){Y.d(t,e,function(){return Z[e]})}(L);var X=Y(8),J=Y(0),S=J(n.a,X.a,!1,null,null,null);t.default=S.exports},function(e,t,Y){\"use strict\";var Z=function(){var e=this,t=e.$createElement,Y=e._self._c||t;return Y(\"Upload\",{attrs:{type:e.type,paste:e.paste,action:e.config.action,\"show-upload-list\":!1,data:e.config.uploadForm,format:[\"jpg\",\"jpeg\",\"png\",\"gif\"],\"on-format-error\":e.handleFormatError,\"max-size\":e.config.maxSize,\"on-exceeded-size\":e.handleMaxSize,\"before-upload\":e.beforeUploadFile,\"on-success\":e.handleSuccess,\"on-error\":e.handleError,\"on-progress\":e.handleProgress}},[e._t(\"default\",[1===e.styles?Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\",disabled:1===e.uploadStatus}},[Y(\"Tooltip\",{attrs:{content:\"上传图片\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"ios-image\"}})],1),e._v(\" \"),Y(\"span\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.uploadStatus,expression:\"uploadStatus\"}]},[e._v(\"(\"+e._s(e.uploadPercent)+\"%)\")])],1):e._e(),e._v(\" \"),6===e.styles?Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\"}},[Y(\"Tooltip\",{attrs:{content:\"导入 Markdown 文件\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"md-document\"}})],1)],1):e._e()])],2)},n=[],L={render:Z,staticRenderFns:n};t.a=L},function(e,t,Y){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var Z=Y(3),n=Y.n(Z);for(var L in Z)\"default\"!==L&&function(e){Y.d(t,e,function(){return Z[e]})}(L);var X=Y(14),J=Y(0),S=J(n.a,X.a,!1,null,null,null);t.default=S.exports},function(e,t,Y){(function(t){!function(t){\"use strict\";function Y(e){this.tokens=[],this.tokens.links={},this.options=e||C.defaults,this.rules=Q.normal,this.options.gfm&&(this.options.tables?this.rules=Q.tables:this.rules=Q.gfm)}function Z(e,t){if(this.options=t||C.defaults,this.links=e,this.rules=a.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error(\"Tokens array requires a `links` property.\");this.options.gfm?this.options.breaks?this.rules=a.breaks:this.rules=a.gfm:this.options.pedantic&&(this.rules=a.pedantic)}function n(e){this.options=e||{}}function L(){}function X(e){this.tokens=[],this.token=null,this.options=e||C.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function J(e,t){return e.replace(t?/&/g:/&(?!#?\\w+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function S(e){return e.replace(/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/gi,function(e,t){return t=t.toLowerCase(),\"colon\"===t?\":\":\"#\"===t.charAt(0)?\"x\"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):\"\"})}function r(e,t){return e=e.source,t=t||\"\",{replace:function(t,Y){return Y=Y.source||Y,Y=Y.replace(/(^|[^\\[])\\^/g,\"$1\"),e=e.replace(t,Y),this},getRegex:function(){return new RegExp(e,t)}}}function i(e,t){return T[\" \"+e]||(/^[^:]+:\\/*[^\\/]*$/.test(e)?T[\" \"+e]=e+\"/\":T[\" \"+e]=e.replace(/[^\\/]*$/,\"\")),e=T[\" \"+e],\"//\"===t.slice(0,2)?e.replace(/:[\\s\\S]*/,\":\")+t:\"/\"===t.charAt(0)?e.replace(/(:\\/*[^\\/]*)[\\s\\S]*/,\"$1\")+t:e+t}function s(){}function o(e){for(var t,Y,Z=1;Z<arguments.length;Z++){t=arguments[Z];for(Y in t)Object.prototype.hasOwnProperty.call(t,Y)&&(e[Y]=t[Y])}return e}function C(e,t,Z){if(void 0===e||null===e)throw new Error(\"marked(): input parameter is undefined or null\");if(\"string\"!=typeof e)throw new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(e)+\", string expected\");if(Z||\"function\"==typeof t){Z||(Z=t,t=null),t=o({},C.defaults,t||{});var n,L,S=t.highlight,r=0;try{n=Y.lex(e,t)}catch(e){return Z(e)}L=n.length;var i=function(e){if(e)return t.highlight=S,Z(e);var Y;try{Y=X.parse(n,t)}catch(t){e=t}return t.highlight=S,e?Z(e):Z(null,Y)};if(!S||S.length<3)return i();if(delete t.highlight,!L)return i();for(;r<n.length;r++)!function(e){\"code\"!==e.type?--L||i():S(e.text,e.lang,function(t,Y){return t?i(t):null==Y||Y===e.text?--L||i():(e.text=Y,e.escaped=!0,void(--L||i()))})}(n[r])}else try{return t&&(t=o({},C.defaults,t)),X.parse(Y.lex(e,t),t)}catch(e){if(e.message+=\"\\nPlease report this to https://github.com/markedjs/marked.\",(t||C.defaults).silent)return\"<p>An error occurred:</p><pre>\"+J(e.message+\"\",!0)+\"</pre>\";throw e}}var Q={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:s,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:s,blockquote:/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,def:/^ {0,3}\\[(label)\\]: *\\n? *<?([^\\s>]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,table:s,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,paragraph:/^([^\\n]+(?:\\n?(?!hr|heading|lheading| {0,3}>|tag)[^\\n]+)+)/,text:/^[^\\n]+/};Q._label=/(?:\\\\[\\[\\]]|[^\\[\\]])+/,Q._title=/(?:\"(?:\\\\\"|[^\"]|\"[^\"\\n]*\")*\"|'\\n?(?:[^'\\n]+\\n?)*'|\\([^()]*\\))/,Q.def=r(Q.def).replace(\"label\",Q._label).replace(\"title\",Q._title).getRegex(),Q.bullet=/(?:[*+-]|\\d+\\.)/,Q.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/,Q.item=r(Q.item,\"gm\").replace(/bull/g,Q.bullet).getRegex(),Q.list=r(Q.list).replace(/bull/g,Q.bullet).replace(\"hr\",\"\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))\").replace(\"def\",\"\\\\n+(?=\"+Q.def.source+\")\").getRegex(),Q._tag=\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\",Q.html=r(Q.html).replace(\"comment\",/<!--[\\s\\S]*?-->/).replace(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/).replace(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"\\/>\\s]*)*?\\/?>/).replace(/tag/g,Q._tag).getRegex(),Q.paragraph=r(Q.paragraph).replace(\"hr\",Q.hr).replace(\"heading\",Q.heading).replace(\"lheading\",Q.lheading).replace(\"tag\",\"<\"+Q._tag).getRegex(),Q.blockquote=r(Q.blockquote).replace(\"paragraph\",Q.paragraph).getRegex(),Q.normal=o({},Q),Q.gfm=o({},Q.normal,{fences:/^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\n? *\\1 *(?:\\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/}),Q.gfm.paragraph=r(Q.paragraph).replace(\"(?!\",\"(?!\"+Q.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+Q.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\").getRegex(),Q.tables=o({},Q.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/}),Y.rules=Q,Y.lex=function(e,t){return new Y(t).lex(e)},Y.prototype.lex=function(e){return e=e.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\"),this.token(e,!0)},Y.prototype.token=function(e,t){e=e.replace(/^ +$/gm,\"\");for(var Y,Z,n,L,X,J,S,r,i,s,o;e;)if((n=this.rules.newline.exec(e))&&(e=e.substring(n[0].length),n[0].length>1&&this.tokens.push({type:\"space\"})),n=this.rules.code.exec(e))e=e.substring(n[0].length),n=n[0].replace(/^ {4}/gm,\"\"),this.tokens.push({type:\"code\",text:this.options.pedantic?n:n.replace(/\\n+$/,\"\")});else if(n=this.rules.fences.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"code\",lang:n[2],text:n[3]||\"\"});else if(n=this.rules.heading.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"heading\",depth:n[1].length,text:n[2]});else if(t&&(n=this.rules.nptable.exec(e))){for(e=e.substring(n[0].length),J={type:\"table\",header:n[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:n[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:n[3].replace(/\\n$/,\"\").split(\"\\n\")},r=0;r<J.align.length;r++)/^ *-+: *$/.test(J.align[r])?J.align[r]=\"right\":/^ *:-+: *$/.test(J.align[r])?J.align[r]=\"center\":/^ *:-+ *$/.test(J.align[r])?J.align[r]=\"left\":J.align[r]=null;for(r=0;r<J.cells.length;r++)J.cells[r]=J.cells[r].split(/ *\\| */);this.tokens.push(J)}else if(n=this.rules.hr.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"hr\"});else if(n=this.rules.blockquote.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"blockquote_start\"}),n=n[0].replace(/^ *> ?/gm,\"\"),this.token(n,t),this.tokens.push({type:\"blockquote_end\"});else if(n=this.rules.list.exec(e)){for(e=e.substring(n[0].length),L=n[2],o=L.length>1,this.tokens.push({type:\"list_start\",ordered:o,start:o?+L:\"\"}),n=n[0].match(this.rules.item),Y=!1,s=n.length,r=0;r<s;r++)J=n[r],S=J.length,J=J.replace(/^ *([*+-]|\\d+\\.) +/,\"\"),~J.indexOf(\"\\n \")&&(S-=J.length,J=this.options.pedantic?J.replace(/^ {1,4}/gm,\"\"):J.replace(new RegExp(\"^ {1,\"+S+\"}\",\"gm\"),\"\")),this.options.smartLists&&r!==s-1&&(X=Q.bullet.exec(n[r+1])[0],L===X||L.length>1&&X.length>1||(e=n.slice(r+1).join(\"\\n\")+e,r=s-1)),Z=Y||/\\n\\n(?!\\s*$)/.test(J),r!==s-1&&(Y=\"\\n\"===J.charAt(J.length-1),Z||(Z=Y)),this.tokens.push({type:Z?\"loose_item_start\":\"list_item_start\"}),this.token(J,!1),this.tokens.push({type:\"list_item_end\"});this.tokens.push({type:\"list_end\"})}else if(n=this.rules.html.exec(e))e=e.substring(n[0].length),this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:!this.options.sanitizer&&(\"pre\"===n[1]||\"script\"===n[1]||\"style\"===n[1]),text:n[0]});else if(t&&(n=this.rules.def.exec(e)))e=e.substring(n[0].length),n[3]&&(n[3]=n[3].substring(1,n[3].length-1)),i=n[1].toLowerCase(),this.tokens.links[i]||(this.tokens.links[i]={href:n[2],title:n[3]});else if(t&&(n=this.rules.table.exec(e))){for(e=e.substring(n[0].length),J={type:\"table\",header:n[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:n[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:n[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")},r=0;r<J.align.length;r++)/^ *-+: *$/.test(J.align[r])?J.align[r]=\"right\":/^ *:-+: *$/.test(J.align[r])?J.align[r]=\"center\":/^ *:-+ *$/.test(J.align[r])?J.align[r]=\"left\":J.align[r]=null;for(r=0;r<J.cells.length;r++)J.cells[r]=J.cells[r].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */);this.tokens.push(J)}else if(n=this.rules.lheading.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"heading\",depth:\"=\"===n[2]?1:2,text:n[1]});else if(t&&(n=this.rules.paragraph.exec(e)))e=e.substring(n[0].length),this.tokens.push({type:\"paragraph\",text:\"\\n\"===n[1].charAt(n[1].length-1)?n[1].slice(0,-1):n[1]});else if(n=this.rules.text.exec(e))e=e.substring(n[0].length),this.tokens.push({type:\"text\",text:n[0]});else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0));return this.tokens};var a={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,url:s,tag:/^<!--[\\s\\S]*?-->|^<\\/?[a-zA-Z0-9\\-]+(?:\"[^\"]*\"|'[^']*'|\\s[^<'\">\\/\\s]*)*?\\/?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^_([^\\s_](?:[^_]|__)+?[^\\s_])_\\b|^\\*((?:\\*\\*|[^*])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`]?)\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:s,text:/^[\\s\\S]+?(?=[\\\\<!\\[`*]|\\b_| {2,}\\n|$)/};a._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,a._email=/[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,a.autolink=r(a.autolink).replace(\"scheme\",a._scheme).replace(\"email\",a._email).getRegex(),a._inside=/(?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/,a._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/,a.link=r(a.link).replace(\"inside\",a._inside).replace(\"href\",a._href).getRegex(),a.reflink=r(a.reflink).replace(\"inside\",a._inside).getRegex(),a.normal=o({},a),a.pedantic=o({},a.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/}),a.gfm=o({},a.normal,{escape:r(a.escape).replace(\"])\",\"~|])\").getRegex(),url:r(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"email\",a._email).getRegex(),_backpedal:/(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:r(a.text).replace(\"]|\",\"~]|\").replace(\"|\",\"|https?://|ftp://|www\\\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\\\|}~-]+@|\").getRegex()}),a.breaks=o({},a.gfm,{br:r(a.br).replace(\"{2,}\",\"*\").getRegex(),text:r(a.gfm.text).replace(\"{2,}\",\"*\").getRegex()}),Z.rules=a,Z.output=function(e,t,Y){return new Z(t,Y).output(e)},Z.prototype.output=function(e){for(var t,Y,Z,n,L=\"\";e;)if(n=this.rules.escape.exec(e))e=e.substring(n[0].length),L+=n[1];else if(n=this.rules.autolink.exec(e))e=e.substring(n[0].length),\"@\"===n[2]?(Y=J(this.mangle(n[1])),Z=\"mailto:\"+Y):(Y=J(n[1]),Z=Y),L+=this.renderer.link(Z,null,Y);else if(this.inLink||!(n=this.rules.url.exec(e))){if(n=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(n[0])?this.inLink=!0:this.inLink&&/^<\\/a>/i.test(n[0])&&(this.inLink=!1),e=e.substring(n[0].length),L+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(n[0]):J(n[0]):n[0];else if(n=this.rules.link.exec(e))e=e.substring(n[0].length),this.inLink=!0,L+=this.outputLink(n,{href:n[2],title:n[3]}),this.inLink=!1;else if((n=this.rules.reflink.exec(e))||(n=this.rules.nolink.exec(e))){if(e=e.substring(n[0].length),t=(n[2]||n[1]).replace(/\\s+/g,\" \"),!(t=this.links[t.toLowerCase()])||!t.href){L+=n[0].charAt(0),e=n[0].substring(1)+e;continue}this.inLink=!0,L+=this.outputLink(n,t),this.inLink=!1}else if(n=this.rules.strong.exec(e))e=e.substring(n[0].length),L+=this.renderer.strong(this.output(n[2]||n[1]));else if(n=this.rules.em.exec(e))e=e.substring(n[0].length),L+=this.renderer.em(this.output(n[2]||n[1]));else if(n=this.rules.code.exec(e))e=e.substring(n[0].length),L+=this.renderer.codespan(J(n[2].trim(),!0));else if(n=this.rules.br.exec(e))e=e.substring(n[0].length),L+=this.renderer.br();else if(n=this.rules.del.exec(e))e=e.substring(n[0].length),L+=this.renderer.del(this.output(n[1]));else if(n=this.rules.text.exec(e))e=e.substring(n[0].length),L+=this.renderer.text(J(this.smartypants(n[0])));else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0))}else n[0]=this.rules._backpedal.exec(n[0])[0],e=e.substring(n[0].length),\"@\"===n[2]?(Y=J(n[0]),Z=\"mailto:\"+Y):(Y=J(n[0]),Z=\"www.\"===n[1]?\"http://\"+Y:Y),L+=this.renderer.link(Z,null,Y);return L},Z.prototype.outputLink=function(e,t){var Y=J(t.href),Z=t.title?J(t.title):null;return\"!\"!==e[0].charAt(0)?this.renderer.link(Y,Z,this.output(e[1])):this.renderer.image(Y,Z,J(e[1]))},Z.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,\"—\").replace(/--/g,\"–\").replace(/(^|[-\\u2014\\/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014\\/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\"):e},Z.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,Y=\"\",Z=e.length,n=0;n<Z;n++)t=e.charCodeAt(n),Math.random()>.5&&(t=\"x\"+t.toString(16)),Y+=\"&#\"+t+\";\";return Y},n.prototype.code=function(e,t,Y){if(this.options.highlight){var Z=this.options.highlight(e,t);null!=Z&&Z!==e&&(Y=!0,e=Z)}return t?'<pre><code class=\"'+this.options.langPrefix+J(t,!0)+'\">'+(Y?e:J(e,!0))+\"\\n</code></pre>\\n\":\"<pre><code>\"+(Y?e:J(e,!0))+\"\\n</code></pre>\"},n.prototype.blockquote=function(e){return\"<blockquote>\\n\"+e+\"</blockquote>\\n\"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,Y){return\"<h\"+t+' id=\"'+this.options.headerPrefix+Y.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+e+\"</h\"+t+\">\\n\"},n.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"},n.prototype.list=function(e,t,Y){var Z=t?\"ol\":\"ul\";return\"<\"+Z+(t&&1!==Y?' start=\"'+Y+'\"':\"\")+\">\\n\"+e+\"</\"+Z+\">\\n\"},n.prototype.listitem=function(e){return\"<li>\"+e+\"</li>\\n\"},n.prototype.paragraph=function(e){return\"<p>\"+e+\"</p>\\n\"},n.prototype.table=function(e,t){return\"<table>\\n<thead>\\n\"+e+\"</thead>\\n<tbody>\\n\"+t+\"</tbody>\\n</table>\\n\"},n.prototype.tablerow=function(e){return\"<tr>\\n\"+e+\"</tr>\\n\"},n.prototype.tablecell=function(e,t){var Y=t.header?\"th\":\"td\";return(t.align?\"<\"+Y+' style=\"text-align:'+t.align+'\">':\"<\"+Y+\">\")+e+\"</\"+Y+\">\\n\"},n.prototype.strong=function(e){return\"<strong>\"+e+\"</strong>\"},n.prototype.em=function(e){return\"<em>\"+e+\"</em>\"},n.prototype.codespan=function(e){return\"<code>\"+e+\"</code>\"},n.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"},n.prototype.del=function(e){return\"<del>\"+e+\"</del>\"},n.prototype.link=function(e,t,Y){if(this.options.sanitize){try{var Z=decodeURIComponent(S(e)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(e){return Y}if(0===Z.indexOf(\"javascript:\")||0===Z.indexOf(\"vbscript:\")||0===Z.indexOf(\"data:\"))return Y}this.options.baseUrl&&!H.test(e)&&(e=i(this.options.baseUrl,e));var n='<a href=\"'+e+'\"';return t&&(n+=' title=\"'+t+'\"'),n+=\">\"+Y+\"</a>\"},n.prototype.image=function(e,t,Y){this.options.baseUrl&&!H.test(e)&&(e=i(this.options.baseUrl,e));var Z='<img src=\"'+e+'\" alt=\"'+Y+'\"';return t&&(Z+=' title=\"'+t+'\"'),Z+=this.options.xhtml?\"/>\":\">\"},n.prototype.text=function(e){return e},L.prototype.strong=L.prototype.em=L.prototype.codespan=L.prototype.del=L.prototype.text=function(e){return e},L.prototype.link=L.prototype.image=function(e,t,Y){return\"\"+Y},L.prototype.br=function(){return\"\"},X.parse=function(e,t){return new X(t).parse(e)},X.prototype.parse=function(e){this.inline=new Z(e.links,this.options),this.inlineText=new Z(e.links,o({},this.options,{renderer:new L})),this.tokens=e.reverse();for(var t=\"\";this.next();)t+=this.tok();return t},X.prototype.next=function(){return this.token=this.tokens.pop()},X.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},X.prototype.parseText=function(){for(var e=this.token.text;\"text\"===this.peek().type;)e+=\"\\n\"+this.next().text;return this.inline.output(e)},X.prototype.tok=function(){switch(this.token.type){case\"space\":return\"\";case\"hr\":return this.renderer.hr();case\"heading\":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,S(this.inlineText.output(this.token.text)));case\"code\":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case\"table\":var e,t,Y,Z,n=\"\",L=\"\";for(Y=\"\",e=0;e<this.token.header.length;e++)Y+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(n+=this.renderer.tablerow(Y),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],Y=\"\",Z=0;Z<t.length;Z++)Y+=this.renderer.tablecell(this.inline.output(t[Z]),{header:!1,align:this.token.align[Z]});L+=this.renderer.tablerow(Y)}return this.renderer.table(n,L);case\"blockquote_start\":for(L=\"\";\"blockquote_end\"!==this.next().type;)L+=this.tok();return this.renderer.blockquote(L);case\"list_start\":L=\"\";for(var X=this.token.ordered,J=this.token.start;\"list_end\"!==this.next().type;)L+=this.tok();return this.renderer.list(L,X,J);case\"list_item_start\":for(L=\"\";\"list_item_end\"!==this.next().type;)L+=\"text\"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(L);case\"loose_item_start\":for(L=\"\";\"list_item_end\"!==this.next().type;)L+=this.tok();return this.renderer.listitem(L);case\"html\":var r=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(r);case\"paragraph\":return this.renderer.paragraph(this.inline.output(this.token.text));case\"text\":return this.renderer.paragraph(this.parseText())}};var T={},H=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;s.exec=s,C.options=C.setOptions=function(e){return o(C.defaults,e),C},C.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,sanitizer:null,mangle:!0,smartLists:!1,silent:!1,highlight:null,langPrefix:\"lang-\",smartypants:!1,headerPrefix:\"\",renderer:new n,xhtml:!1,baseUrl:null},C.Parser=X,C.parser=X.parse,C.Renderer=n,C.TextRenderer=L,C.Lexer=Y,C.lexer=Y.lex,C.InlineLexer=Z,C.inlineLexer=Z.output,C.parse=C,e.exports=C}(this||\"undefined\"!=typeof window&&window)}).call(t,Y(11))},function(e,t){var Y;Y=function(){return this}();try{Y=Y||Function(\"return this\")()||(0,eval)(\"this\")}catch(e){\"object\"==typeof window&&(Y=window)}e.exports=Y},function(e,t,Y){\"use strict\";function Z(e,t,Y){t=t||\"\";for(var Z=[\"\"],n=[],X=0;X<e.length;X++){n=[];for(var J=e[X].split(t),S=0;S<J.length;S++)for(var r=0;r<Z.length;r++)n.push(Z[r]+(Z[r]?Y:\"\")+J[S]);Z=n}return L(Z)}function n(e,t,Y,Z){var n=window.pinyin_dict_polyphone,L=n[e];if(L){L=L.split(\" \");for(var X=0;X<L.length;X++)t[X]=L[X]||t[X],Z||(t[X]=s.removeTone(t[X]));return t.join(Y)}for(var X=0;X<e.length;X++){L=\"\";for(var J=0;J<7&&X+J<e.length&&/^[\\u2E80-\\u9FFF]+$/.test(e[X+J]);J++){L+=e[X+J];var S=n[L];if(S){S=S.split(\" \");for(var r=0;r<=J;r++)S[r]&&(t[X+r]=Z?S[r]:s.removeTone(S[r]));break}}}for(var X=0;X<t.length;X++)t[X]=t[X].replace(/ .*$/g,\"\");return t.join(Y)}function L(e){for(var t=[],Y={},Z=0;Z<e.length;Z++){var n=X(e[Z])+e[Z];Y[n]||(t.push(e[Z]),Y[n]=!0)}return t}Object.defineProperty(t,\"__esModule\",{value:!0});var X=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},J=Y(13),S=function(e){return e&&e.__esModule?e:{default:e}}(J),r={\"ā\":\"a1\",\"á\":\"a2\",\"ǎ\":\"a3\",\"à\":\"a4\",\"ō\":\"o1\",\"ó\":\"o2\",\"ǒ\":\"o3\",\"ò\":\"o4\",\"ē\":\"e1\",\"é\":\"e2\",\"ě\":\"e3\",\"è\":\"e4\",\"ī\":\"i1\",\"í\":\"i2\",\"ǐ\":\"i3\",\"ì\":\"i4\",\"ū\":\"u1\",\"ú\":\"u2\",\"ǔ\":\"u3\",\"ù\":\"u4\",\"ü\":\"v0\",\"ǖ\":\"v1\",\"ǘ\":\"v2\",\"ǚ\":\"v3\",\"ǜ\":\"v4\",\"ń\":\"n2\",\"ň\":\"n3\",\"\":\"m2\"},i={},s={parseDict:function(){if(S.default&&(i.firstletter=S.default),window.pinyin_dict_notone){i.notone={},i.py2hz=pinyin_dict_notone;for(var e in pinyin_dict_notone)for(var t=pinyin_dict_notone[e],Y=0,Z=t.length;Y<Z;Y++)i.notone[t[Y]]||(i.notone[t[Y]]=e)}if(window.pinyin_dict_withtone){i.withtone={};for(var t=pinyin_dict_withtone.split(\",\"),e=0,Z=t.length;e<Z;e++)i.withtone[String.fromCharCode(e+19968)]=t[e];if(window.pinyin_dict_notone)i.py2hz=pinyin_dict_notone;else{for(var n,L,X=s.removeTone(pinyin_dict_withtone).split(\",\"),J={},e=0,Z=X.length;e<Z;e++){L=String.fromCharCode(e+19968),n=X[e].split(\" \");for(var Y=0;Y<n.length;Y++)J[n[Y]]=(J[n[Y]]||\"\")+L}i.py2hz=J}}},getPinyin:function(e,t,Y,L){if(!e||/^ +$/g.test(e))return\"\";t=void 0==t?\" \":t,Y=void 0==Y||Y,L=void 0!=L&&L;var X=[];if(i.withtone){for(var J=\"\",S=0,r=e.length;S<r;S++){var s=i.withtone[e[S]];s?(L||(s=s.replace(/ .*$/g,\"\")),Y||(s=this.removeTone(s)),J&&(X.push(J),J=\"\"),X.push(s)):!e[S]||/^ +$/g.test(e[S])?J&&(X.push(J),J=\"\"):J+=e[S]}J&&(X.push(J),J=\"\")}else{if(!i.notone)throw\"抱歉，未找到合适的拼音字典文件！\";Y&&console.warn(\"pinyin_dict_notone 字典文件不支持声调！\"),L&&console.warn(\"pinyin_dict_notone 字典文件不支持多音字！\");for(var J=\"\",S=0,r=e.length;S<r;S++){var o=e.charAt(S),s=i.notone[o];s?(J&&(X.push(J),J=\"\"),X.push(s)):!o||/^ +$/g.test(o)?J&&(X.push(J),J=\"\"):J+=o}J&&(X.push(J),J=\"\")}return L?window.pinyin_dict_polyphone?n(e,X,t,Y):Z(X,\" \",t):X.join(t)},getFirstLetter:function(e,t){if(t=void 0!=t&&t,!e||/^ +$/g.test(e))return\"\";if(i.firstletter){for(var Y=[],n=0;n<e.length;n++){var X=e.charCodeAt(n),J=e.charAt(n);X>=19968&&X<=40869&&(J=i.firstletter.all.charAt(X-19968),t&&(J=i.firstletter.polyphone[X]||J)),Y.push(J)}return t?Z(Y,\"\",\"\"):Y.join(\"\")}var S=this.getPinyin(e,\" \",!1,t);S=S instanceof Array?S:[S];for(var Y=[],n=0;n<S.length;n++)Y.push(S[n].replace(/(^| )(\\w)\\w*/g,function(e,t,Y){return Y.toUpperCase()}));return t?L(Y):Y[0]},getHanzi:function(e){if(!i.py2hz)throw\"抱歉，未找到合适的拼音字典文件！\";return i.py2hz[this.removeTone(e)]||\"\"},getSameVoiceWord:function(e,t){return t=t||!1,this.getHanzi(this.getPinyin(e,\" \",!1))},removeTone:function(e){return e.replace(/[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň]/g,function(e){return r[e][0]})},getTone:function(e){var t={};for(var Y in r)t[r[Y]]=Y;return(e||\"\").replace(/[a-z]\\d/g,function(e){return t[e]||e})}};s.parseDict(),s.dict=i,t.default=s},function(e,t,Y){\"use strict\";function Z(e,t,Y){return t in e?Object.defineProperty(e,t,{value:Y,enumerable:!0,configurable:!0,writable:!0}):e[t]=Y,e}Object.defineProperty(t,\"__esModule\",{value:!0});var n,L={};L.all=\"YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY\",L.polyphone=(n={19969:\"DZ\",19975:\"WM\",19988:\"QJ\",20048:\"YL\",20056:\"SC\",20060:\"NM\",20094:\"QG\",20127:\"QJ\",20167:\"QC\",20193:\"YG\",20250:\"KH\",20256:\"ZC\",20282:\"SC\",20285:\"QJG\",20291:\"TD\",20314:\"YD\",20340:\"NE\",20375:\"TD\",20389:\"YJ\",20391:\"CZ\",20415:\"PB\",20446:\"YS\",20447:\"SQ\",20504:\"TC\",20608:\"KG\",20854:\"QJ\",20857:\"ZC\",20911:\"PF\"},Z(n,\"20504\",\"TC\"),Z(n,\"20608\",\"KG\"),Z(n,\"20854\",\"QJ\"),Z(n,\"20857\",\"ZC\"),Z(n,\"20911\",\"PF\"),Z(n,\"20985\",\"AW\"),Z(n,\"21032\",\"PB\"),Z(n,\"21048\",\"XQ\"),Z(n,\"21049\",\"SC\"),Z(n,\"21089\",\"YS\"),Z(n,\"21119\",\"JC\"),Z(n,\"21242\",\"SB\"),Z(n,\"21273\",\"SC\"),Z(n,\"21305\",\"YP\"),Z(n,\"21306\",\"QO\"),Z(n,\"21330\",\"ZC\"),Z(n,\"21333\",\"SDC\"),Z(n,\"21345\",\"QK\"),Z(n,\"21378\",\"CA\"),Z(n,\"21397\",\"SC\"),Z(n,\"21414\",\"XS\"),Z(n,\"21442\",\"SC\"),Z(n,\"21477\",\"JG\"),Z(n,\"21480\",\"TD\"),Z(n,\"21484\",\"ZS\"),Z(n,\"21494\",\"YX\"),Z(n,\"21505\",\"YX\"),Z(n,\"21512\",\"HG\"),Z(n,\"21523\",\"XH\"),Z(n,\"21537\",\"PB\"),Z(n,\"21542\",\"PF\"),Z(n,\"21549\",\"KH\"),Z(n,\"21571\",\"E\"),Z(n,\"21574\",\"DA\"),Z(n,\"21588\",\"TD\"),Z(n,\"21589\",\"O\"),Z(n,\"21618\",\"ZC\"),Z(n,\"21621\",\"KHA\"),Z(n,\"21632\",\"ZJ\"),Z(n,\"21654\",\"KG\"),Z(n,\"21679\",\"LKG\"),Z(n,\"21683\",\"KH\"),Z(n,\"21710\",\"A\"),Z(n,\"21719\",\"YH\"),Z(n,\"21734\",\"WOE\"),Z(n,\"21769\",\"A\"),Z(n,\"21780\",\"WN\"),Z(n,\"21804\",\"XH\"),Z(n,\"21834\",\"A\"),Z(n,\"21899\",\"ZD\"),Z(n,\"21903\",\"RN\"),Z(n,\"21908\",\"WO\"),Z(n,\"21939\",\"ZC\"),Z(n,\"21956\",\"SA\"),Z(n,\"21964\",\"YA\"),Z(n,\"21970\",\"TD\"),Z(n,\"22003\",\"A\"),Z(n,\"22031\",\"JG\"),Z(n,\"22040\",\"XS\"),Z(n,\"22060\",\"ZC\"),Z(n,\"22066\",\"ZC\"),Z(n,\"22079\",\"MH\"),Z(n,\"22129\",\"XJ\"),Z(n,\"22179\",\"XA\"),Z(n,\"22237\",\"NJ\"),Z(n,\"22244\",\"TD\"),Z(n,\"22280\",\"JQ\"),Z(n,\"22300\",\"YH\"),Z(n,\"22313\",\"XW\"),Z(n,\"22331\",\"YQ\"),Z(n,\"22343\",\"YJ\"),Z(n,\"22351\",\"PH\"),Z(n,\"22395\",\"DC\"),Z(n,\"22412\",\"TD\"),Z(n,\"22484\",\"PB\"),Z(n,\"22500\",\"PB\"),Z(n,\"22534\",\"ZD\"),Z(n,\"22549\",\"DH\"),Z(n,\"22561\",\"PB\"),Z(n,\"22612\",\"TD\"),Z(n,\"22771\",\"KQ\"),Z(n,\"22831\",\"HB\"),Z(n,\"22841\",\"JG\"),Z(n,\"22855\",\"QJ\"),Z(n,\"22865\",\"XQ\"),Z(n,\"23013\",\"ML\"),Z(n,\"23081\",\"WM\"),Z(n,\"23487\",\"SX\"),Z(n,\"23558\",\"QJ\"),Z(n,\"23561\",\"YW\"),Z(n,\"23586\",\"YW\"),Z(n,\"23614\",\"YW\"),Z(n,\"23615\",\"SN\"),Z(n,\"23631\",\"PB\"),Z(n,\"23646\",\"ZS\"),Z(n,\"23663\",\"ZT\"),Z(n,\"23673\",\"YG\"),Z(n,\"23762\",\"TD\"),Z(n,\"23769\",\"ZS\"),Z(n,\"23780\",\"QJ\"),Z(n,\"23884\",\"QK\"),Z(n,\"24055\",\"XH\"),Z(n,\"24113\",\"DC\"),Z(n,\"24162\",\"ZC\"),Z(n,\"24191\",\"GA\"),Z(n,\"24273\",\"QJ\"),Z(n,\"24324\",\"NL\"),Z(n,\"24377\",\"TD\"),Z(n,\"24378\",\"QJ\"),Z(n,\"24439\",\"PF\"),Z(n,\"24554\",\"ZS\"),Z(n,\"24683\",\"TD\"),Z(n,\"24694\",\"WE\"),Z(n,\"24733\",\"LK\"),Z(n,\"24925\",\"TN\"),Z(n,\"25094\",\"ZG\"),Z(n,\"25100\",\"XQ\"),Z(n,\"25103\",\"XH\"),Z(n,\"25153\",\"PB\"),Z(n,\"25170\",\"PB\"),Z(n,\"25179\",\"KG\"),Z(n,\"25203\",\"PB\"),Z(n,\"25240\",\"ZS\"),Z(n,\"25282\",\"FB\"),Z(n,\"25303\",\"NA\"),Z(n,\"25324\",\"KG\"),Z(n,\"25341\",\"ZY\"),Z(n,\"25373\",\"WZ\"),Z(n,\"25375\",\"XJ\"),Z(n,\"25384\",\"A\"),Z(n,\"25457\",\"A\"),Z(n,\"25528\",\"SD\"),Z(n,\"25530\",\"SC\"),Z(n,\"25552\",\"TD\"),Z(n,\"25774\",\"ZC\"),Z(n,\"25874\",\"ZC\"),Z(n,\"26044\",\"YW\"),Z(n,\"26080\",\"WM\"),Z(n,\"26292\",\"PB\"),Z(n,\"26333\",\"PB\"),Z(n,\"26355\",\"ZY\"),Z(n,\"26366\",\"CZ\"),Z(n,\"26397\",\"ZC\"),Z(n,\"26399\",\"QJ\"),Z(n,\"26415\",\"ZS\"),Z(n,\"26451\",\"SB\"),Z(n,\"26526\",\"ZC\"),Z(n,\"26552\",\"JG\"),Z(n,\"26561\",\"TD\"),Z(n,\"26588\",\"JG\"),Z(n,\"26597\",\"CZ\"),Z(n,\"26629\",\"ZS\"),Z(n,\"26638\",\"YL\"),Z(n,\"26646\",\"XQ\"),Z(n,\"26653\",\"KG\"),Z(n,\"26657\",\"XJ\"),Z(n,\"26727\",\"HG\"),Z(n,\"26894\",\"ZC\"),Z(n,\"26937\",\"ZS\"),Z(n,\"26946\",\"ZC\"),Z(n,\"26999\",\"KJ\"),Z(n,\"27099\",\"KJ\"),Z(n,\"27449\",\"YQ\"),Z(n,\"27481\",\"XS\"),Z(n,\"27542\",\"ZS\"),Z(n,\"27663\",\"ZS\"),Z(n,\"27748\",\"TS\"),Z(n,\"27784\",\"SC\"),Z(n,\"27788\",\"ZD\"),Z(n,\"27795\",\"TD\"),Z(n,\"27812\",\"O\"),Z(n,\"27850\",\"PB\"),Z(n,\"27852\",\"MB\"),Z(n,\"27895\",\"SL\"),Z(n,\"27898\",\"PL\"),Z(n,\"27973\",\"QJ\"),Z(n,\"27981\",\"KH\"),Z(n,\"27986\",\"HX\"),Z(n,\"27994\",\"XJ\"),Z(n,\"28044\",\"YC\"),Z(n,\"28065\",\"WG\"),Z(n,\"28177\",\"SM\"),Z(n,\"28267\",\"QJ\"),Z(n,\"28291\",\"KH\"),Z(n,\"28337\",\"ZQ\"),Z(n,\"28463\",\"TL\"),Z(n,\"28548\",\"DC\"),Z(n,\"28601\",\"TD\"),Z(n,\"28689\",\"PB\"),Z(n,\"28805\",\"JG\"),Z(n,\"28820\",\"QG\"),Z(n,\"28846\",\"PB\"),Z(n,\"28952\",\"TD\"),Z(n,\"28975\",\"ZC\"),Z(n,\"29100\",\"A\"),Z(n,\"29325\",\"QJ\"),Z(n,\"29575\",\"SL\"),Z(n,\"29602\",\"FB\"),Z(n,\"30010\",\"TD\"),Z(n,\"30044\",\"CX\"),Z(n,\"30058\",\"PF\"),Z(n,\"30091\",\"YSP\"),Z(n,\"30111\",\"YN\"),Z(n,\"30229\",\"XJ\"),Z(n,\"30427\",\"SC\"),Z(n,\"30465\",\"SX\"),Z(n,\"30631\",\"YQ\"),Z(n,\"30655\",\"QJ\"),Z(n,\"30684\",\"QJG\"),Z(n,\"30707\",\"SD\"),Z(n,\"30729\",\"XH\"),Z(n,\"30796\",\"LG\"),Z(n,\"30917\",\"PB\"),Z(n,\"31074\",\"NM\"),Z(n,\"31085\",\"JZ\"),Z(n,\"31109\",\"SC\"),Z(n,\"31181\",\"ZC\"),Z(n,\"31192\",\"MLB\"),Z(n,\"31293\",\"JQ\"),Z(n,\"31400\",\"YX\"),Z(n,\"31584\",\"YJ\"),Z(n,\"31896\",\"ZN\"),Z(n,\"31909\",\"ZY\"),Z(n,\"31995\",\"XJ\"),Z(n,\"32321\",\"PF\"),Z(n,\"32327\",\"ZY\"),Z(n,\"32418\",\"HG\"),Z(n,\"32420\",\"XQ\"),Z(n,\"32421\",\"HG\"),Z(n,\"32438\",\"LG\"),Z(n,\"32473\",\"GJ\"),Z(n,\"32488\",\"TD\"),Z(n,\"32521\",\"QJ\"),Z(n,\"32527\",\"PB\"),Z(n,\"32562\",\"ZSQ\"),Z(n,\"32564\",\"JZ\"),Z(n,\"32735\",\"ZD\"),Z(n,\"32793\",\"PB\"),Z(n,\"33071\",\"PF\"),Z(n,\"33098\",\"XL\"),Z(n,\"33100\",\"YA\"),Z(n,\"33152\",\"PB\"),Z(n,\"33261\",\"CX\"),Z(n,\"33324\",\"BP\"),Z(n,\"33333\",\"TD\"),Z(n,\"33406\",\"YA\"),Z(n,\"33426\",\"WM\"),Z(n,\"33432\",\"PB\"),Z(n,\"33445\",\"JG\"),Z(n,\"33486\",\"ZN\"),Z(n,\"33493\",\"TS\"),Z(n,\"33507\",\"QJ\"),Z(n,\"33540\",\"QJ\"),Z(n,\"33544\",\"ZC\"),Z(n,\"33564\",\"XQ\"),Z(n,\"33617\",\"YT\"),Z(n,\"33632\",\"QJ\"),Z(n,\"33636\",\"XH\"),Z(n,\"33637\",\"YX\"),Z(n,\"33694\",\"WG\"),Z(n,\"33705\",\"PF\"),Z(n,\"33728\",\"YW\"),Z(n,\"33882\",\"SR\"),Z(n,\"34067\",\"WM\"),Z(n,\"34074\",\"YW\"),Z(n,\"34121\",\"QJ\"),Z(n,\"34255\",\"ZC\"),Z(n,\"34259\",\"XL\"),Z(n,\"34425\",\"JH\"),Z(n,\"34430\",\"XH\"),Z(n,\"34485\",\"KH\"),Z(n,\"34503\",\"YS\"),Z(n,\"34532\",\"HG\"),Z(n,\"34552\",\"XS\"),Z(n,\"34558\",\"YE\"),Z(n,\"34593\",\"ZL\"),Z(n,\"34660\",\"YQ\"),Z(n,\"34892\",\"XH\"),Z(n,\"34928\",\"SC\"),Z(n,\"34999\",\"QJ\"),Z(n,\"35048\",\"PB\"),Z(n,\"35059\",\"SC\"),Z(n,\"35098\",\"ZC\"),Z(n,\"35203\",\"TQ\"),Z(n,\"35265\",\"JX\"),Z(n,\"35299\",\"JX\"),Z(n,\"35782\",\"SZ\"),Z(n,\"35828\",\"YS\"),Z(n,\"35830\",\"E\"),Z(n,\"35843\",\"TD\"),Z(n,\"35895\",\"YG\"),Z(n,\"35977\",\"MH\"),Z(n,\"36158\",\"JG\"),Z(n,\"36228\",\"QJ\"),Z(n,\"36426\",\"XQ\"),Z(n,\"36466\",\"DC\"),Z(n,\"36710\",\"JC\"),Z(n,\"36711\",\"ZYG\"),Z(n,\"36767\",\"PB\"),Z(n,\"36866\",\"SK\"),Z(n,\"36951\",\"YW\"),Z(n,\"37034\",\"YX\"),Z(n,\"37063\",\"XH\"),Z(n,\"37218\",\"ZC\"),Z(n,\"37325\",\"ZC\"),Z(n,\"38063\",\"PB\"),Z(n,\"38079\",\"TD\"),Z(n,\"38085\",\"QY\"),Z(n,\"38107\",\"DC\"),Z(n,\"38116\",\"TD\"),Z(n,\"38123\",\"YD\"),Z(n,\"38224\",\"HG\"),Z(n,\"38241\",\"XTC\"),Z(n,\"38271\",\"ZC\"),Z(n,\"38415\",\"YE\"),Z(n,\"38426\",\"KH\"),Z(n,\"38461\",\"YD\"),Z(n,\"38463\",\"AE\"),Z(n,\"38466\",\"PB\"),Z(n,\"38477\",\"XJ\"),Z(n,\"38518\",\"YT\"),Z(n,\"38551\",\"WK\"),Z(n,\"38585\",\"ZC\"),Z(n,\"38704\",\"XS\"),Z(n,\"38739\",\"LJ\"),Z(n,\"38761\",\"GJ\"),Z(n,\"38808\",\"SQ\"),Z(n,\"39048\",\"JG\"),Z(n,\"39049\",\"XJ\"),Z(n,\"39052\",\"HG\"),Z(n,\"39076\",\"CZ\"),Z(n,\"39271\",\"XT\"),Z(n,\"39534\",\"TD\"),Z(n,\"39552\",\"TD\"),Z(n,\"39584\",\"PB\"),Z(n,\"39647\",\"SB\"),Z(n,\"39730\",\"LG\"),Z(n,\"39748\",\"TPB\"),Z(n,\"40109\",\"ZQ\"),Z(n,\"40479\",\"ND\"),Z(n,\"40516\",\"HG\"),Z(n,\"40536\",\"HG\"),Z(n,\"40583\",\"QJ\"),Z(n,\"40765\",\"YQ\"),Z(n,\"40784\",\"QJ\"),Z(n,\"40840\",\"YK\"),Z(n,\"40863\",\"QJG\"),n),t.default=L},function(e,t,Y){\"use strict\";var Z=function(){var e=this,t=e.$createElement,Y=e._self._c||t;return Y(\"div\",{staticClass:\"i-editor-md\"},[e._t(\"default\"),e._v(\" \"),Y(\"div\",{ref:\"content\",staticClass:\"dev-md-content\",domProps:{innerHTML:e._s(e.html)}})],2)},n=[],L={render:Z,staticRenderFns:n};t.a=L},function(e,t,Y){\"use strict\";var Z=function(){var e=this,t=e.$createElement,Y=e._self._c||t;return Y(\"div\",{staticClass:\"i-editor\"},[e.affix?Y(\"Affix\",{attrs:{\"offset-top\":e.offsetTop}},[Y(\"div\",{staticClass:\"i-editor-tabs\"},[Y(\"Tabs\",{attrs:{animated:!1},on:{\"on-click\":e.handleChangeTab},model:{value:e.tabType,callback:function(t){e.tabType=t},expression:\"tabType\"}},[Y(\"TabPane\",{attrs:{label:e.writeName,name:\"write\"}}),e._v(\" \"),Y(\"TabPane\",{attrs:{label:\"预览\",name:\"preview\"}}),e._v(\" \"),e.showSummary?Y(\"TabPane\",{attrs:{label:\"写摘要\",name:\"summary\"}}):e._e(),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-upload\",attrs:{slot:\"extra\"},slot:\"extra\"},[Y(\"Upload\",{attrs:{config:e.config,\"before-upload\":e.beforeUpload,styles:1},on:{\"on-success\":e.handleUploadSuccess}}),e._v(\" \"),Y(\"Upload\",{attrs:{config:e.config,styles:6},on:{\"on-success\":e.handleImportMd}}),e._v(\" \"),Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\"},on:{click:function(t){e.showDiff=!0}}},[Y(\"Tooltip\",{attrs:{content:\"全屏编辑\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"md-expand\"}})],1)],1),e._v(\" \"),Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\"},on:{click:function(t){e.showMdTip=!0}}},[Y(\"Tooltip\",{attrs:{content:\"Markdown 语法提示\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"logo-markdown\"}})],1)],1)],1)],1)],1)]):Y(\"div\",{staticClass:\"i-editor-tabs\"},[Y(\"Tabs\",{attrs:{animated:!1},on:{\"on-click\":e.handleChangeTab},model:{value:e.tabType,callback:function(t){e.tabType=t},expression:\"tabType\"}},[Y(\"TabPane\",{attrs:{label:e.writeName,name:\"write\"}}),e._v(\" \"),Y(\"TabPane\",{attrs:{label:\"预览\",name:\"preview\"}}),e._v(\" \"),e.showSummary?Y(\"TabPane\",{attrs:{label:\"写摘要\",name:\"summary\"}}):e._e(),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-upload\",attrs:{slot:\"extra\"},slot:\"extra\"},[Y(\"Upload\",{attrs:{config:e.config,\"before-upload\":e.beforeUpload,styles:1},on:{\"on-success\":e.handleUploadSuccess}}),e._v(\" \"),Y(\"Upload\",{attrs:{config:e.config,styles:6},on:{\"on-success\":e.handleImportMd}}),e._v(\" \"),Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\"},on:{click:function(t){e.showDiff=!0}}},[Y(\"Tooltip\",{attrs:{content:\"全屏编辑\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"md-expand\"}})],1)],1),e._v(\" \"),Y(\"Button\",{staticClass:\"i-editor-upload-item\",attrs:{type:\"text\",size:\"small\"},on:{click:function(t){e.showMdTip=!0}}},[Y(\"Tooltip\",{attrs:{content:\"Markdown 语法提示\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"logo-markdown\"}})],1)],1)],1)],1)],1),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-md\"},[e.showDiff?e._e():Y(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"write\"===e.tabType,expression:\"tabType === 'write'\"}],staticClass:\"i-editor-wrapper\"},[Y(\"Upload\",{attrs:{paste:e.paste,config:e.config,\"before-upload\":e.beforeUpload,type:\"drag\",styles:3},on:{\"on-success\":e.handleUploadSuccess},nativeOn:{click:function(e){e.preventDefault(),e.stopPropagation()}}},[Y(\"Input\",{ref:\"content\",attrs:{placeholder:e.placeholder,type:\"textarea\",autosize:e.autosize},model:{value:e.content,callback:function(t){e.content=t},expression:\"content\"}})],1)],1),e._v(\" \"),\"preview\"===e.tabType?Y(\"div\",{staticClass:\"i-editor-wrapper\"},[Y(\"Markdown\",{ref:\"markdown\",attrs:{content:e.content,highlight:e.highlight}})],1):e._e(),e._v(\" \"),\"summary\"===e.tabType?Y(\"div\",{staticClass:\"i-editor-wrapper\"},[Y(\"Input\",{ref:\"summary\",attrs:{placeholder:\"摘要会在文章列表显示，只支持纯文本。\",type:\"textarea\",autosize:{minRows:6}},model:{value:e.summary,callback:function(t){e.summary=t},expression:\"summary\"}})],1):e._e()]),e._v(\" \"),Y(\"Modal\",{staticClass:\"i-editor-md-tip\",attrs:{title:\"常用 Markdown 语法\",scrollable:\"\",width:\"300\",draggable:\"\",\"footer-hide\":\"\"},model:{value:e.showMdTip,callback:function(t){e.showMdTip=t},expression:\"showMdTip\"}},[Y(\"row\",[Y(\"i-col\",{attrs:{span:\"10\"}},[Y(\"div\",[Y(\"strong\",[e._v(\"Markdown\")])]),e._v(\" \"),Y(\"div\",[e._v(\"# 标题\")]),e._v(\" \"),Y(\"div\",[e._v(\"## 标题\")]),e._v(\" \"),Y(\"div\",[e._v(\"**粗体**\")]),e._v(\" \"),Y(\"div\",[e._v(\"*斜体*\")]),e._v(\" \"),Y(\"div\",[e._v(\"[描述](http://)\")]),e._v(\" \"),Y(\"div\",[e._v(\"`code`\")]),e._v(\" \"),Y(\"div\",[e._v(\"```code```\")]),e._v(\" \"),Y(\"div\",[e._v(\"![alt](http://)\")]),e._v(\" \"),Y(\"div\",[e._v(\"- item\")]),e._v(\" \"),Y(\"div\",[e._v(\"1. item\")]),e._v(\" \"),Y(\"div\",[e._v(\"> 引用内容\")])]),e._v(\" \"),Y(\"i-col\",{attrs:{span:\"14\"}},[Y(\"div\",[Y(\"strong\",[e._v(\"结果\")])]),e._v(\" \"),Y(\"div\",[e._v(\"H1\")]),e._v(\" \"),Y(\"div\",[e._v(\"H2\")]),e._v(\" \"),Y(\"div\",[Y(\"strong\",[e._v(\"粗体\")])]),e._v(\" \"),Y(\"div\",[Y(\"i\",[e._v(\"斜体\")])]),e._v(\" \"),Y(\"div\",[Y(\"a\",{attrs:{href:\"javascript:void(0)\"}},[e._v(\"链接\")])]),e._v(\" \"),Y(\"div\",[Y(\"code\",[e._v(\"Inline Code\")])]),e._v(\" \"),Y(\"div\",[Y(\"code\",[e._v(\"Code\")])]),e._v(\" \"),Y(\"div\",[e._v(\"图片\")]),e._v(\" \"),Y(\"div\",[Y(\"ul\",[Y(\"li\",[e._v(\"无序列表\")])])]),e._v(\" \"),Y(\"div\",[Y(\"ol\",[Y(\"li\",[e._v(\"有序列表\")])])]),e._v(\" \"),Y(\"div\",[Y(\"blockquote\",[e._v(\"引用内容\")])])])],1),e._v(\" \"),Y(\"a\",{attrs:{href:\"http://wowubuntu.com/markdown/\",target:\"_blank\"}},[e._v(\"更多语法\")])],1),e._v(\" \"),Y(\"Modal\",{attrs:{closable:!1,\"mask-closable\":!1,width:\"100\",\"class-name\":\"i-editor-fullscreen\",\"footer-hide\":\"\",\"transition-names\":[\"\",\"\"]},model:{value:e.showDiff,callback:function(t){e.showDiff=t},expression:\"showDiff\"}},[e.showDiff?Y(\"div\",{staticClass:\"i-editor-fullscreen-container\"},[Y(\"div\",{staticClass:\"i-editor-fullscreen-header\",attrs:{slot:\"header\"},slot:\"header\"},[Y(\"p\",[e._v(\"全屏编辑\")]),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-fullscreen-header-tip\"},[Y(\"Upload\",{attrs:{config:e.config,\"before-upload\":e.beforeUpload,styles:1},on:{\"on-success\":e.handleUploadSuccess}}),e._v(\" \"),Y(\"Button\",{staticClass:\"i-editor-item\",attrs:{type:\"text\",size:\"small\"},on:{click:function(t){e.showDiff=!1}}},[Y(\"Tooltip\",{attrs:{content:\"退出全屏\",transfer:\"\"}},[Y(\"Icon\",{attrs:{type:\"md-contract\"}})],1)],1)],1)]),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-fullscreen-main\"},[Y(\"row\",{attrs:{gutter:32}},[Y(\"i-col\",{attrs:{span:\"12\"}},[e.showDiffEditor?Y(\"Upload\",{attrs:{paste:e.paste,config:e.config,\"before-upload\":e.beforeUpload,type:\"drag\",styles:3},on:{\"on-success\":e.handleUploadSuccess},nativeOn:{click:function(e){e.preventDefault(),e.stopPropagation()}}},[Y(\"Input\",{ref:\"content\",attrs:{placeholder:e.placeholder,type:\"textarea\",autosize:e.autosize},model:{value:e.content,callback:function(t){e.content=t},expression:\"content\"}})],1):e._e()],1),e._v(\" \"),Y(\"i-col\",{attrs:{span:\"12\"}},[Y(\"Markdown\",{attrs:{content:e.content,highlight:e.highlight}})],1)],1)],1),e._v(\" \"),Y(\"div\",{staticClass:\"i-editor-fullscreen-tail\"})]):e._e()])],1)},n=[],L={render:Z,staticRenderFns:n};t.a=L}])});\n//# sourceMappingURL=iview-editor.js.map"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/iview/styles/iview-editor.css",
    "content": ".hljs{display:block;overflow-x:auto;color:#525252;padding:15px;-webkit-text-size-adjust:none}.hljs-doctype{color:#999}.css .hljs-selector-tag,.hljs-tag{color:#3e76f6}.hljs-attr,.hljs-attribute{color:#e96900}.hljs-value{color:#42b983}.hljs-keyword{color:#e96900}.hljs-string{color:#42b983}.hljs-comment{color:#b3b3b3}.hljs-operator .hljs-comment{color:#525252}.hljs-regexp{color:#af7dff}.hljs-built_in{color:#2db7f5}.css .hljs-class,.css .hljs-selector-class{color:#e96900}.css .hljs-number,.javascript .hljs-number{color:#fc1e70}.css .hljs-attribute{color:#af7dff}.css .hljs-important{color:red}.actionscript .hljs-literal,.javascript .hljs-literal{color:#fc1e70}.i-editor{padding-bottom:12px}.i-editor-md{font-size:14px;color:#515a6e}.i-editor-md h1,.i-editor-md h2,.i-editor-md h3,.i-editor-md h4,.i-editor-md h5,.i-editor-md h6{font-weight:700;margin:1em 0;color:#17233d}.i-editor-md hr{height:.05em;border:0;color:#ccc;background-color:#ccc}.i-editor-md blockquote{margin:1em 0;border-left:4px solid #ddd;padding:0 1em;color:#666}.i-editor-md pre{font-size:14px;padding:16px;overflow:auto;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.i-editor-md code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px;font-family:SFMono-Regular,Consolas,\"Liberation Mono\",Menlo,Courier,monospace}.i-editor-md pre>code{border:0;margin:0;padding:0;background-color:#f6f8fa;font-size:100%}.i-editor-md a,.i-editor-md a:visited{color:#4183c4;background-color:inherit;text-decoration:none}.i-editor-md img{max-width:100%}.i-editor-md div,.i-editor-md p{line-height:1.7em}.i-editor-md ol,.i-editor-md ul{padding-left:2em}.i-editor-md table{display:block;width:100%;overflow:hidden;border-spacing:0;border-collapse:collapse}.i-editor-md table tr{background-color:#fff;border-top:1px solid #c6cbd1}.i-editor-md table tr:nth-child(2n){background-color:#f6f8fa}.i-editor-md table td,.i-editor-md table th{padding:6px 13px;border:1px solid #dfe2e5}.i-editor-md table th{font-weight:600}.i-editor-md blockquote,.i-editor-md dl,.i-editor-md ol,.i-editor-md p,.i-editor-md pre,.i-editor-md table,.i-editor-md ul{margin-top:0;margin-bottom:.72em}.i-editor-md-cover{width:100%}.i-editor-md-cover img{max-width:100%}.i-editor-tabs{padding-top:5px;padding-bottom:10px;background:#fff}.i-editor-tabs .ivu-tabs-bar{margin-bottom:0;border-bottom:1px solid #eeeff2}.i-editor-md{margin-top:6px}.i-editor-md-tip div{margin-bottom:6px;font-size:14px}.i-editor-md-tip code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px;font-family:SFMono-Regular,Consolas,\"Liberation Mono\",Menlo,Courier,monospace}.i-editor-md-tip blockquote{margin:1em 0;border-left:4px solid #ddd;padding:0 1em;color:#666}.i-editor-wrapper{padding:0 12px 4px}.i-editor-wrapper .ivu-upload-drag{border:none;overflow:visible}.i-editor-wrapper .ivu-upload-dragOver .ivu-input{border:1px dashed #2d8cf0}.i-editor-fullscreen{min-height:100%}.i-editor-fullscreen .ivu-modal{top:0;height:100%}.i-editor-fullscreen .ivu-modal-content{min-height:100%;border-radius:0}.i-editor-fullscreen-header{width:100%;height:24px;position:fixed;top:0;left:0;border-bottom:1px solid #e8eaec;z-index:1;background:#fff}.i-editor-fullscreen-header p{display:inline-block;float:left;height:24px;line-height:24px;padding-left:16px}.i-editor-fullscreen-header-tip{float:right;margin-right:30px}.i-editor-fullscreen-header-tip .ivu-upload{display:inline-block}.i-editor-fullscreen-main{margin-top:30px}.i-editor-fullscreen-main .ivu-upload-drag{border:none}.i-editor-fullscreen-main .ivu-input{border:none;resize:none}.i-editor-fullscreen-tail{width:1px;height:100%;background:#e8eaec;position:fixed;top:0;left:50%}.i-editor-upload{height:36px;line-height:36px;padding-right:12px}.i-editor-upload .ivu-upload{display:inline-block}.i-editor-upload-item{color:inherit}.i-editor-upload-item i{font-size:16px;vertical-align:middle}.i-editor-upload-cover{background-size:cover;background-position:center}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/iview/styles/iview.css",
    "content": ".ivu-load-loop{-webkit-animation:ani-load-loop 1s linear infinite;animation:ani-load-loop 1s linear infinite}@-webkit-keyframes ani-load-loop{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes ani-load-loop{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.input-group-error-append,.input-group-error-prepend{background-color:#fff;border:1px solid #ed4014}.input-group-error-append .ivu-select-selection,.input-group-error-prepend .ivu-select-selection{background-color:inherit;border:1px solid transparent}.input-group-error-prepend{border-right:0}.input-group-error-append{border-left:0}.ivu-breadcrumb{color:#999;font-size:14px}.ivu-breadcrumb a{color:#515a6e;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-breadcrumb a:hover{color:#57a3f3}.ivu-breadcrumb>span:last-child{font-weight:700;color:#515a6e}.ivu-breadcrumb>span:last-child .ivu-breadcrumb-item-separator{display:none}.ivu-breadcrumb-item-separator{margin:0 8px;color:#dcdee2}.ivu-breadcrumb-item-link>.ivu-icon+span{margin-left:4px}/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}body{font-family:\"Helvetica Neue\",Helvetica,\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",\"微软雅黑\",Arial,sans-serif;font-size:12px;line-height:1.5;color:#515a6e;background-color:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}input::-ms-clear,input::-ms-reveal{display:none}a{color:#2d8cf0;background:0 0;text-decoration:none;outline:0;cursor:pointer;-webkit-transition:color .2s ease;transition:color .2s ease}a:hover{color:#57a3f3}a:active{color:#2b85e4}a:active,a:hover{outline:0;text-decoration:none}a[disabled]{color:#ccc;cursor:not-allowed;pointer-events:none}code,kbd,pre,samp{font-family:Consolas,Menlo,Courier,monospace}@font-face{font-family:Ionicons;src:url(fonts/ionicons.ttf?v=3.0.0) format(\"truetype\"),url(fonts/ionicons.woff?v=3.0.0) format(\"woff\"),url(fonts/ionicons.svg?v=3.0.0#Ionicons) format(\"svg\");font-weight:400;font-style:normal}.ivu-icon{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}.ivu-icon-ios-add-circle-outline:before{content:\"\\f100\"}.ivu-icon-ios-add-circle:before{content:\"\\f101\"}.ivu-icon-ios-add:before{content:\"\\f102\"}.ivu-icon-ios-alarm-outline:before{content:\"\\f103\"}.ivu-icon-ios-alarm:before{content:\"\\f104\"}.ivu-icon-ios-albums-outline:before{content:\"\\f105\"}.ivu-icon-ios-albums:before{content:\"\\f106\"}.ivu-icon-ios-alert-outline:before{content:\"\\f107\"}.ivu-icon-ios-alert:before{content:\"\\f108\"}.ivu-icon-ios-american-football-outline:before{content:\"\\f109\"}.ivu-icon-ios-american-football:before{content:\"\\f10a\"}.ivu-icon-ios-analytics-outline:before{content:\"\\f10b\"}.ivu-icon-ios-analytics:before{content:\"\\f10c\"}.ivu-icon-ios-aperture-outline:before{content:\"\\f10d\"}.ivu-icon-ios-aperture:before{content:\"\\f10e\"}.ivu-icon-ios-apps-outline:before{content:\"\\f10f\"}.ivu-icon-ios-apps:before{content:\"\\f110\"}.ivu-icon-ios-appstore-outline:before{content:\"\\f111\"}.ivu-icon-ios-appstore:before{content:\"\\f112\"}.ivu-icon-ios-archive-outline:before{content:\"\\f113\"}.ivu-icon-ios-archive:before{content:\"\\f114\"}.ivu-icon-ios-arrow-back:before{content:\"\\f115\"}.ivu-icon-ios-arrow-down:before{content:\"\\f116\"}.ivu-icon-ios-arrow-dropdown-circle:before{content:\"\\f117\"}.ivu-icon-ios-arrow-dropdown:before{content:\"\\f118\"}.ivu-icon-ios-arrow-dropleft-circle:before{content:\"\\f119\"}.ivu-icon-ios-arrow-dropleft:before{content:\"\\f11a\"}.ivu-icon-ios-arrow-dropright-circle:before{content:\"\\f11b\"}.ivu-icon-ios-arrow-dropright:before{content:\"\\f11c\"}.ivu-icon-ios-arrow-dropup-circle:before{content:\"\\f11d\"}.ivu-icon-ios-arrow-dropup:before{content:\"\\f11e\"}.ivu-icon-ios-arrow-forward:before{content:\"\\f11f\"}.ivu-icon-ios-arrow-round-back:before{content:\"\\f120\"}.ivu-icon-ios-arrow-round-down:before{content:\"\\f121\"}.ivu-icon-ios-arrow-round-forward:before{content:\"\\f122\"}.ivu-icon-ios-arrow-round-up:before{content:\"\\f123\"}.ivu-icon-ios-arrow-up:before{content:\"\\f124\"}.ivu-icon-ios-at-outline:before{content:\"\\f125\"}.ivu-icon-ios-at:before{content:\"\\f126\"}.ivu-icon-ios-attach:before{content:\"\\f127\"}.ivu-icon-ios-backspace-outline:before{content:\"\\f128\"}.ivu-icon-ios-backspace:before{content:\"\\f129\"}.ivu-icon-ios-barcode-outline:before{content:\"\\f12a\"}.ivu-icon-ios-barcode:before{content:\"\\f12b\"}.ivu-icon-ios-baseball-outline:before{content:\"\\f12c\"}.ivu-icon-ios-baseball:before{content:\"\\f12d\"}.ivu-icon-ios-basket-outline:before{content:\"\\f12e\"}.ivu-icon-ios-basket:before{content:\"\\f12f\"}.ivu-icon-ios-basketball-outline:before{content:\"\\f130\"}.ivu-icon-ios-basketball:before{content:\"\\f131\"}.ivu-icon-ios-battery-charging:before{content:\"\\f132\"}.ivu-icon-ios-battery-dead:before{content:\"\\f133\"}.ivu-icon-ios-battery-full:before{content:\"\\f134\"}.ivu-icon-ios-beaker-outline:before{content:\"\\f135\"}.ivu-icon-ios-beaker:before{content:\"\\f136\"}.ivu-icon-ios-beer-outline:before{content:\"\\f137\"}.ivu-icon-ios-beer:before{content:\"\\f138\"}.ivu-icon-ios-bicycle:before{content:\"\\f139\"}.ivu-icon-ios-bluetooth:before{content:\"\\f13a\"}.ivu-icon-ios-boat-outline:before{content:\"\\f13b\"}.ivu-icon-ios-boat:before{content:\"\\f13c\"}.ivu-icon-ios-body-outline:before{content:\"\\f13d\"}.ivu-icon-ios-body:before{content:\"\\f13e\"}.ivu-icon-ios-bonfire-outline:before{content:\"\\f13f\"}.ivu-icon-ios-bonfire:before{content:\"\\f140\"}.ivu-icon-ios-book-outline:before{content:\"\\f141\"}.ivu-icon-ios-book:before{content:\"\\f142\"}.ivu-icon-ios-bookmark-outline:before{content:\"\\f143\"}.ivu-icon-ios-bookmark:before{content:\"\\f144\"}.ivu-icon-ios-bookmarks-outline:before{content:\"\\f145\"}.ivu-icon-ios-bookmarks:before{content:\"\\f146\"}.ivu-icon-ios-bowtie-outline:before{content:\"\\f147\"}.ivu-icon-ios-bowtie:before{content:\"\\f148\"}.ivu-icon-ios-briefcase-outline:before{content:\"\\f149\"}.ivu-icon-ios-briefcase:before{content:\"\\f14a\"}.ivu-icon-ios-browsers-outline:before{content:\"\\f14b\"}.ivu-icon-ios-browsers:before{content:\"\\f14c\"}.ivu-icon-ios-brush-outline:before{content:\"\\f14d\"}.ivu-icon-ios-brush:before{content:\"\\f14e\"}.ivu-icon-ios-bug-outline:before{content:\"\\f14f\"}.ivu-icon-ios-bug:before{content:\"\\f150\"}.ivu-icon-ios-build-outline:before{content:\"\\f151\"}.ivu-icon-ios-build:before{content:\"\\f152\"}.ivu-icon-ios-bulb-outline:before{content:\"\\f153\"}.ivu-icon-ios-bulb:before{content:\"\\f154\"}.ivu-icon-ios-bus-outline:before{content:\"\\f155\"}.ivu-icon-ios-bus:before{content:\"\\f156\"}.ivu-icon-ios-cafe-outline:before{content:\"\\f157\"}.ivu-icon-ios-cafe:before{content:\"\\f158\"}.ivu-icon-ios-calculator-outline:before{content:\"\\f159\"}.ivu-icon-ios-calculator:before{content:\"\\f15a\"}.ivu-icon-ios-calendar-outline:before{content:\"\\f15b\"}.ivu-icon-ios-calendar:before{content:\"\\f15c\"}.ivu-icon-ios-call-outline:before{content:\"\\f15d\"}.ivu-icon-ios-call:before{content:\"\\f15e\"}.ivu-icon-ios-camera-outline:before{content:\"\\f15f\"}.ivu-icon-ios-camera:before{content:\"\\f160\"}.ivu-icon-ios-car-outline:before{content:\"\\f161\"}.ivu-icon-ios-car:before{content:\"\\f162\"}.ivu-icon-ios-card-outline:before{content:\"\\f163\"}.ivu-icon-ios-card:before{content:\"\\f164\"}.ivu-icon-ios-cart-outline:before{content:\"\\f165\"}.ivu-icon-ios-cart:before{content:\"\\f166\"}.ivu-icon-ios-cash-outline:before{content:\"\\f167\"}.ivu-icon-ios-cash:before{content:\"\\f168\"}.ivu-icon-ios-chatboxes-outline:before{content:\"\\f169\"}.ivu-icon-ios-chatboxes:before{content:\"\\f16a\"}.ivu-icon-ios-chatbubbles-outline:before{content:\"\\f16b\"}.ivu-icon-ios-chatbubbles:before{content:\"\\f16c\"}.ivu-icon-ios-checkbox-outline:before{content:\"\\f16d\"}.ivu-icon-ios-checkbox:before{content:\"\\f16e\"}.ivu-icon-ios-checkmark-circle-outline:before{content:\"\\f16f\"}.ivu-icon-ios-checkmark-circle:before{content:\"\\f170\"}.ivu-icon-ios-checkmark:before{content:\"\\f171\"}.ivu-icon-ios-clipboard-outline:before{content:\"\\f172\"}.ivu-icon-ios-clipboard:before{content:\"\\f173\"}.ivu-icon-ios-clock-outline:before{content:\"\\f174\"}.ivu-icon-ios-clock:before{content:\"\\f175\"}.ivu-icon-ios-close-circle-outline:before{content:\"\\f176\"}.ivu-icon-ios-close-circle:before{content:\"\\f177\"}.ivu-icon-ios-close:before{content:\"\\f178\"}.ivu-icon-ios-closed-captioning-outline:before{content:\"\\f179\"}.ivu-icon-ios-closed-captioning:before{content:\"\\f17a\"}.ivu-icon-ios-cloud-circle-outline:before{content:\"\\f17b\"}.ivu-icon-ios-cloud-circle:before{content:\"\\f17c\"}.ivu-icon-ios-cloud-done-outline:before{content:\"\\f17d\"}.ivu-icon-ios-cloud-done:before{content:\"\\f17e\"}.ivu-icon-ios-cloud-download-outline:before{content:\"\\f17f\"}.ivu-icon-ios-cloud-download:before{content:\"\\f180\"}.ivu-icon-ios-cloud-outline:before{content:\"\\f181\"}.ivu-icon-ios-cloud-upload-outline:before{content:\"\\f182\"}.ivu-icon-ios-cloud-upload:before{content:\"\\f183\"}.ivu-icon-ios-cloud:before{content:\"\\f184\"}.ivu-icon-ios-cloudy-night-outline:before{content:\"\\f185\"}.ivu-icon-ios-cloudy-night:before{content:\"\\f186\"}.ivu-icon-ios-cloudy-outline:before{content:\"\\f187\"}.ivu-icon-ios-cloudy:before{content:\"\\f188\"}.ivu-icon-ios-code-download:before{content:\"\\f189\"}.ivu-icon-ios-code-working:before{content:\"\\f18a\"}.ivu-icon-ios-code:before{content:\"\\f18b\"}.ivu-icon-ios-cog-outline:before{content:\"\\f18c\"}.ivu-icon-ios-cog:before{content:\"\\f18d\"}.ivu-icon-ios-color-fill-outline:before{content:\"\\f18e\"}.ivu-icon-ios-color-fill:before{content:\"\\f18f\"}.ivu-icon-ios-color-filter-outline:before{content:\"\\f190\"}.ivu-icon-ios-color-filter:before{content:\"\\f191\"}.ivu-icon-ios-color-palette-outline:before{content:\"\\f192\"}.ivu-icon-ios-color-palette:before{content:\"\\f193\"}.ivu-icon-ios-color-wand-outline:before{content:\"\\f194\"}.ivu-icon-ios-color-wand:before{content:\"\\f195\"}.ivu-icon-ios-compass-outline:before{content:\"\\f196\"}.ivu-icon-ios-compass:before{content:\"\\f197\"}.ivu-icon-ios-construct-outline:before{content:\"\\f198\"}.ivu-icon-ios-construct:before{content:\"\\f199\"}.ivu-icon-ios-contact-outline:before{content:\"\\f19a\"}.ivu-icon-ios-contact:before{content:\"\\f19b\"}.ivu-icon-ios-contacts-outline:before{content:\"\\f19c\"}.ivu-icon-ios-contacts:before{content:\"\\f19d\"}.ivu-icon-ios-contract:before{content:\"\\f19e\"}.ivu-icon-ios-contrast:before{content:\"\\f19f\"}.ivu-icon-ios-copy-outline:before{content:\"\\f1a0\"}.ivu-icon-ios-copy:before{content:\"\\f1a1\"}.ivu-icon-ios-create-outline:before{content:\"\\f1a2\"}.ivu-icon-ios-create:before{content:\"\\f1a3\"}.ivu-icon-ios-crop-outline:before{content:\"\\f1a4\"}.ivu-icon-ios-crop:before{content:\"\\f1a5\"}.ivu-icon-ios-cube-outline:before{content:\"\\f1a6\"}.ivu-icon-ios-cube:before{content:\"\\f1a7\"}.ivu-icon-ios-cut-outline:before{content:\"\\f1a8\"}.ivu-icon-ios-cut:before{content:\"\\f1a9\"}.ivu-icon-ios-desktop-outline:before{content:\"\\f1aa\"}.ivu-icon-ios-desktop:before{content:\"\\f1ab\"}.ivu-icon-ios-disc-outline:before{content:\"\\f1ac\"}.ivu-icon-ios-disc:before{content:\"\\f1ad\"}.ivu-icon-ios-document-outline:before{content:\"\\f1ae\"}.ivu-icon-ios-document:before{content:\"\\f1af\"}.ivu-icon-ios-done-all:before{content:\"\\f1b0\"}.ivu-icon-ios-download-outline:before{content:\"\\f1b1\"}.ivu-icon-ios-download:before{content:\"\\f1b2\"}.ivu-icon-ios-easel-outline:before{content:\"\\f1b3\"}.ivu-icon-ios-easel:before{content:\"\\f1b4\"}.ivu-icon-ios-egg-outline:before{content:\"\\f1b5\"}.ivu-icon-ios-egg:before{content:\"\\f1b6\"}.ivu-icon-ios-exit-outline:before{content:\"\\f1b7\"}.ivu-icon-ios-exit:before{content:\"\\f1b8\"}.ivu-icon-ios-expand:before{content:\"\\f1b9\"}.ivu-icon-ios-eye-off-outline:before{content:\"\\f1ba\"}.ivu-icon-ios-eye-off:before{content:\"\\f1bb\"}.ivu-icon-ios-eye-outline:before{content:\"\\f1bc\"}.ivu-icon-ios-eye:before{content:\"\\f1bd\"}.ivu-icon-ios-fastforward-outline:before{content:\"\\f1be\"}.ivu-icon-ios-fastforward:before{content:\"\\f1bf\"}.ivu-icon-ios-female:before{content:\"\\f1c0\"}.ivu-icon-ios-filing-outline:before{content:\"\\f1c1\"}.ivu-icon-ios-filing:before{content:\"\\f1c2\"}.ivu-icon-ios-film-outline:before{content:\"\\f1c3\"}.ivu-icon-ios-film:before{content:\"\\f1c4\"}.ivu-icon-ios-finger-print:before{content:\"\\f1c5\"}.ivu-icon-ios-flag-outline:before{content:\"\\f1c6\"}.ivu-icon-ios-flag:before{content:\"\\f1c7\"}.ivu-icon-ios-flame-outline:before{content:\"\\f1c8\"}.ivu-icon-ios-flame:before{content:\"\\f1c9\"}.ivu-icon-ios-flash-outline:before{content:\"\\f1ca\"}.ivu-icon-ios-flash:before{content:\"\\f1cb\"}.ivu-icon-ios-flask-outline:before{content:\"\\f1cc\"}.ivu-icon-ios-flask:before{content:\"\\f1cd\"}.ivu-icon-ios-flower-outline:before{content:\"\\f1ce\"}.ivu-icon-ios-flower:before{content:\"\\f1cf\"}.ivu-icon-ios-folder-open-outline:before{content:\"\\f1d0\"}.ivu-icon-ios-folder-open:before{content:\"\\f1d1\"}.ivu-icon-ios-folder-outline:before{content:\"\\f1d2\"}.ivu-icon-ios-folder:before{content:\"\\f1d3\"}.ivu-icon-ios-football-outline:before{content:\"\\f1d4\"}.ivu-icon-ios-football:before{content:\"\\f1d5\"}.ivu-icon-ios-funnel-outline:before{content:\"\\f1d6\"}.ivu-icon-ios-funnel:before{content:\"\\f1d7\"}.ivu-icon-ios-game-controller-a-outline:before{content:\"\\f1d8\"}.ivu-icon-ios-game-controller-a:before{content:\"\\f1d9\"}.ivu-icon-ios-game-controller-b-outline:before{content:\"\\f1da\"}.ivu-icon-ios-game-controller-b:before{content:\"\\f1db\"}.ivu-icon-ios-git-branch:before{content:\"\\f1dc\"}.ivu-icon-ios-git-commit:before{content:\"\\f1dd\"}.ivu-icon-ios-git-compare:before{content:\"\\f1de\"}.ivu-icon-ios-git-merge:before{content:\"\\f1df\"}.ivu-icon-ios-git-network:before{content:\"\\f1e0\"}.ivu-icon-ios-git-pull-request:before{content:\"\\f1e1\"}.ivu-icon-ios-glasses-outline:before{content:\"\\f1e2\"}.ivu-icon-ios-glasses:before{content:\"\\f1e3\"}.ivu-icon-ios-globe-outline:before{content:\"\\f1e4\"}.ivu-icon-ios-globe:before{content:\"\\f1e5\"}.ivu-icon-ios-grid-outline:before{content:\"\\f1e6\"}.ivu-icon-ios-grid:before{content:\"\\f1e7\"}.ivu-icon-ios-hammer-outline:before{content:\"\\f1e8\"}.ivu-icon-ios-hammer:before{content:\"\\f1e9\"}.ivu-icon-ios-hand-outline:before{content:\"\\f1ea\"}.ivu-icon-ios-hand:before{content:\"\\f1eb\"}.ivu-icon-ios-happy-outline:before{content:\"\\f1ec\"}.ivu-icon-ios-happy:before{content:\"\\f1ed\"}.ivu-icon-ios-headset-outline:before{content:\"\\f1ee\"}.ivu-icon-ios-headset:before{content:\"\\f1ef\"}.ivu-icon-ios-heart-outline:before{content:\"\\f1f0\"}.ivu-icon-ios-heart:before{content:\"\\f1f1\"}.ivu-icon-ios-help-buoy-outline:before{content:\"\\f1f2\"}.ivu-icon-ios-help-buoy:before{content:\"\\f1f3\"}.ivu-icon-ios-help-circle-outline:before{content:\"\\f1f4\"}.ivu-icon-ios-help-circle:before{content:\"\\f1f5\"}.ivu-icon-ios-help:before{content:\"\\f1f6\"}.ivu-icon-ios-home-outline:before{content:\"\\f1f7\"}.ivu-icon-ios-home:before{content:\"\\f1f8\"}.ivu-icon-ios-ice-cream-outline:before{content:\"\\f1f9\"}.ivu-icon-ios-ice-cream:before{content:\"\\f1fa\"}.ivu-icon-ios-image-outline:before{content:\"\\f1fb\"}.ivu-icon-ios-image:before{content:\"\\f1fc\"}.ivu-icon-ios-images-outline:before{content:\"\\f1fd\"}.ivu-icon-ios-images:before{content:\"\\f1fe\"}.ivu-icon-ios-infinite-outline:before{content:\"\\f1ff\"}.ivu-icon-ios-infinite:before{content:\"\\f200\"}.ivu-icon-ios-information-circle-outline:before{content:\"\\f201\"}.ivu-icon-ios-information-circle:before{content:\"\\f202\"}.ivu-icon-ios-information:before{content:\"\\f203\"}.ivu-icon-ios-ionic-outline:before{content:\"\\f204\"}.ivu-icon-ios-ionic:before{content:\"\\f205\"}.ivu-icon-ios-ionitron-outline:before{content:\"\\f206\"}.ivu-icon-ios-ionitron:before{content:\"\\f207\"}.ivu-icon-ios-jet-outline:before{content:\"\\f208\"}.ivu-icon-ios-jet:before{content:\"\\f209\"}.ivu-icon-ios-key-outline:before{content:\"\\f20a\"}.ivu-icon-ios-key:before{content:\"\\f20b\"}.ivu-icon-ios-keypad-outline:before{content:\"\\f20c\"}.ivu-icon-ios-keypad:before{content:\"\\f20d\"}.ivu-icon-ios-laptop:before{content:\"\\f20e\"}.ivu-icon-ios-leaf-outline:before{content:\"\\f20f\"}.ivu-icon-ios-leaf:before{content:\"\\f210\"}.ivu-icon-ios-link-outline:before{content:\"\\f211\"}.ivu-icon-ios-link:before{content:\"\\f212\"}.ivu-icon-ios-list-box-outline:before{content:\"\\f213\"}.ivu-icon-ios-list-box:before{content:\"\\f214\"}.ivu-icon-ios-list:before{content:\"\\f215\"}.ivu-icon-ios-locate-outline:before{content:\"\\f216\"}.ivu-icon-ios-locate:before{content:\"\\f217\"}.ivu-icon-ios-lock-outline:before{content:\"\\f218\"}.ivu-icon-ios-lock:before{content:\"\\f219\"}.ivu-icon-ios-log-in:before{content:\"\\f21a\"}.ivu-icon-ios-log-out:before{content:\"\\f21b\"}.ivu-icon-ios-magnet-outline:before{content:\"\\f21c\"}.ivu-icon-ios-magnet:before{content:\"\\f21d\"}.ivu-icon-ios-mail-open-outline:before{content:\"\\f21e\"}.ivu-icon-ios-mail-open:before{content:\"\\f21f\"}.ivu-icon-ios-mail-outline:before{content:\"\\f220\"}.ivu-icon-ios-mail:before{content:\"\\f221\"}.ivu-icon-ios-male:before{content:\"\\f222\"}.ivu-icon-ios-man-outline:before{content:\"\\f223\"}.ivu-icon-ios-man:before{content:\"\\f224\"}.ivu-icon-ios-map-outline:before{content:\"\\f225\"}.ivu-icon-ios-map:before{content:\"\\f226\"}.ivu-icon-ios-medal-outline:before{content:\"\\f227\"}.ivu-icon-ios-medal:before{content:\"\\f228\"}.ivu-icon-ios-medical-outline:before{content:\"\\f229\"}.ivu-icon-ios-medical:before{content:\"\\f22a\"}.ivu-icon-ios-medkit-outline:before{content:\"\\f22b\"}.ivu-icon-ios-medkit:before{content:\"\\f22c\"}.ivu-icon-ios-megaphone-outline:before{content:\"\\f22d\"}.ivu-icon-ios-megaphone:before{content:\"\\f22e\"}.ivu-icon-ios-menu-outline:before{content:\"\\f22f\"}.ivu-icon-ios-menu:before{content:\"\\f230\"}.ivu-icon-ios-mic-off-outline:before{content:\"\\f231\"}.ivu-icon-ios-mic-off:before{content:\"\\f232\"}.ivu-icon-ios-mic-outline:before{content:\"\\f233\"}.ivu-icon-ios-mic:before{content:\"\\f234\"}.ivu-icon-ios-microphone-outline:before{content:\"\\f235\"}.ivu-icon-ios-microphone:before{content:\"\\f236\"}.ivu-icon-ios-moon-outline:before{content:\"\\f237\"}.ivu-icon-ios-moon:before{content:\"\\f238\"}.ivu-icon-ios-more-outline:before{content:\"\\f239\"}.ivu-icon-ios-more:before{content:\"\\f23a\"}.ivu-icon-ios-move:before{content:\"\\f23b\"}.ivu-icon-ios-musical-note-outline:before{content:\"\\f23c\"}.ivu-icon-ios-musical-note:before{content:\"\\f23d\"}.ivu-icon-ios-musical-notes-outline:before{content:\"\\f23e\"}.ivu-icon-ios-musical-notes:before{content:\"\\f23f\"}.ivu-icon-ios-navigate-outline:before{content:\"\\f240\"}.ivu-icon-ios-navigate:before{content:\"\\f241\"}.ivu-icon-ios-no-smoking-outline:before{content:\"\\f242\"}.ivu-icon-ios-no-smoking:before{content:\"\\f243\"}.ivu-icon-ios-notifications-off-outline:before{content:\"\\f244\"}.ivu-icon-ios-notifications-off:before{content:\"\\f245\"}.ivu-icon-ios-notifications-outline:before{content:\"\\f246\"}.ivu-icon-ios-notifications:before{content:\"\\f247\"}.ivu-icon-ios-nuclear-outline:before{content:\"\\f248\"}.ivu-icon-ios-nuclear:before{content:\"\\f249\"}.ivu-icon-ios-nutrition-outline:before{content:\"\\f24a\"}.ivu-icon-ios-nutrition:before{content:\"\\f24b\"}.ivu-icon-ios-open-outline:before{content:\"\\f24c\"}.ivu-icon-ios-open:before{content:\"\\f24d\"}.ivu-icon-ios-options-outline:before{content:\"\\f24e\"}.ivu-icon-ios-options:before{content:\"\\f24f\"}.ivu-icon-ios-outlet-outline:before{content:\"\\f250\"}.ivu-icon-ios-outlet:before{content:\"\\f251\"}.ivu-icon-ios-paper-outline:before{content:\"\\f252\"}.ivu-icon-ios-paper-plane-outline:before{content:\"\\f253\"}.ivu-icon-ios-paper-plane:before{content:\"\\f254\"}.ivu-icon-ios-paper:before{content:\"\\f255\"}.ivu-icon-ios-partly-sunny-outline:before{content:\"\\f256\"}.ivu-icon-ios-partly-sunny:before{content:\"\\f257\"}.ivu-icon-ios-pause-outline:before{content:\"\\f258\"}.ivu-icon-ios-pause:before{content:\"\\f259\"}.ivu-icon-ios-paw-outline:before{content:\"\\f25a\"}.ivu-icon-ios-paw:before{content:\"\\f25b\"}.ivu-icon-ios-people-outline:before{content:\"\\f25c\"}.ivu-icon-ios-people:before{content:\"\\f25d\"}.ivu-icon-ios-person-add-outline:before{content:\"\\f25e\"}.ivu-icon-ios-person-add:before{content:\"\\f25f\"}.ivu-icon-ios-person-outline:before{content:\"\\f260\"}.ivu-icon-ios-person:before{content:\"\\f261\"}.ivu-icon-ios-phone-landscape:before{content:\"\\f262\"}.ivu-icon-ios-phone-portrait:before{content:\"\\f263\"}.ivu-icon-ios-photos-outline:before{content:\"\\f264\"}.ivu-icon-ios-photos:before{content:\"\\f265\"}.ivu-icon-ios-pie-outline:before{content:\"\\f266\"}.ivu-icon-ios-pie:before{content:\"\\f267\"}.ivu-icon-ios-pin-outline:before{content:\"\\f268\"}.ivu-icon-ios-pin:before{content:\"\\f269\"}.ivu-icon-ios-pint-outline:before{content:\"\\f26a\"}.ivu-icon-ios-pint:before{content:\"\\f26b\"}.ivu-icon-ios-pizza-outline:before{content:\"\\f26c\"}.ivu-icon-ios-pizza:before{content:\"\\f26d\"}.ivu-icon-ios-plane-outline:before{content:\"\\f26e\"}.ivu-icon-ios-plane:before{content:\"\\f26f\"}.ivu-icon-ios-planet-outline:before{content:\"\\f270\"}.ivu-icon-ios-planet:before{content:\"\\f271\"}.ivu-icon-ios-play-outline:before{content:\"\\f272\"}.ivu-icon-ios-play:before{content:\"\\f273\"}.ivu-icon-ios-podium-outline:before{content:\"\\f274\"}.ivu-icon-ios-podium:before{content:\"\\f275\"}.ivu-icon-ios-power-outline:before{content:\"\\f276\"}.ivu-icon-ios-power:before{content:\"\\f277\"}.ivu-icon-ios-pricetag-outline:before{content:\"\\f278\"}.ivu-icon-ios-pricetag:before{content:\"\\f279\"}.ivu-icon-ios-pricetags-outline:before{content:\"\\f27a\"}.ivu-icon-ios-pricetags:before{content:\"\\f27b\"}.ivu-icon-ios-print-outline:before{content:\"\\f27c\"}.ivu-icon-ios-print:before{content:\"\\f27d\"}.ivu-icon-ios-pulse-outline:before{content:\"\\f27e\"}.ivu-icon-ios-pulse:before{content:\"\\f27f\"}.ivu-icon-ios-qr-scanner:before{content:\"\\f280\"}.ivu-icon-ios-quote-outline:before{content:\"\\f281\"}.ivu-icon-ios-quote:before{content:\"\\f282\"}.ivu-icon-ios-radio-button-off:before{content:\"\\f283\"}.ivu-icon-ios-radio-button-on:before{content:\"\\f284\"}.ivu-icon-ios-radio-outline:before{content:\"\\f285\"}.ivu-icon-ios-radio:before{content:\"\\f286\"}.ivu-icon-ios-rainy-outline:before{content:\"\\f287\"}.ivu-icon-ios-rainy:before{content:\"\\f288\"}.ivu-icon-ios-recording-outline:before{content:\"\\f289\"}.ivu-icon-ios-recording:before{content:\"\\f28a\"}.ivu-icon-ios-redo-outline:before{content:\"\\f28b\"}.ivu-icon-ios-redo:before{content:\"\\f28c\"}.ivu-icon-ios-refresh-circle-outline:before{content:\"\\f28d\"}.ivu-icon-ios-refresh-circle:before{content:\"\\f28e\"}.ivu-icon-ios-refresh:before{content:\"\\f28f\"}.ivu-icon-ios-remove-circle-outline:before{content:\"\\f290\"}.ivu-icon-ios-remove-circle:before{content:\"\\f291\"}.ivu-icon-ios-remove:before{content:\"\\f292\"}.ivu-icon-ios-reorder:before{content:\"\\f293\"}.ivu-icon-ios-repeat:before{content:\"\\f294\"}.ivu-icon-ios-resize:before{content:\"\\f295\"}.ivu-icon-ios-restaurant-outline:before{content:\"\\f296\"}.ivu-icon-ios-restaurant:before{content:\"\\f297\"}.ivu-icon-ios-return-left:before{content:\"\\f298\"}.ivu-icon-ios-return-right:before{content:\"\\f299\"}.ivu-icon-ios-reverse-camera-outline:before{content:\"\\f29a\"}.ivu-icon-ios-reverse-camera:before{content:\"\\f29b\"}.ivu-icon-ios-rewind-outline:before{content:\"\\f29c\"}.ivu-icon-ios-rewind:before{content:\"\\f29d\"}.ivu-icon-ios-ribbon-outline:before{content:\"\\f29e\"}.ivu-icon-ios-ribbon:before{content:\"\\f29f\"}.ivu-icon-ios-rose-outline:before{content:\"\\f2a0\"}.ivu-icon-ios-rose:before{content:\"\\f2a1\"}.ivu-icon-ios-sad-outline:before{content:\"\\f2a2\"}.ivu-icon-ios-sad:before{content:\"\\f2a3\"}.ivu-icon-ios-school-outline:before{content:\"\\f2a4\"}.ivu-icon-ios-school:before{content:\"\\f2a5\"}.ivu-icon-ios-search-outline:before{content:\"\\f2a6\"}.ivu-icon-ios-search:before{content:\"\\f2a7\"}.ivu-icon-ios-send-outline:before{content:\"\\f2a8\"}.ivu-icon-ios-send:before{content:\"\\f2a9\"}.ivu-icon-ios-settings-outline:before{content:\"\\f2aa\"}.ivu-icon-ios-settings:before{content:\"\\f2ab\"}.ivu-icon-ios-share-alt-outline:before{content:\"\\f2ac\"}.ivu-icon-ios-share-alt:before{content:\"\\f2ad\"}.ivu-icon-ios-share-outline:before{content:\"\\f2ae\"}.ivu-icon-ios-share:before{content:\"\\f2af\"}.ivu-icon-ios-shirt-outline:before{content:\"\\f2b0\"}.ivu-icon-ios-shirt:before{content:\"\\f2b1\"}.ivu-icon-ios-shuffle:before{content:\"\\f2b2\"}.ivu-icon-ios-skip-backward-outline:before{content:\"\\f2b3\"}.ivu-icon-ios-skip-backward:before{content:\"\\f2b4\"}.ivu-icon-ios-skip-forward-outline:before{content:\"\\f2b5\"}.ivu-icon-ios-skip-forward:before{content:\"\\f2b6\"}.ivu-icon-ios-snow-outline:before{content:\"\\f2b7\"}.ivu-icon-ios-snow:before{content:\"\\f2b8\"}.ivu-icon-ios-speedometer-outline:before{content:\"\\f2b9\"}.ivu-icon-ios-speedometer:before{content:\"\\f2ba\"}.ivu-icon-ios-square-outline:before{content:\"\\f2bb\"}.ivu-icon-ios-square:before{content:\"\\f2bc\"}.ivu-icon-ios-star-half:before{content:\"\\f2bd\"}.ivu-icon-ios-star-outline:before{content:\"\\f2be\"}.ivu-icon-ios-star:before{content:\"\\f2bf\"}.ivu-icon-ios-stats-outline:before{content:\"\\f2c0\"}.ivu-icon-ios-stats:before{content:\"\\f2c1\"}.ivu-icon-ios-stopwatch-outline:before{content:\"\\f2c2\"}.ivu-icon-ios-stopwatch:before{content:\"\\f2c3\"}.ivu-icon-ios-subway-outline:before{content:\"\\f2c4\"}.ivu-icon-ios-subway:before{content:\"\\f2c5\"}.ivu-icon-ios-sunny-outline:before{content:\"\\f2c6\"}.ivu-icon-ios-sunny:before{content:\"\\f2c7\"}.ivu-icon-ios-swap:before{content:\"\\f2c8\"}.ivu-icon-ios-switch-outline:before{content:\"\\f2c9\"}.ivu-icon-ios-switch:before{content:\"\\f2ca\"}.ivu-icon-ios-sync:before{content:\"\\f2cb\"}.ivu-icon-ios-tablet-landscape:before{content:\"\\f2cc\"}.ivu-icon-ios-tablet-portrait:before{content:\"\\f2cd\"}.ivu-icon-ios-tennisball-outline:before{content:\"\\f2ce\"}.ivu-icon-ios-tennisball:before{content:\"\\f2cf\"}.ivu-icon-ios-text-outline:before{content:\"\\f2d0\"}.ivu-icon-ios-text:before{content:\"\\f2d1\"}.ivu-icon-ios-thermometer-outline:before{content:\"\\f2d2\"}.ivu-icon-ios-thermometer:before{content:\"\\f2d3\"}.ivu-icon-ios-thumbs-down-outline:before{content:\"\\f2d4\"}.ivu-icon-ios-thumbs-down:before{content:\"\\f2d5\"}.ivu-icon-ios-thumbs-up-outline:before{content:\"\\f2d6\"}.ivu-icon-ios-thumbs-up:before{content:\"\\f2d7\"}.ivu-icon-ios-thunderstorm-outline:before{content:\"\\f2d8\"}.ivu-icon-ios-thunderstorm:before{content:\"\\f2d9\"}.ivu-icon-ios-time-outline:before{content:\"\\f2da\"}.ivu-icon-ios-time:before{content:\"\\f2db\"}.ivu-icon-ios-timer-outline:before{content:\"\\f2dc\"}.ivu-icon-ios-timer:before{content:\"\\f2dd\"}.ivu-icon-ios-train-outline:before{content:\"\\f2de\"}.ivu-icon-ios-train:before{content:\"\\f2df\"}.ivu-icon-ios-transgender:before{content:\"\\f2e0\"}.ivu-icon-ios-trash-outline:before{content:\"\\f2e1\"}.ivu-icon-ios-trash:before{content:\"\\f2e2\"}.ivu-icon-ios-trending-down:before{content:\"\\f2e3\"}.ivu-icon-ios-trending-up:before{content:\"\\f2e4\"}.ivu-icon-ios-trophy-outline:before{content:\"\\f2e5\"}.ivu-icon-ios-trophy:before{content:\"\\f2e6\"}.ivu-icon-ios-umbrella-outline:before{content:\"\\f2e7\"}.ivu-icon-ios-umbrella:before{content:\"\\f2e8\"}.ivu-icon-ios-undo-outline:before{content:\"\\f2e9\"}.ivu-icon-ios-undo:before{content:\"\\f2ea\"}.ivu-icon-ios-unlock-outline:before{content:\"\\f2eb\"}.ivu-icon-ios-unlock:before{content:\"\\f2ec\"}.ivu-icon-ios-videocam-outline:before{content:\"\\f2ed\"}.ivu-icon-ios-videocam:before{content:\"\\f2ee\"}.ivu-icon-ios-volume-down:before{content:\"\\f2ef\"}.ivu-icon-ios-volume-mute:before{content:\"\\f2f0\"}.ivu-icon-ios-volume-off:before{content:\"\\f2f1\"}.ivu-icon-ios-volume-up:before{content:\"\\f2f2\"}.ivu-icon-ios-walk:before{content:\"\\f2f3\"}.ivu-icon-ios-warning-outline:before{content:\"\\f2f4\"}.ivu-icon-ios-warning:before{content:\"\\f2f5\"}.ivu-icon-ios-watch:before{content:\"\\f2f6\"}.ivu-icon-ios-water-outline:before{content:\"\\f2f7\"}.ivu-icon-ios-water:before{content:\"\\f2f8\"}.ivu-icon-ios-wifi-outline:before{content:\"\\f2f9\"}.ivu-icon-ios-wifi:before{content:\"\\f2fa\"}.ivu-icon-ios-wine-outline:before{content:\"\\f2fb\"}.ivu-icon-ios-wine:before{content:\"\\f2fc\"}.ivu-icon-ios-woman-outline:before{content:\"\\f2fd\"}.ivu-icon-ios-woman:before{content:\"\\f2fe\"}.ivu-icon-logo-android:before{content:\"\\f2ff\"}.ivu-icon-logo-angular:before{content:\"\\f300\"}.ivu-icon-logo-apple:before{content:\"\\f301\"}.ivu-icon-logo-bitcoin:before{content:\"\\f302\"}.ivu-icon-logo-buffer:before{content:\"\\f303\"}.ivu-icon-logo-chrome:before{content:\"\\f304\"}.ivu-icon-logo-codepen:before{content:\"\\f305\"}.ivu-icon-logo-css3:before{content:\"\\f306\"}.ivu-icon-logo-designernews:before{content:\"\\f307\"}.ivu-icon-logo-dribbble:before{content:\"\\f308\"}.ivu-icon-logo-dropbox:before{content:\"\\f309\"}.ivu-icon-logo-euro:before{content:\"\\f30a\"}.ivu-icon-logo-facebook:before{content:\"\\f30b\"}.ivu-icon-logo-foursquare:before{content:\"\\f30c\"}.ivu-icon-logo-freebsd-devil:before{content:\"\\f30d\"}.ivu-icon-logo-github:before{content:\"\\f30e\"}.ivu-icon-logo-google:before{content:\"\\f30f\"}.ivu-icon-logo-googleplus:before{content:\"\\f310\"}.ivu-icon-logo-hackernews:before{content:\"\\f311\"}.ivu-icon-logo-html5:before{content:\"\\f312\"}.ivu-icon-logo-instagram:before{content:\"\\f313\"}.ivu-icon-logo-javascript:before{content:\"\\f314\"}.ivu-icon-logo-linkedin:before{content:\"\\f315\"}.ivu-icon-logo-markdown:before{content:\"\\f316\"}.ivu-icon-logo-nodejs:before{content:\"\\f317\"}.ivu-icon-logo-octocat:before{content:\"\\f318\"}.ivu-icon-logo-pinterest:before{content:\"\\f319\"}.ivu-icon-logo-playstation:before{content:\"\\f31a\"}.ivu-icon-logo-python:before{content:\"\\f31b\"}.ivu-icon-logo-reddit:before{content:\"\\f31c\"}.ivu-icon-logo-rss:before{content:\"\\f31d\"}.ivu-icon-logo-sass:before{content:\"\\f31e\"}.ivu-icon-logo-skype:before{content:\"\\f31f\"}.ivu-icon-logo-snapchat:before{content:\"\\f320\"}.ivu-icon-logo-steam:before{content:\"\\f321\"}.ivu-icon-logo-tumblr:before{content:\"\\f322\"}.ivu-icon-logo-tux:before{content:\"\\f323\"}.ivu-icon-logo-twitch:before{content:\"\\f324\"}.ivu-icon-logo-twitter:before{content:\"\\f325\"}.ivu-icon-logo-usd:before{content:\"\\f326\"}.ivu-icon-logo-vimeo:before{content:\"\\f327\"}.ivu-icon-logo-whatsapp:before{content:\"\\f328\"}.ivu-icon-logo-windows:before{content:\"\\f329\"}.ivu-icon-logo-wordpress:before{content:\"\\f32a\"}.ivu-icon-logo-xbox:before{content:\"\\f32b\"}.ivu-icon-logo-yahoo:before{content:\"\\f32c\"}.ivu-icon-logo-yen:before{content:\"\\f32d\"}.ivu-icon-logo-youtube:before{content:\"\\f32e\"}.ivu-icon-md-add-circle:before{content:\"\\f32f\"}.ivu-icon-md-add:before{content:\"\\f330\"}.ivu-icon-md-alarm:before{content:\"\\f331\"}.ivu-icon-md-albums:before{content:\"\\f332\"}.ivu-icon-md-alert:before{content:\"\\f333\"}.ivu-icon-md-american-football:before{content:\"\\f334\"}.ivu-icon-md-analytics:before{content:\"\\f335\"}.ivu-icon-md-aperture:before{content:\"\\f336\"}.ivu-icon-md-apps:before{content:\"\\f337\"}.ivu-icon-md-appstore:before{content:\"\\f338\"}.ivu-icon-md-archive:before{content:\"\\f339\"}.ivu-icon-md-arrow-back:before{content:\"\\f33a\"}.ivu-icon-md-arrow-down:before{content:\"\\f33b\"}.ivu-icon-md-arrow-dropdown-circle:before{content:\"\\f33c\"}.ivu-icon-md-arrow-dropdown:before{content:\"\\f33d\"}.ivu-icon-md-arrow-dropleft-circle:before{content:\"\\f33e\"}.ivu-icon-md-arrow-dropleft:before{content:\"\\f33f\"}.ivu-icon-md-arrow-dropright-circle:before{content:\"\\f340\"}.ivu-icon-md-arrow-dropright:before{content:\"\\f341\"}.ivu-icon-md-arrow-dropup-circle:before{content:\"\\f342\"}.ivu-icon-md-arrow-dropup:before{content:\"\\f343\"}.ivu-icon-md-arrow-forward:before{content:\"\\f344\"}.ivu-icon-md-arrow-round-back:before{content:\"\\f345\"}.ivu-icon-md-arrow-round-down:before{content:\"\\f346\"}.ivu-icon-md-arrow-round-forward:before{content:\"\\f347\"}.ivu-icon-md-arrow-round-up:before{content:\"\\f348\"}.ivu-icon-md-arrow-up:before{content:\"\\f349\"}.ivu-icon-md-at:before{content:\"\\f34a\"}.ivu-icon-md-attach:before{content:\"\\f34b\"}.ivu-icon-md-backspace:before{content:\"\\f34c\"}.ivu-icon-md-barcode:before{content:\"\\f34d\"}.ivu-icon-md-baseball:before{content:\"\\f34e\"}.ivu-icon-md-basket:before{content:\"\\f34f\"}.ivu-icon-md-basketball:before{content:\"\\f350\"}.ivu-icon-md-battery-charging:before{content:\"\\f351\"}.ivu-icon-md-battery-dead:before{content:\"\\f352\"}.ivu-icon-md-battery-full:before{content:\"\\f353\"}.ivu-icon-md-beaker:before{content:\"\\f354\"}.ivu-icon-md-beer:before{content:\"\\f355\"}.ivu-icon-md-bicycle:before{content:\"\\f356\"}.ivu-icon-md-bluetooth:before{content:\"\\f357\"}.ivu-icon-md-boat:before{content:\"\\f358\"}.ivu-icon-md-body:before{content:\"\\f359\"}.ivu-icon-md-bonfire:before{content:\"\\f35a\"}.ivu-icon-md-book:before{content:\"\\f35b\"}.ivu-icon-md-bookmark:before{content:\"\\f35c\"}.ivu-icon-md-bookmarks:before{content:\"\\f35d\"}.ivu-icon-md-bowtie:before{content:\"\\f35e\"}.ivu-icon-md-briefcase:before{content:\"\\f35f\"}.ivu-icon-md-browsers:before{content:\"\\f360\"}.ivu-icon-md-brush:before{content:\"\\f361\"}.ivu-icon-md-bug:before{content:\"\\f362\"}.ivu-icon-md-build:before{content:\"\\f363\"}.ivu-icon-md-bulb:before{content:\"\\f364\"}.ivu-icon-md-bus:before{content:\"\\f365\"}.ivu-icon-md-cafe:before{content:\"\\f366\"}.ivu-icon-md-calculator:before{content:\"\\f367\"}.ivu-icon-md-calendar:before{content:\"\\f368\"}.ivu-icon-md-call:before{content:\"\\f369\"}.ivu-icon-md-camera:before{content:\"\\f36a\"}.ivu-icon-md-car:before{content:\"\\f36b\"}.ivu-icon-md-card:before{content:\"\\f36c\"}.ivu-icon-md-cart:before{content:\"\\f36d\"}.ivu-icon-md-cash:before{content:\"\\f36e\"}.ivu-icon-md-chatboxes:before{content:\"\\f36f\"}.ivu-icon-md-chatbubbles:before{content:\"\\f370\"}.ivu-icon-md-checkbox-outline:before{content:\"\\f371\"}.ivu-icon-md-checkbox:before{content:\"\\f372\"}.ivu-icon-md-checkmark-circle-outline:before{content:\"\\f373\"}.ivu-icon-md-checkmark-circle:before{content:\"\\f374\"}.ivu-icon-md-checkmark:before{content:\"\\f375\"}.ivu-icon-md-clipboard:before{content:\"\\f376\"}.ivu-icon-md-clock:before{content:\"\\f377\"}.ivu-icon-md-close-circle:before{content:\"\\f378\"}.ivu-icon-md-close:before{content:\"\\f379\"}.ivu-icon-md-closed-captioning:before{content:\"\\f37a\"}.ivu-icon-md-cloud-circle:before{content:\"\\f37b\"}.ivu-icon-md-cloud-done:before{content:\"\\f37c\"}.ivu-icon-md-cloud-download:before{content:\"\\f37d\"}.ivu-icon-md-cloud-outline:before{content:\"\\f37e\"}.ivu-icon-md-cloud-upload:before{content:\"\\f37f\"}.ivu-icon-md-cloud:before{content:\"\\f380\"}.ivu-icon-md-cloudy-night:before{content:\"\\f381\"}.ivu-icon-md-cloudy:before{content:\"\\f382\"}.ivu-icon-md-code-download:before{content:\"\\f383\"}.ivu-icon-md-code-working:before{content:\"\\f384\"}.ivu-icon-md-code:before{content:\"\\f385\"}.ivu-icon-md-cog:before{content:\"\\f386\"}.ivu-icon-md-color-fill:before{content:\"\\f387\"}.ivu-icon-md-color-filter:before{content:\"\\f388\"}.ivu-icon-md-color-palette:before{content:\"\\f389\"}.ivu-icon-md-color-wand:before{content:\"\\f38a\"}.ivu-icon-md-compass:before{content:\"\\f38b\"}.ivu-icon-md-construct:before{content:\"\\f38c\"}.ivu-icon-md-contact:before{content:\"\\f38d\"}.ivu-icon-md-contacts:before{content:\"\\f38e\"}.ivu-icon-md-contract:before{content:\"\\f38f\"}.ivu-icon-md-contrast:before{content:\"\\f390\"}.ivu-icon-md-copy:before{content:\"\\f391\"}.ivu-icon-md-create:before{content:\"\\f392\"}.ivu-icon-md-crop:before{content:\"\\f393\"}.ivu-icon-md-cube:before{content:\"\\f394\"}.ivu-icon-md-cut:before{content:\"\\f395\"}.ivu-icon-md-desktop:before{content:\"\\f396\"}.ivu-icon-md-disc:before{content:\"\\f397\"}.ivu-icon-md-document:before{content:\"\\f398\"}.ivu-icon-md-done-all:before{content:\"\\f399\"}.ivu-icon-md-download:before{content:\"\\f39a\"}.ivu-icon-md-easel:before{content:\"\\f39b\"}.ivu-icon-md-egg:before{content:\"\\f39c\"}.ivu-icon-md-exit:before{content:\"\\f39d\"}.ivu-icon-md-expand:before{content:\"\\f39e\"}.ivu-icon-md-eye-off:before{content:\"\\f39f\"}.ivu-icon-md-eye:before{content:\"\\f3a0\"}.ivu-icon-md-fastforward:before{content:\"\\f3a1\"}.ivu-icon-md-female:before{content:\"\\f3a2\"}.ivu-icon-md-filing:before{content:\"\\f3a3\"}.ivu-icon-md-film:before{content:\"\\f3a4\"}.ivu-icon-md-finger-print:before{content:\"\\f3a5\"}.ivu-icon-md-flag:before{content:\"\\f3a6\"}.ivu-icon-md-flame:before{content:\"\\f3a7\"}.ivu-icon-md-flash:before{content:\"\\f3a8\"}.ivu-icon-md-flask:before{content:\"\\f3a9\"}.ivu-icon-md-flower:before{content:\"\\f3aa\"}.ivu-icon-md-folder-open:before{content:\"\\f3ab\"}.ivu-icon-md-folder:before{content:\"\\f3ac\"}.ivu-icon-md-football:before{content:\"\\f3ad\"}.ivu-icon-md-funnel:before{content:\"\\f3ae\"}.ivu-icon-md-game-controller-a:before{content:\"\\f3af\"}.ivu-icon-md-game-controller-b:before{content:\"\\f3b0\"}.ivu-icon-md-git-branch:before{content:\"\\f3b1\"}.ivu-icon-md-git-commit:before{content:\"\\f3b2\"}.ivu-icon-md-git-compare:before{content:\"\\f3b3\"}.ivu-icon-md-git-merge:before{content:\"\\f3b4\"}.ivu-icon-md-git-network:before{content:\"\\f3b5\"}.ivu-icon-md-git-pull-request:before{content:\"\\f3b6\"}.ivu-icon-md-glasses:before{content:\"\\f3b7\"}.ivu-icon-md-globe:before{content:\"\\f3b8\"}.ivu-icon-md-grid:before{content:\"\\f3b9\"}.ivu-icon-md-hammer:before{content:\"\\f3ba\"}.ivu-icon-md-hand:before{content:\"\\f3bb\"}.ivu-icon-md-happy:before{content:\"\\f3bc\"}.ivu-icon-md-headset:before{content:\"\\f3bd\"}.ivu-icon-md-heart-outline:before{content:\"\\f3be\"}.ivu-icon-md-heart:before{content:\"\\f3bf\"}.ivu-icon-md-help-buoy:before{content:\"\\f3c0\"}.ivu-icon-md-help-circle:before{content:\"\\f3c1\"}.ivu-icon-md-help:before{content:\"\\f3c2\"}.ivu-icon-md-home:before{content:\"\\f3c3\"}.ivu-icon-md-ice-cream:before{content:\"\\f3c4\"}.ivu-icon-md-image:before{content:\"\\f3c5\"}.ivu-icon-md-images:before{content:\"\\f3c6\"}.ivu-icon-md-infinite:before{content:\"\\f3c7\"}.ivu-icon-md-information-circle:before{content:\"\\f3c8\"}.ivu-icon-md-information:before{content:\"\\f3c9\"}.ivu-icon-md-ionic:before{content:\"\\f3ca\"}.ivu-icon-md-ionitron:before{content:\"\\f3cb\"}.ivu-icon-md-jet:before{content:\"\\f3cc\"}.ivu-icon-md-key:before{content:\"\\f3cd\"}.ivu-icon-md-keypad:before{content:\"\\f3ce\"}.ivu-icon-md-laptop:before{content:\"\\f3cf\"}.ivu-icon-md-leaf:before{content:\"\\f3d0\"}.ivu-icon-md-link:before{content:\"\\f3d1\"}.ivu-icon-md-list-box:before{content:\"\\f3d2\"}.ivu-icon-md-list:before{content:\"\\f3d3\"}.ivu-icon-md-locate:before{content:\"\\f3d4\"}.ivu-icon-md-lock:before{content:\"\\f3d5\"}.ivu-icon-md-log-in:before{content:\"\\f3d6\"}.ivu-icon-md-log-out:before{content:\"\\f3d7\"}.ivu-icon-md-magnet:before{content:\"\\f3d8\"}.ivu-icon-md-mail-open:before{content:\"\\f3d9\"}.ivu-icon-md-mail:before{content:\"\\f3da\"}.ivu-icon-md-male:before{content:\"\\f3db\"}.ivu-icon-md-man:before{content:\"\\f3dc\"}.ivu-icon-md-map:before{content:\"\\f3dd\"}.ivu-icon-md-medal:before{content:\"\\f3de\"}.ivu-icon-md-medical:before{content:\"\\f3df\"}.ivu-icon-md-medkit:before{content:\"\\f3e0\"}.ivu-icon-md-megaphone:before{content:\"\\f3e1\"}.ivu-icon-md-menu:before{content:\"\\f3e2\"}.ivu-icon-md-mic-off:before{content:\"\\f3e3\"}.ivu-icon-md-mic:before{content:\"\\f3e4\"}.ivu-icon-md-microphone:before{content:\"\\f3e5\"}.ivu-icon-md-moon:before{content:\"\\f3e6\"}.ivu-icon-md-more:before{content:\"\\f3e7\"}.ivu-icon-md-move:before{content:\"\\f3e8\"}.ivu-icon-md-musical-note:before{content:\"\\f3e9\"}.ivu-icon-md-musical-notes:before{content:\"\\f3ea\"}.ivu-icon-md-navigate:before{content:\"\\f3eb\"}.ivu-icon-md-no-smoking:before{content:\"\\f3ec\"}.ivu-icon-md-notifications-off:before{content:\"\\f3ed\"}.ivu-icon-md-notifications-outline:before{content:\"\\f3ee\"}.ivu-icon-md-notifications:before{content:\"\\f3ef\"}.ivu-icon-md-nuclear:before{content:\"\\f3f0\"}.ivu-icon-md-nutrition:before{content:\"\\f3f1\"}.ivu-icon-md-open:before{content:\"\\f3f2\"}.ivu-icon-md-options:before{content:\"\\f3f3\"}.ivu-icon-md-outlet:before{content:\"\\f3f4\"}.ivu-icon-md-paper-plane:before{content:\"\\f3f5\"}.ivu-icon-md-paper:before{content:\"\\f3f6\"}.ivu-icon-md-partly-sunny:before{content:\"\\f3f7\"}.ivu-icon-md-pause:before{content:\"\\f3f8\"}.ivu-icon-md-paw:before{content:\"\\f3f9\"}.ivu-icon-md-people:before{content:\"\\f3fa\"}.ivu-icon-md-person-add:before{content:\"\\f3fb\"}.ivu-icon-md-person:before{content:\"\\f3fc\"}.ivu-icon-md-phone-landscape:before{content:\"\\f3fd\"}.ivu-icon-md-phone-portrait:before{content:\"\\f3fe\"}.ivu-icon-md-photos:before{content:\"\\f3ff\"}.ivu-icon-md-pie:before{content:\"\\f400\"}.ivu-icon-md-pin:before{content:\"\\f401\"}.ivu-icon-md-pint:before{content:\"\\f402\"}.ivu-icon-md-pizza:before{content:\"\\f403\"}.ivu-icon-md-plane:before{content:\"\\f404\"}.ivu-icon-md-planet:before{content:\"\\f405\"}.ivu-icon-md-play:before{content:\"\\f406\"}.ivu-icon-md-podium:before{content:\"\\f407\"}.ivu-icon-md-power:before{content:\"\\f408\"}.ivu-icon-md-pricetag:before{content:\"\\f409\"}.ivu-icon-md-pricetags:before{content:\"\\f40a\"}.ivu-icon-md-print:before{content:\"\\f40b\"}.ivu-icon-md-pulse:before{content:\"\\f40c\"}.ivu-icon-md-qr-scanner:before{content:\"\\f40d\"}.ivu-icon-md-quote:before{content:\"\\f40e\"}.ivu-icon-md-radio-button-off:before{content:\"\\f40f\"}.ivu-icon-md-radio-button-on:before{content:\"\\f410\"}.ivu-icon-md-radio:before{content:\"\\f411\"}.ivu-icon-md-rainy:before{content:\"\\f412\"}.ivu-icon-md-recording:before{content:\"\\f413\"}.ivu-icon-md-redo:before{content:\"\\f414\"}.ivu-icon-md-refresh-circle:before{content:\"\\f415\"}.ivu-icon-md-refresh:before{content:\"\\f416\"}.ivu-icon-md-remove-circle:before{content:\"\\f417\"}.ivu-icon-md-remove:before{content:\"\\f418\"}.ivu-icon-md-reorder:before{content:\"\\f419\"}.ivu-icon-md-repeat:before{content:\"\\f41a\"}.ivu-icon-md-resize:before{content:\"\\f41b\"}.ivu-icon-md-restaurant:before{content:\"\\f41c\"}.ivu-icon-md-return-left:before{content:\"\\f41d\"}.ivu-icon-md-return-right:before{content:\"\\f41e\"}.ivu-icon-md-reverse-camera:before{content:\"\\f41f\"}.ivu-icon-md-rewind:before{content:\"\\f420\"}.ivu-icon-md-ribbon:before{content:\"\\f421\"}.ivu-icon-md-rose:before{content:\"\\f422\"}.ivu-icon-md-sad:before{content:\"\\f423\"}.ivu-icon-md-school:before{content:\"\\f424\"}.ivu-icon-md-search:before{content:\"\\f425\"}.ivu-icon-md-send:before{content:\"\\f426\"}.ivu-icon-md-settings:before{content:\"\\f427\"}.ivu-icon-md-share-alt:before{content:\"\\f428\"}.ivu-icon-md-share:before{content:\"\\f429\"}.ivu-icon-md-shirt:before{content:\"\\f42a\"}.ivu-icon-md-shuffle:before{content:\"\\f42b\"}.ivu-icon-md-skip-backward:before{content:\"\\f42c\"}.ivu-icon-md-skip-forward:before{content:\"\\f42d\"}.ivu-icon-md-snow:before{content:\"\\f42e\"}.ivu-icon-md-speedometer:before{content:\"\\f42f\"}.ivu-icon-md-square-outline:before{content:\"\\f430\"}.ivu-icon-md-square:before{content:\"\\f431\"}.ivu-icon-md-star-half:before{content:\"\\f432\"}.ivu-icon-md-star-outline:before{content:\"\\f433\"}.ivu-icon-md-star:before{content:\"\\f434\"}.ivu-icon-md-stats:before{content:\"\\f435\"}.ivu-icon-md-stopwatch:before{content:\"\\f436\"}.ivu-icon-md-subway:before{content:\"\\f437\"}.ivu-icon-md-sunny:before{content:\"\\f438\"}.ivu-icon-md-swap:before{content:\"\\f439\"}.ivu-icon-md-switch:before{content:\"\\f43a\"}.ivu-icon-md-sync:before{content:\"\\f43b\"}.ivu-icon-md-tablet-landscape:before{content:\"\\f43c\"}.ivu-icon-md-tablet-portrait:before{content:\"\\f43d\"}.ivu-icon-md-tennisball:before{content:\"\\f43e\"}.ivu-icon-md-text:before{content:\"\\f43f\"}.ivu-icon-md-thermometer:before{content:\"\\f440\"}.ivu-icon-md-thumbs-down:before{content:\"\\f441\"}.ivu-icon-md-thumbs-up:before{content:\"\\f442\"}.ivu-icon-md-thunderstorm:before{content:\"\\f443\"}.ivu-icon-md-time:before{content:\"\\f444\"}.ivu-icon-md-timer:before{content:\"\\f445\"}.ivu-icon-md-train:before{content:\"\\f446\"}.ivu-icon-md-transgender:before{content:\"\\f447\"}.ivu-icon-md-trash:before{content:\"\\f448\"}.ivu-icon-md-trending-down:before{content:\"\\f449\"}.ivu-icon-md-trending-up:before{content:\"\\f44a\"}.ivu-icon-md-trophy:before{content:\"\\f44b\"}.ivu-icon-md-umbrella:before{content:\"\\f44c\"}.ivu-icon-md-undo:before{content:\"\\f44d\"}.ivu-icon-md-unlock:before{content:\"\\f44e\"}.ivu-icon-md-videocam:before{content:\"\\f44f\"}.ivu-icon-md-volume-down:before{content:\"\\f450\"}.ivu-icon-md-volume-mute:before{content:\"\\f451\"}.ivu-icon-md-volume-off:before{content:\"\\f452\"}.ivu-icon-md-volume-up:before{content:\"\\f453\"}.ivu-icon-md-walk:before{content:\"\\f454\"}.ivu-icon-md-warning:before{content:\"\\f455\"}.ivu-icon-md-watch:before{content:\"\\f456\"}.ivu-icon-md-water:before{content:\"\\f457\"}.ivu-icon-md-wifi:before{content:\"\\f458\"}.ivu-icon-md-wine:before{content:\"\\f459\"}.ivu-icon-md-woman:before{content:\"\\f45a\"}.ivu-icon-ios-loading:before{content:\"\\f45b\"}.ivu-row{position:relative;margin-left:0;margin-right:0;height:auto;zoom:1;display:block}.ivu-row:after,.ivu-row:before{content:\"\";display:table}.ivu-row:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-row-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.ivu-row-flex:after,.ivu-row-flex:before{display:-webkit-box;display:-ms-flexbox;display:flex}.ivu-row-flex-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ivu-row-flex-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ivu-row-flex-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ivu-row-flex-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.ivu-row-flex-space-around{-ms-flex-pack:distribute;justify-content:space-around}.ivu-row-flex-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.ivu-row-flex-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ivu-row-flex-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.ivu-col{position:relative;display:block}.ivu-col-span-1,.ivu-col-span-10,.ivu-col-span-11,.ivu-col-span-12,.ivu-col-span-13,.ivu-col-span-14,.ivu-col-span-15,.ivu-col-span-16,.ivu-col-span-17,.ivu-col-span-18,.ivu-col-span-19,.ivu-col-span-2,.ivu-col-span-20,.ivu-col-span-21,.ivu-col-span-22,.ivu-col-span-23,.ivu-col-span-24,.ivu-col-span-3,.ivu-col-span-4,.ivu-col-span-5,.ivu-col-span-6,.ivu-col-span-7,.ivu-col-span-8,.ivu-col-span-9{float:left;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-col-span-24{display:block;width:100%}.ivu-col-push-24{left:100%}.ivu-col-pull-24{right:100%}.ivu-col-offset-24{margin-left:100%}.ivu-col-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-23{display:block;width:95.83333333%}.ivu-col-push-23{left:95.83333333%}.ivu-col-pull-23{right:95.83333333%}.ivu-col-offset-23{margin-left:95.83333333%}.ivu-col-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-22{display:block;width:91.66666667%}.ivu-col-push-22{left:91.66666667%}.ivu-col-pull-22{right:91.66666667%}.ivu-col-offset-22{margin-left:91.66666667%}.ivu-col-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-21{display:block;width:87.5%}.ivu-col-push-21{left:87.5%}.ivu-col-pull-21{right:87.5%}.ivu-col-offset-21{margin-left:87.5%}.ivu-col-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-20{display:block;width:83.33333333%}.ivu-col-push-20{left:83.33333333%}.ivu-col-pull-20{right:83.33333333%}.ivu-col-offset-20{margin-left:83.33333333%}.ivu-col-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-19{display:block;width:79.16666667%}.ivu-col-push-19{left:79.16666667%}.ivu-col-pull-19{right:79.16666667%}.ivu-col-offset-19{margin-left:79.16666667%}.ivu-col-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-18{display:block;width:75%}.ivu-col-push-18{left:75%}.ivu-col-pull-18{right:75%}.ivu-col-offset-18{margin-left:75%}.ivu-col-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-17{display:block;width:70.83333333%}.ivu-col-push-17{left:70.83333333%}.ivu-col-pull-17{right:70.83333333%}.ivu-col-offset-17{margin-left:70.83333333%}.ivu-col-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-16{display:block;width:66.66666667%}.ivu-col-push-16{left:66.66666667%}.ivu-col-pull-16{right:66.66666667%}.ivu-col-offset-16{margin-left:66.66666667%}.ivu-col-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-15{display:block;width:62.5%}.ivu-col-push-15{left:62.5%}.ivu-col-pull-15{right:62.5%}.ivu-col-offset-15{margin-left:62.5%}.ivu-col-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-14{display:block;width:58.33333333%}.ivu-col-push-14{left:58.33333333%}.ivu-col-pull-14{right:58.33333333%}.ivu-col-offset-14{margin-left:58.33333333%}.ivu-col-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-13{display:block;width:54.16666667%}.ivu-col-push-13{left:54.16666667%}.ivu-col-pull-13{right:54.16666667%}.ivu-col-offset-13{margin-left:54.16666667%}.ivu-col-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-12{display:block;width:50%}.ivu-col-push-12{left:50%}.ivu-col-pull-12{right:50%}.ivu-col-offset-12{margin-left:50%}.ivu-col-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-11{display:block;width:45.83333333%}.ivu-col-push-11{left:45.83333333%}.ivu-col-pull-11{right:45.83333333%}.ivu-col-offset-11{margin-left:45.83333333%}.ivu-col-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-10{display:block;width:41.66666667%}.ivu-col-push-10{left:41.66666667%}.ivu-col-pull-10{right:41.66666667%}.ivu-col-offset-10{margin-left:41.66666667%}.ivu-col-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-9{display:block;width:37.5%}.ivu-col-push-9{left:37.5%}.ivu-col-pull-9{right:37.5%}.ivu-col-offset-9{margin-left:37.5%}.ivu-col-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-8{display:block;width:33.33333333%}.ivu-col-push-8{left:33.33333333%}.ivu-col-pull-8{right:33.33333333%}.ivu-col-offset-8{margin-left:33.33333333%}.ivu-col-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-7{display:block;width:29.16666667%}.ivu-col-push-7{left:29.16666667%}.ivu-col-pull-7{right:29.16666667%}.ivu-col-offset-7{margin-left:29.16666667%}.ivu-col-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-6{display:block;width:25%}.ivu-col-push-6{left:25%}.ivu-col-pull-6{right:25%}.ivu-col-offset-6{margin-left:25%}.ivu-col-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-5{display:block;width:20.83333333%}.ivu-col-push-5{left:20.83333333%}.ivu-col-pull-5{right:20.83333333%}.ivu-col-offset-5{margin-left:20.83333333%}.ivu-col-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-4{display:block;width:16.66666667%}.ivu-col-push-4{left:16.66666667%}.ivu-col-pull-4{right:16.66666667%}.ivu-col-offset-4{margin-left:16.66666667%}.ivu-col-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-3{display:block;width:12.5%}.ivu-col-push-3{left:12.5%}.ivu-col-pull-3{right:12.5%}.ivu-col-offset-3{margin-left:12.5%}.ivu-col-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-2{display:block;width:8.33333333%}.ivu-col-push-2{left:8.33333333%}.ivu-col-pull-2{right:8.33333333%}.ivu-col-offset-2{margin-left:8.33333333%}.ivu-col-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-1{display:block;width:4.16666667%}.ivu-col-push-1{left:4.16666667%}.ivu-col-pull-1{right:4.16666667%}.ivu-col-offset-1{margin-left:4.16666667%}.ivu-col-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-0{display:none}.ivu-col-push-0{left:auto}.ivu-col-pull-0{right:auto}.ivu-col-span-xs-1,.ivu-col-span-xs-10,.ivu-col-span-xs-11,.ivu-col-span-xs-12,.ivu-col-span-xs-13,.ivu-col-span-xs-14,.ivu-col-span-xs-15,.ivu-col-span-xs-16,.ivu-col-span-xs-17,.ivu-col-span-xs-18,.ivu-col-span-xs-19,.ivu-col-span-xs-2,.ivu-col-span-xs-20,.ivu-col-span-xs-21,.ivu-col-span-xs-22,.ivu-col-span-xs-23,.ivu-col-span-xs-24,.ivu-col-span-xs-3,.ivu-col-span-xs-4,.ivu-col-span-xs-5,.ivu-col-span-xs-6,.ivu-col-span-xs-7,.ivu-col-span-xs-8,.ivu-col-span-xs-9{float:left;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-col-span-xs-24{display:block;width:100%}.ivu-col-xs-push-24{left:100%}.ivu-col-xs-pull-24{right:100%}.ivu-col-xs-offset-24{margin-left:100%}.ivu-col-xs-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-xs-23{display:block;width:95.83333333%}.ivu-col-xs-push-23{left:95.83333333%}.ivu-col-xs-pull-23{right:95.83333333%}.ivu-col-xs-offset-23{margin-left:95.83333333%}.ivu-col-xs-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-xs-22{display:block;width:91.66666667%}.ivu-col-xs-push-22{left:91.66666667%}.ivu-col-xs-pull-22{right:91.66666667%}.ivu-col-xs-offset-22{margin-left:91.66666667%}.ivu-col-xs-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-xs-21{display:block;width:87.5%}.ivu-col-xs-push-21{left:87.5%}.ivu-col-xs-pull-21{right:87.5%}.ivu-col-xs-offset-21{margin-left:87.5%}.ivu-col-xs-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-xs-20{display:block;width:83.33333333%}.ivu-col-xs-push-20{left:83.33333333%}.ivu-col-xs-pull-20{right:83.33333333%}.ivu-col-xs-offset-20{margin-left:83.33333333%}.ivu-col-xs-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-xs-19{display:block;width:79.16666667%}.ivu-col-xs-push-19{left:79.16666667%}.ivu-col-xs-pull-19{right:79.16666667%}.ivu-col-xs-offset-19{margin-left:79.16666667%}.ivu-col-xs-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-xs-18{display:block;width:75%}.ivu-col-xs-push-18{left:75%}.ivu-col-xs-pull-18{right:75%}.ivu-col-xs-offset-18{margin-left:75%}.ivu-col-xs-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-xs-17{display:block;width:70.83333333%}.ivu-col-xs-push-17{left:70.83333333%}.ivu-col-xs-pull-17{right:70.83333333%}.ivu-col-xs-offset-17{margin-left:70.83333333%}.ivu-col-xs-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-xs-16{display:block;width:66.66666667%}.ivu-col-xs-push-16{left:66.66666667%}.ivu-col-xs-pull-16{right:66.66666667%}.ivu-col-xs-offset-16{margin-left:66.66666667%}.ivu-col-xs-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-xs-15{display:block;width:62.5%}.ivu-col-xs-push-15{left:62.5%}.ivu-col-xs-pull-15{right:62.5%}.ivu-col-xs-offset-15{margin-left:62.5%}.ivu-col-xs-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-xs-14{display:block;width:58.33333333%}.ivu-col-xs-push-14{left:58.33333333%}.ivu-col-xs-pull-14{right:58.33333333%}.ivu-col-xs-offset-14{margin-left:58.33333333%}.ivu-col-xs-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-xs-13{display:block;width:54.16666667%}.ivu-col-xs-push-13{left:54.16666667%}.ivu-col-xs-pull-13{right:54.16666667%}.ivu-col-xs-offset-13{margin-left:54.16666667%}.ivu-col-xs-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-xs-12{display:block;width:50%}.ivu-col-xs-push-12{left:50%}.ivu-col-xs-pull-12{right:50%}.ivu-col-xs-offset-12{margin-left:50%}.ivu-col-xs-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-xs-11{display:block;width:45.83333333%}.ivu-col-xs-push-11{left:45.83333333%}.ivu-col-xs-pull-11{right:45.83333333%}.ivu-col-xs-offset-11{margin-left:45.83333333%}.ivu-col-xs-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-xs-10{display:block;width:41.66666667%}.ivu-col-xs-push-10{left:41.66666667%}.ivu-col-xs-pull-10{right:41.66666667%}.ivu-col-xs-offset-10{margin-left:41.66666667%}.ivu-col-xs-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-xs-9{display:block;width:37.5%}.ivu-col-xs-push-9{left:37.5%}.ivu-col-xs-pull-9{right:37.5%}.ivu-col-xs-offset-9{margin-left:37.5%}.ivu-col-xs-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-xs-8{display:block;width:33.33333333%}.ivu-col-xs-push-8{left:33.33333333%}.ivu-col-xs-pull-8{right:33.33333333%}.ivu-col-xs-offset-8{margin-left:33.33333333%}.ivu-col-xs-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-xs-7{display:block;width:29.16666667%}.ivu-col-xs-push-7{left:29.16666667%}.ivu-col-xs-pull-7{right:29.16666667%}.ivu-col-xs-offset-7{margin-left:29.16666667%}.ivu-col-xs-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-xs-6{display:block;width:25%}.ivu-col-xs-push-6{left:25%}.ivu-col-xs-pull-6{right:25%}.ivu-col-xs-offset-6{margin-left:25%}.ivu-col-xs-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-xs-5{display:block;width:20.83333333%}.ivu-col-xs-push-5{left:20.83333333%}.ivu-col-xs-pull-5{right:20.83333333%}.ivu-col-xs-offset-5{margin-left:20.83333333%}.ivu-col-xs-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-xs-4{display:block;width:16.66666667%}.ivu-col-xs-push-4{left:16.66666667%}.ivu-col-xs-pull-4{right:16.66666667%}.ivu-col-xs-offset-4{margin-left:16.66666667%}.ivu-col-xs-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-xs-3{display:block;width:12.5%}.ivu-col-xs-push-3{left:12.5%}.ivu-col-xs-pull-3{right:12.5%}.ivu-col-xs-offset-3{margin-left:12.5%}.ivu-col-xs-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-xs-2{display:block;width:8.33333333%}.ivu-col-xs-push-2{left:8.33333333%}.ivu-col-xs-pull-2{right:8.33333333%}.ivu-col-xs-offset-2{margin-left:8.33333333%}.ivu-col-xs-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-xs-1{display:block;width:4.16666667%}.ivu-col-xs-push-1{left:4.16666667%}.ivu-col-xs-pull-1{right:4.16666667%}.ivu-col-xs-offset-1{margin-left:4.16666667%}.ivu-col-xs-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-xs-0{display:none}.ivu-col-xs-push-0{left:auto}.ivu-col-xs-pull-0{right:auto}@media (min-width:768px){.ivu-col-span-sm-1,.ivu-col-span-sm-10,.ivu-col-span-sm-11,.ivu-col-span-sm-12,.ivu-col-span-sm-13,.ivu-col-span-sm-14,.ivu-col-span-sm-15,.ivu-col-span-sm-16,.ivu-col-span-sm-17,.ivu-col-span-sm-18,.ivu-col-span-sm-19,.ivu-col-span-sm-2,.ivu-col-span-sm-20,.ivu-col-span-sm-21,.ivu-col-span-sm-22,.ivu-col-span-sm-23,.ivu-col-span-sm-24,.ivu-col-span-sm-3,.ivu-col-span-sm-4,.ivu-col-span-sm-5,.ivu-col-span-sm-6,.ivu-col-span-sm-7,.ivu-col-span-sm-8,.ivu-col-span-sm-9{float:left;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-col-span-sm-24{display:block;width:100%}.ivu-col-sm-push-24{left:100%}.ivu-col-sm-pull-24{right:100%}.ivu-col-sm-offset-24{margin-left:100%}.ivu-col-sm-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-sm-23{display:block;width:95.83333333%}.ivu-col-sm-push-23{left:95.83333333%}.ivu-col-sm-pull-23{right:95.83333333%}.ivu-col-sm-offset-23{margin-left:95.83333333%}.ivu-col-sm-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-sm-22{display:block;width:91.66666667%}.ivu-col-sm-push-22{left:91.66666667%}.ivu-col-sm-pull-22{right:91.66666667%}.ivu-col-sm-offset-22{margin-left:91.66666667%}.ivu-col-sm-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-sm-21{display:block;width:87.5%}.ivu-col-sm-push-21{left:87.5%}.ivu-col-sm-pull-21{right:87.5%}.ivu-col-sm-offset-21{margin-left:87.5%}.ivu-col-sm-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-sm-20{display:block;width:83.33333333%}.ivu-col-sm-push-20{left:83.33333333%}.ivu-col-sm-pull-20{right:83.33333333%}.ivu-col-sm-offset-20{margin-left:83.33333333%}.ivu-col-sm-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-sm-19{display:block;width:79.16666667%}.ivu-col-sm-push-19{left:79.16666667%}.ivu-col-sm-pull-19{right:79.16666667%}.ivu-col-sm-offset-19{margin-left:79.16666667%}.ivu-col-sm-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-sm-18{display:block;width:75%}.ivu-col-sm-push-18{left:75%}.ivu-col-sm-pull-18{right:75%}.ivu-col-sm-offset-18{margin-left:75%}.ivu-col-sm-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-sm-17{display:block;width:70.83333333%}.ivu-col-sm-push-17{left:70.83333333%}.ivu-col-sm-pull-17{right:70.83333333%}.ivu-col-sm-offset-17{margin-left:70.83333333%}.ivu-col-sm-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-sm-16{display:block;width:66.66666667%}.ivu-col-sm-push-16{left:66.66666667%}.ivu-col-sm-pull-16{right:66.66666667%}.ivu-col-sm-offset-16{margin-left:66.66666667%}.ivu-col-sm-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-sm-15{display:block;width:62.5%}.ivu-col-sm-push-15{left:62.5%}.ivu-col-sm-pull-15{right:62.5%}.ivu-col-sm-offset-15{margin-left:62.5%}.ivu-col-sm-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-sm-14{display:block;width:58.33333333%}.ivu-col-sm-push-14{left:58.33333333%}.ivu-col-sm-pull-14{right:58.33333333%}.ivu-col-sm-offset-14{margin-left:58.33333333%}.ivu-col-sm-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-sm-13{display:block;width:54.16666667%}.ivu-col-sm-push-13{left:54.16666667%}.ivu-col-sm-pull-13{right:54.16666667%}.ivu-col-sm-offset-13{margin-left:54.16666667%}.ivu-col-sm-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-sm-12{display:block;width:50%}.ivu-col-sm-push-12{left:50%}.ivu-col-sm-pull-12{right:50%}.ivu-col-sm-offset-12{margin-left:50%}.ivu-col-sm-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-sm-11{display:block;width:45.83333333%}.ivu-col-sm-push-11{left:45.83333333%}.ivu-col-sm-pull-11{right:45.83333333%}.ivu-col-sm-offset-11{margin-left:45.83333333%}.ivu-col-sm-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-sm-10{display:block;width:41.66666667%}.ivu-col-sm-push-10{left:41.66666667%}.ivu-col-sm-pull-10{right:41.66666667%}.ivu-col-sm-offset-10{margin-left:41.66666667%}.ivu-col-sm-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-sm-9{display:block;width:37.5%}.ivu-col-sm-push-9{left:37.5%}.ivu-col-sm-pull-9{right:37.5%}.ivu-col-sm-offset-9{margin-left:37.5%}.ivu-col-sm-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-sm-8{display:block;width:33.33333333%}.ivu-col-sm-push-8{left:33.33333333%}.ivu-col-sm-pull-8{right:33.33333333%}.ivu-col-sm-offset-8{margin-left:33.33333333%}.ivu-col-sm-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-sm-7{display:block;width:29.16666667%}.ivu-col-sm-push-7{left:29.16666667%}.ivu-col-sm-pull-7{right:29.16666667%}.ivu-col-sm-offset-7{margin-left:29.16666667%}.ivu-col-sm-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-sm-6{display:block;width:25%}.ivu-col-sm-push-6{left:25%}.ivu-col-sm-pull-6{right:25%}.ivu-col-sm-offset-6{margin-left:25%}.ivu-col-sm-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-sm-5{display:block;width:20.83333333%}.ivu-col-sm-push-5{left:20.83333333%}.ivu-col-sm-pull-5{right:20.83333333%}.ivu-col-sm-offset-5{margin-left:20.83333333%}.ivu-col-sm-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-sm-4{display:block;width:16.66666667%}.ivu-col-sm-push-4{left:16.66666667%}.ivu-col-sm-pull-4{right:16.66666667%}.ivu-col-sm-offset-4{margin-left:16.66666667%}.ivu-col-sm-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-sm-3{display:block;width:12.5%}.ivu-col-sm-push-3{left:12.5%}.ivu-col-sm-pull-3{right:12.5%}.ivu-col-sm-offset-3{margin-left:12.5%}.ivu-col-sm-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-sm-2{display:block;width:8.33333333%}.ivu-col-sm-push-2{left:8.33333333%}.ivu-col-sm-pull-2{right:8.33333333%}.ivu-col-sm-offset-2{margin-left:8.33333333%}.ivu-col-sm-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-sm-1{display:block;width:4.16666667%}.ivu-col-sm-push-1{left:4.16666667%}.ivu-col-sm-pull-1{right:4.16666667%}.ivu-col-sm-offset-1{margin-left:4.16666667%}.ivu-col-sm-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-sm-0{display:none}.ivu-col-sm-push-0{left:auto}.ivu-col-sm-pull-0{right:auto}}@media (min-width:992px){.ivu-col-span-md-1,.ivu-col-span-md-10,.ivu-col-span-md-11,.ivu-col-span-md-12,.ivu-col-span-md-13,.ivu-col-span-md-14,.ivu-col-span-md-15,.ivu-col-span-md-16,.ivu-col-span-md-17,.ivu-col-span-md-18,.ivu-col-span-md-19,.ivu-col-span-md-2,.ivu-col-span-md-20,.ivu-col-span-md-21,.ivu-col-span-md-22,.ivu-col-span-md-23,.ivu-col-span-md-24,.ivu-col-span-md-3,.ivu-col-span-md-4,.ivu-col-span-md-5,.ivu-col-span-md-6,.ivu-col-span-md-7,.ivu-col-span-md-8,.ivu-col-span-md-9{float:left;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-col-span-md-24{display:block;width:100%}.ivu-col-md-push-24{left:100%}.ivu-col-md-pull-24{right:100%}.ivu-col-md-offset-24{margin-left:100%}.ivu-col-md-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-md-23{display:block;width:95.83333333%}.ivu-col-md-push-23{left:95.83333333%}.ivu-col-md-pull-23{right:95.83333333%}.ivu-col-md-offset-23{margin-left:95.83333333%}.ivu-col-md-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-md-22{display:block;width:91.66666667%}.ivu-col-md-push-22{left:91.66666667%}.ivu-col-md-pull-22{right:91.66666667%}.ivu-col-md-offset-22{margin-left:91.66666667%}.ivu-col-md-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-md-21{display:block;width:87.5%}.ivu-col-md-push-21{left:87.5%}.ivu-col-md-pull-21{right:87.5%}.ivu-col-md-offset-21{margin-left:87.5%}.ivu-col-md-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-md-20{display:block;width:83.33333333%}.ivu-col-md-push-20{left:83.33333333%}.ivu-col-md-pull-20{right:83.33333333%}.ivu-col-md-offset-20{margin-left:83.33333333%}.ivu-col-md-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-md-19{display:block;width:79.16666667%}.ivu-col-md-push-19{left:79.16666667%}.ivu-col-md-pull-19{right:79.16666667%}.ivu-col-md-offset-19{margin-left:79.16666667%}.ivu-col-md-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-md-18{display:block;width:75%}.ivu-col-md-push-18{left:75%}.ivu-col-md-pull-18{right:75%}.ivu-col-md-offset-18{margin-left:75%}.ivu-col-md-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-md-17{display:block;width:70.83333333%}.ivu-col-md-push-17{left:70.83333333%}.ivu-col-md-pull-17{right:70.83333333%}.ivu-col-md-offset-17{margin-left:70.83333333%}.ivu-col-md-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-md-16{display:block;width:66.66666667%}.ivu-col-md-push-16{left:66.66666667%}.ivu-col-md-pull-16{right:66.66666667%}.ivu-col-md-offset-16{margin-left:66.66666667%}.ivu-col-md-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-md-15{display:block;width:62.5%}.ivu-col-md-push-15{left:62.5%}.ivu-col-md-pull-15{right:62.5%}.ivu-col-md-offset-15{margin-left:62.5%}.ivu-col-md-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-md-14{display:block;width:58.33333333%}.ivu-col-md-push-14{left:58.33333333%}.ivu-col-md-pull-14{right:58.33333333%}.ivu-col-md-offset-14{margin-left:58.33333333%}.ivu-col-md-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-md-13{display:block;width:54.16666667%}.ivu-col-md-push-13{left:54.16666667%}.ivu-col-md-pull-13{right:54.16666667%}.ivu-col-md-offset-13{margin-left:54.16666667%}.ivu-col-md-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-md-12{display:block;width:50%}.ivu-col-md-push-12{left:50%}.ivu-col-md-pull-12{right:50%}.ivu-col-md-offset-12{margin-left:50%}.ivu-col-md-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-md-11{display:block;width:45.83333333%}.ivu-col-md-push-11{left:45.83333333%}.ivu-col-md-pull-11{right:45.83333333%}.ivu-col-md-offset-11{margin-left:45.83333333%}.ivu-col-md-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-md-10{display:block;width:41.66666667%}.ivu-col-md-push-10{left:41.66666667%}.ivu-col-md-pull-10{right:41.66666667%}.ivu-col-md-offset-10{margin-left:41.66666667%}.ivu-col-md-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-md-9{display:block;width:37.5%}.ivu-col-md-push-9{left:37.5%}.ivu-col-md-pull-9{right:37.5%}.ivu-col-md-offset-9{margin-left:37.5%}.ivu-col-md-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-md-8{display:block;width:33.33333333%}.ivu-col-md-push-8{left:33.33333333%}.ivu-col-md-pull-8{right:33.33333333%}.ivu-col-md-offset-8{margin-left:33.33333333%}.ivu-col-md-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-md-7{display:block;width:29.16666667%}.ivu-col-md-push-7{left:29.16666667%}.ivu-col-md-pull-7{right:29.16666667%}.ivu-col-md-offset-7{margin-left:29.16666667%}.ivu-col-md-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-md-6{display:block;width:25%}.ivu-col-md-push-6{left:25%}.ivu-col-md-pull-6{right:25%}.ivu-col-md-offset-6{margin-left:25%}.ivu-col-md-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-md-5{display:block;width:20.83333333%}.ivu-col-md-push-5{left:20.83333333%}.ivu-col-md-pull-5{right:20.83333333%}.ivu-col-md-offset-5{margin-left:20.83333333%}.ivu-col-md-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-md-4{display:block;width:16.66666667%}.ivu-col-md-push-4{left:16.66666667%}.ivu-col-md-pull-4{right:16.66666667%}.ivu-col-md-offset-4{margin-left:16.66666667%}.ivu-col-md-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-md-3{display:block;width:12.5%}.ivu-col-md-push-3{left:12.5%}.ivu-col-md-pull-3{right:12.5%}.ivu-col-md-offset-3{margin-left:12.5%}.ivu-col-md-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-md-2{display:block;width:8.33333333%}.ivu-col-md-push-2{left:8.33333333%}.ivu-col-md-pull-2{right:8.33333333%}.ivu-col-md-offset-2{margin-left:8.33333333%}.ivu-col-md-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-md-1{display:block;width:4.16666667%}.ivu-col-md-push-1{left:4.16666667%}.ivu-col-md-pull-1{right:4.16666667%}.ivu-col-md-offset-1{margin-left:4.16666667%}.ivu-col-md-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-md-0{display:none}.ivu-col-md-push-0{left:auto}.ivu-col-md-pull-0{right:auto}}@media (min-width:1200px){.ivu-col-span-lg-1,.ivu-col-span-lg-10,.ivu-col-span-lg-11,.ivu-col-span-lg-12,.ivu-col-span-lg-13,.ivu-col-span-lg-14,.ivu-col-span-lg-15,.ivu-col-span-lg-16,.ivu-col-span-lg-17,.ivu-col-span-lg-18,.ivu-col-span-lg-19,.ivu-col-span-lg-2,.ivu-col-span-lg-20,.ivu-col-span-lg-21,.ivu-col-span-lg-22,.ivu-col-span-lg-23,.ivu-col-span-lg-24,.ivu-col-span-lg-3,.ivu-col-span-lg-4,.ivu-col-span-lg-5,.ivu-col-span-lg-6,.ivu-col-span-lg-7,.ivu-col-span-lg-8,.ivu-col-span-lg-9{float:left;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-col-span-lg-24{display:block;width:100%}.ivu-col-lg-push-24{left:100%}.ivu-col-lg-pull-24{right:100%}.ivu-col-lg-offset-24{margin-left:100%}.ivu-col-lg-order-24{-webkit-box-ordinal-group:25;-ms-flex-order:24;order:24}.ivu-col-span-lg-23{display:block;width:95.83333333%}.ivu-col-lg-push-23{left:95.83333333%}.ivu-col-lg-pull-23{right:95.83333333%}.ivu-col-lg-offset-23{margin-left:95.83333333%}.ivu-col-lg-order-23{-webkit-box-ordinal-group:24;-ms-flex-order:23;order:23}.ivu-col-span-lg-22{display:block;width:91.66666667%}.ivu-col-lg-push-22{left:91.66666667%}.ivu-col-lg-pull-22{right:91.66666667%}.ivu-col-lg-offset-22{margin-left:91.66666667%}.ivu-col-lg-order-22{-webkit-box-ordinal-group:23;-ms-flex-order:22;order:22}.ivu-col-span-lg-21{display:block;width:87.5%}.ivu-col-lg-push-21{left:87.5%}.ivu-col-lg-pull-21{right:87.5%}.ivu-col-lg-offset-21{margin-left:87.5%}.ivu-col-lg-order-21{-webkit-box-ordinal-group:22;-ms-flex-order:21;order:21}.ivu-col-span-lg-20{display:block;width:83.33333333%}.ivu-col-lg-push-20{left:83.33333333%}.ivu-col-lg-pull-20{right:83.33333333%}.ivu-col-lg-offset-20{margin-left:83.33333333%}.ivu-col-lg-order-20{-webkit-box-ordinal-group:21;-ms-flex-order:20;order:20}.ivu-col-span-lg-19{display:block;width:79.16666667%}.ivu-col-lg-push-19{left:79.16666667%}.ivu-col-lg-pull-19{right:79.16666667%}.ivu-col-lg-offset-19{margin-left:79.16666667%}.ivu-col-lg-order-19{-webkit-box-ordinal-group:20;-ms-flex-order:19;order:19}.ivu-col-span-lg-18{display:block;width:75%}.ivu-col-lg-push-18{left:75%}.ivu-col-lg-pull-18{right:75%}.ivu-col-lg-offset-18{margin-left:75%}.ivu-col-lg-order-18{-webkit-box-ordinal-group:19;-ms-flex-order:18;order:18}.ivu-col-span-lg-17{display:block;width:70.83333333%}.ivu-col-lg-push-17{left:70.83333333%}.ivu-col-lg-pull-17{right:70.83333333%}.ivu-col-lg-offset-17{margin-left:70.83333333%}.ivu-col-lg-order-17{-webkit-box-ordinal-group:18;-ms-flex-order:17;order:17}.ivu-col-span-lg-16{display:block;width:66.66666667%}.ivu-col-lg-push-16{left:66.66666667%}.ivu-col-lg-pull-16{right:66.66666667%}.ivu-col-lg-offset-16{margin-left:66.66666667%}.ivu-col-lg-order-16{-webkit-box-ordinal-group:17;-ms-flex-order:16;order:16}.ivu-col-span-lg-15{display:block;width:62.5%}.ivu-col-lg-push-15{left:62.5%}.ivu-col-lg-pull-15{right:62.5%}.ivu-col-lg-offset-15{margin-left:62.5%}.ivu-col-lg-order-15{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.ivu-col-span-lg-14{display:block;width:58.33333333%}.ivu-col-lg-push-14{left:58.33333333%}.ivu-col-lg-pull-14{right:58.33333333%}.ivu-col-lg-offset-14{margin-left:58.33333333%}.ivu-col-lg-order-14{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14}.ivu-col-span-lg-13{display:block;width:54.16666667%}.ivu-col-lg-push-13{left:54.16666667%}.ivu-col-lg-pull-13{right:54.16666667%}.ivu-col-lg-offset-13{margin-left:54.16666667%}.ivu-col-lg-order-13{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.ivu-col-span-lg-12{display:block;width:50%}.ivu-col-lg-push-12{left:50%}.ivu-col-lg-pull-12{right:50%}.ivu-col-lg-offset-12{margin-left:50%}.ivu-col-lg-order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.ivu-col-span-lg-11{display:block;width:45.83333333%}.ivu-col-lg-push-11{left:45.83333333%}.ivu-col-lg-pull-11{right:45.83333333%}.ivu-col-lg-offset-11{margin-left:45.83333333%}.ivu-col-lg-order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.ivu-col-span-lg-10{display:block;width:41.66666667%}.ivu-col-lg-push-10{left:41.66666667%}.ivu-col-lg-pull-10{right:41.66666667%}.ivu-col-lg-offset-10{margin-left:41.66666667%}.ivu-col-lg-order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.ivu-col-span-lg-9{display:block;width:37.5%}.ivu-col-lg-push-9{left:37.5%}.ivu-col-lg-pull-9{right:37.5%}.ivu-col-lg-offset-9{margin-left:37.5%}.ivu-col-lg-order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.ivu-col-span-lg-8{display:block;width:33.33333333%}.ivu-col-lg-push-8{left:33.33333333%}.ivu-col-lg-pull-8{right:33.33333333%}.ivu-col-lg-offset-8{margin-left:33.33333333%}.ivu-col-lg-order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.ivu-col-span-lg-7{display:block;width:29.16666667%}.ivu-col-lg-push-7{left:29.16666667%}.ivu-col-lg-pull-7{right:29.16666667%}.ivu-col-lg-offset-7{margin-left:29.16666667%}.ivu-col-lg-order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.ivu-col-span-lg-6{display:block;width:25%}.ivu-col-lg-push-6{left:25%}.ivu-col-lg-pull-6{right:25%}.ivu-col-lg-offset-6{margin-left:25%}.ivu-col-lg-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.ivu-col-span-lg-5{display:block;width:20.83333333%}.ivu-col-lg-push-5{left:20.83333333%}.ivu-col-lg-pull-5{right:20.83333333%}.ivu-col-lg-offset-5{margin-left:20.83333333%}.ivu-col-lg-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.ivu-col-span-lg-4{display:block;width:16.66666667%}.ivu-col-lg-push-4{left:16.66666667%}.ivu-col-lg-pull-4{right:16.66666667%}.ivu-col-lg-offset-4{margin-left:16.66666667%}.ivu-col-lg-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ivu-col-span-lg-3{display:block;width:12.5%}.ivu-col-lg-push-3{left:12.5%}.ivu-col-lg-pull-3{right:12.5%}.ivu-col-lg-offset-3{margin-left:12.5%}.ivu-col-lg-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.ivu-col-span-lg-2{display:block;width:8.33333333%}.ivu-col-lg-push-2{left:8.33333333%}.ivu-col-lg-pull-2{right:8.33333333%}.ivu-col-lg-offset-2{margin-left:8.33333333%}.ivu-col-lg-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.ivu-col-span-lg-1{display:block;width:4.16666667%}.ivu-col-lg-push-1{left:4.16666667%}.ivu-col-lg-pull-1{right:4.16666667%}.ivu-col-lg-offset-1{margin-left:4.16666667%}.ivu-col-lg-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.ivu-col-span-lg-0{display:none}.ivu-col-lg-push-0{left:auto}.ivu-col-lg-pull-0{right:auto}}.ivu-article h1{font-size:26px;font-weight:400}.ivu-article h2{font-size:20px;font-weight:400}.ivu-article h3{font-size:16px;font-weight:400}.ivu-article h4{font-size:14px;font-weight:400}.ivu-article h5{font-size:12px;font-weight:400}.ivu-article h6{font-size:12px;font-weight:400}.ivu-article blockquote{padding:5px 5px 3px 10px;line-height:1.5;border-left:4px solid #ddd;margin-bottom:20px;color:#666;font-size:14px}.ivu-article ul:not([class^=ivu-]){padding-left:40px;list-style-type:disc}.ivu-article li:not([class^=ivu-]){margin-bottom:5px;font-size:14px}.ivu-article ol ul:not([class^=ivu-]),.ivu-article ul ul:not([class^=ivu-]){list-style-type:circle}.ivu-article p{margin:5px;font-size:14px}.ivu-article a:not([class^=ivu-])[target=\"_blank\"]:after{content:\"\\F3F2\";font-family:Ionicons;color:#aaa;margin-left:3px}.fade-appear,.fade-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear,.fade-enter-active{-webkit-animation-name:ivuFadeIn;animation-name:ivuFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave-active{-webkit-animation-name:ivuFadeOut;animation-name:ivuFadeOut;-webkit-animation-play-state:running;animation-play-state:running}.fade-appear,.fade-enter-active{opacity:0;-webkit-animation-timing-function:linear;animation-timing-function:linear}.fade-leave-active{-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes ivuFadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ivuFadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ivuFadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ivuFadeOut{0%{opacity:1}100%{opacity:0}}.move-up-appear,.move-up-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear,.move-up-enter-active{-webkit-animation-name:ivuMoveUpIn;animation-name:ivuMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave-active{-webkit-animation-name:ivuMoveUpOut;animation-name:ivuMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running}.move-up-appear,.move-up-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-up-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-down-appear,.move-down-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear,.move-down-enter-active{-webkit-animation-name:ivuMoveDownIn;animation-name:ivuMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave-active{-webkit-animation-name:ivuMoveDownOut;animation-name:ivuMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running}.move-down-appear,.move-down-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-down-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-left-appear,.move-left-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear,.move-left-enter-active{-webkit-animation-name:ivuMoveLeftIn;animation-name:ivuMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave-active{-webkit-animation-name:ivuMoveLeftOut;animation-name:ivuMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.move-left-appear,.move-left-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-left-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-right-appear,.move-right-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear,.move-right-enter-active{-webkit-animation-name:ivuMoveRightIn;animation-name:ivuMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave-active{-webkit-animation-name:ivuMoveRightOut;animation-name:ivuMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running}.move-right-appear,.move-right-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-right-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes ivuMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes ivuMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@keyframes ivuMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@-webkit-keyframes ivuMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@keyframes ivuMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@-webkit-keyframes ivuMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes ivuMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@-webkit-keyframes ivuMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes ivuMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes ivuMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes ivuMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes ivuMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes ivuMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes ivuMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@keyframes ivuMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}.move-notice-appear,.move-notice-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-notice-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-notice-appear,.move-notice-enter-active{-webkit-animation-name:ivuMoveNoticeIn;animation-name:ivuMoveNoticeIn;-webkit-animation-play-state:running;animation-play-state:running}.move-notice-leave-active{-webkit-animation-name:ivuMoveNoticeOut;animation-name:ivuMoveNoticeOut;-webkit-animation-play-state:running;animation-play-state:running}.move-notice-appear,.move-notice-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.move-notice-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuMoveNoticeIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes ivuMoveNoticeIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes ivuMoveNoticeOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}70%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:auto;padding:16px;margin-bottom:10px;opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:0;padding:0;margin-bottom:0;opacity:0}}@keyframes ivuMoveNoticeOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}70%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:auto;padding:16px;margin-bottom:10px;opacity:0}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);height:0;padding:0;margin-bottom:0;opacity:0}}.ease-appear,.ease-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.ease-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.ease-appear,.ease-enter-active{-webkit-animation-name:ivuEaseIn;animation-name:ivuEaseIn;-webkit-animation-play-state:running;animation-play-state:running}.ease-leave-active{-webkit-animation-name:ivuEaseOut;animation-name:ivuEaseOut;-webkit-animation-play-state:running;animation-play-state:running}.ease-appear,.ease-enter-active{opacity:0;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}.ease-leave-active{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes ivuEaseIn{0%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ivuEaseIn{0%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ivuEaseOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes ivuEaseOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition-drop-appear,.transition-drop-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.transition-drop-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.transition-drop-appear,.transition-drop-enter-active{-webkit-animation-name:ivuTransitionDropIn;animation-name:ivuTransitionDropIn;-webkit-animation-play-state:running;animation-play-state:running}.transition-drop-leave-active{-webkit-animation-name:ivuTransitionDropOut;animation-name:ivuTransitionDropOut;-webkit-animation-play-state:running;animation-play-state:running}.transition-drop-appear,.transition-drop-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.transition-drop-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-up-appear,.slide-up-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear,.slide-up-enter-active{-webkit-animation-name:ivuSlideUpIn;animation-name:ivuSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave-active{-webkit-animation-name:ivuSlideUpOut;animation-name:ivuSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-appear,.slide-up-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-up-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-down-appear,.slide-down-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear,.slide-down-enter-active{-webkit-animation-name:ivuSlideDownIn;animation-name:ivuSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave-active{-webkit-animation-name:ivuSlideDownOut;animation-name:ivuSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-appear,.slide-down-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-down-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-left-appear,.slide-left-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear,.slide-left-enter-active{-webkit-animation-name:ivuSlideLeftIn;animation-name:ivuSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave-active{-webkit-animation-name:ivuSlideLeftOut;animation-name:ivuSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-appear,.slide-left-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-left-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-right-appear,.slide-right-enter-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-leave-active{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear,.slide-right-enter-active{-webkit-animation-name:ivuSlideRightIn;animation-name:ivuSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave-active{-webkit-animation-name:ivuSlideRightOut;animation-name:ivuSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-appear,.slide-right-enter-active{opacity:0;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.slide-right-leave-active{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes ivuTransitionDropIn{0%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuTransitionDropIn{0%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuTransitionDropOut{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuTransitionDropOut{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes ivuSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}100%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes ivuSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes ivuSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes ivuSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ivuSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ivuSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes ivuSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@-webkit-keyframes ivuSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ivuSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}100%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ivuSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes ivuSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}.collapse-transition{-webkit-transition:.2s height ease-in-out,.2s padding-top ease-in-out,.2s padding-bottom ease-in-out;transition:.2s height ease-in-out,.2s padding-top ease-in-out,.2s padding-bottom ease-in-out}.ivu-btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;line-height:1.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:5px 15px 6px;font-size:12px;border-radius:4px;-webkit-transition:color .2s linear,background-color .2s linear,border .2s linear,-webkit-box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,-webkit-box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,box-shadow .2s linear;transition:color .2s linear,background-color .2s linear,border .2s linear,box-shadow .2s linear,-webkit-box-shadow .2s linear;color:#515a6e;background-color:#fff;border-color:#dcdee2}.ivu-btn>.ivu-icon{line-height:1.5;vertical-align:middle}.ivu-btn-icon-only.ivu-btn-circle>.ivu-icon{vertical-align:baseline}.ivu-btn>span{vertical-align:middle}.ivu-btn,.ivu-btn:active,.ivu-btn:focus{outline:0}.ivu-btn:not([disabled]):hover{text-decoration:none}.ivu-btn:not([disabled]):active{outline:0}.ivu-btn.disabled,.ivu-btn[disabled]{cursor:not-allowed}.ivu-btn.disabled>*,.ivu-btn[disabled]>*{pointer-events:none}.ivu-btn-large{padding:6px 15px 6px 15px;font-size:14px;border-radius:4px}.ivu-btn-small{padding:1px 7px 2px;font-size:12px;border-radius:3px}.ivu-btn-icon-only{padding:5px 15px 6px;font-size:12px;border-radius:4px}.ivu-btn-icon-only.ivu-btn-small{padding:1px 7px 2px;font-size:12px;border-radius:3px}.ivu-btn-icon-only.ivu-btn-large{padding:6px 15px 6px 15px;font-size:14px;border-radius:4px}.ivu-btn>a:only-child{color:currentColor}.ivu-btn>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:hover{color:#747b8b;background-color:#fff;border-color:#e3e5e8}.ivu-btn:hover>a:only-child{color:currentColor}.ivu-btn:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.active,.ivu-btn:active{color:#4d5669;background-color:#f2f2f2;border-color:#f2f2f2}.ivu-btn.active>a:only-child,.ivu-btn:active>a:only-child{color:currentColor}.ivu-btn.active>a:only-child:after,.ivu-btn:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.disabled,.ivu-btn.disabled.active,.ivu-btn.disabled:active,.ivu-btn.disabled:focus,.ivu-btn.disabled:hover,.ivu-btn[disabled],.ivu-btn[disabled].active,.ivu-btn[disabled]:active,.ivu-btn[disabled]:focus,.ivu-btn[disabled]:hover,fieldset[disabled] .ivu-btn,fieldset[disabled] .ivu-btn.active,fieldset[disabled] .ivu-btn:active,fieldset[disabled] .ivu-btn:focus,fieldset[disabled] .ivu-btn:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn.disabled.active>a:only-child,.ivu-btn.disabled:active>a:only-child,.ivu-btn.disabled:focus>a:only-child,.ivu-btn.disabled:hover>a:only-child,.ivu-btn.disabled>a:only-child,.ivu-btn[disabled].active>a:only-child,.ivu-btn[disabled]:active>a:only-child,.ivu-btn[disabled]:focus>a:only-child,.ivu-btn[disabled]:hover>a:only-child,.ivu-btn[disabled]>a:only-child,fieldset[disabled] .ivu-btn.active>a:only-child,fieldset[disabled] .ivu-btn:active>a:only-child,fieldset[disabled] .ivu-btn:focus>a:only-child,fieldset[disabled] .ivu-btn:hover>a:only-child,fieldset[disabled] .ivu-btn>a:only-child{color:currentColor}.ivu-btn.disabled.active>a:only-child:after,.ivu-btn.disabled:active>a:only-child:after,.ivu-btn.disabled:focus>a:only-child:after,.ivu-btn.disabled:hover>a:only-child:after,.ivu-btn.disabled>a:only-child:after,.ivu-btn[disabled].active>a:only-child:after,.ivu-btn[disabled]:active>a:only-child:after,.ivu-btn[disabled]:focus>a:only-child:after,.ivu-btn[disabled]:hover>a:only-child:after,.ivu-btn[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn.active>a:only-child:after,fieldset[disabled] .ivu-btn:active>a:only-child:after,fieldset[disabled] .ivu-btn:focus>a:only-child:after,fieldset[disabled] .ivu-btn:hover>a:only-child:after,fieldset[disabled] .ivu-btn>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:hover{color:#57a3f3;background-color:#fff;border-color:#57a3f3}.ivu-btn:hover>a:only-child{color:currentColor}.ivu-btn:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn.active,.ivu-btn:active{color:#2b85e4;background-color:#fff;border-color:#2b85e4}.ivu-btn.active>a:only-child,.ivu-btn:active>a:only-child{color:currentColor}.ivu-btn.active>a:only-child:after,.ivu-btn:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn:focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-btn-long{width:100%}.ivu-btn>.ivu-icon+span,.ivu-btn>span+.ivu-icon{margin-left:4px}.ivu-btn-primary{color:#fff;background-color:#2d8cf0;border-color:#2d8cf0}.ivu-btn-primary>a:only-child{color:currentColor}.ivu-btn-primary>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary:hover{color:#fff;background-color:#57a3f3;border-color:#57a3f3}.ivu-btn-primary:hover>a:only-child{color:currentColor}.ivu-btn-primary:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.active,.ivu-btn-primary:active{color:#f2f2f2;background-color:#2b85e4;border-color:#2b85e4}.ivu-btn-primary.active>a:only-child,.ivu-btn-primary:active>a:only-child{color:currentColor}.ivu-btn-primary.active>a:only-child:after,.ivu-btn-primary:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.disabled,.ivu-btn-primary.disabled.active,.ivu-btn-primary.disabled:active,.ivu-btn-primary.disabled:focus,.ivu-btn-primary.disabled:hover,.ivu-btn-primary[disabled],.ivu-btn-primary[disabled].active,.ivu-btn-primary[disabled]:active,.ivu-btn-primary[disabled]:focus,.ivu-btn-primary[disabled]:hover,fieldset[disabled] .ivu-btn-primary,fieldset[disabled] .ivu-btn-primary.active,fieldset[disabled] .ivu-btn-primary:active,fieldset[disabled] .ivu-btn-primary:focus,fieldset[disabled] .ivu-btn-primary:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-primary.disabled.active>a:only-child,.ivu-btn-primary.disabled:active>a:only-child,.ivu-btn-primary.disabled:focus>a:only-child,.ivu-btn-primary.disabled:hover>a:only-child,.ivu-btn-primary.disabled>a:only-child,.ivu-btn-primary[disabled].active>a:only-child,.ivu-btn-primary[disabled]:active>a:only-child,.ivu-btn-primary[disabled]:focus>a:only-child,.ivu-btn-primary[disabled]:hover>a:only-child,.ivu-btn-primary[disabled]>a:only-child,fieldset[disabled] .ivu-btn-primary.active>a:only-child,fieldset[disabled] .ivu-btn-primary:active>a:only-child,fieldset[disabled] .ivu-btn-primary:focus>a:only-child,fieldset[disabled] .ivu-btn-primary:hover>a:only-child,fieldset[disabled] .ivu-btn-primary>a:only-child{color:currentColor}.ivu-btn-primary.disabled.active>a:only-child:after,.ivu-btn-primary.disabled:active>a:only-child:after,.ivu-btn-primary.disabled:focus>a:only-child:after,.ivu-btn-primary.disabled:hover>a:only-child:after,.ivu-btn-primary.disabled>a:only-child:after,.ivu-btn-primary[disabled].active>a:only-child:after,.ivu-btn-primary[disabled]:active>a:only-child:after,.ivu-btn-primary[disabled]:focus>a:only-child:after,.ivu-btn-primary[disabled]:hover>a:only-child:after,.ivu-btn-primary[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-primary.active>a:only-child:after,fieldset[disabled] .ivu-btn-primary:active>a:only-child:after,fieldset[disabled] .ivu-btn-primary:focus>a:only-child:after,fieldset[disabled] .ivu-btn-primary:hover>a:only-child:after,fieldset[disabled] .ivu-btn-primary>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-primary.active,.ivu-btn-primary:active,.ivu-btn-primary:hover{color:#fff}.ivu-btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:not(:first-child):not(:last-child){border-right-color:#2b85e4;border-left-color:#2b85e4}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:first-child:not(:last-child){border-right-color:#2b85e4}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#dcdee2}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary+.ivu-btn,.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:last-child:not(:first-child){border-left-color:#2b85e4}.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary+.ivu-btn[disabled],.ivu-btn-group:not(.ivu-btn-group-vertical) .ivu-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#dcdee2}.ivu-btn-group-vertical .ivu-btn-primary:not(:first-child):not(:last-child){border-top-color:#2b85e4;border-bottom-color:#2b85e4}.ivu-btn-group-vertical .ivu-btn-primary:first-child:not(:last-child){border-bottom-color:#2b85e4}.ivu-btn-group-vertical .ivu-btn-primary:first-child:not(:last-child)[disabled]{border-top-color:#dcdee2}.ivu-btn-group-vertical .ivu-btn-primary+.ivu-btn,.ivu-btn-group-vertical .ivu-btn-primary:last-child:not(:first-child){border-top-color:#2b85e4}.ivu-btn-group-vertical .ivu-btn-primary+.ivu-btn[disabled],.ivu-btn-group-vertical .ivu-btn-primary:last-child:not(:first-child)[disabled]{border-bottom-color:#dcdee2}.ivu-btn-dashed{color:#515a6e;background-color:#fff;border-color:#dcdee2;border-style:dashed}.ivu-btn-dashed>a:only-child{color:currentColor}.ivu-btn-dashed>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:hover{color:#747b8b;background-color:#fff;border-color:#e3e5e8}.ivu-btn-dashed:hover>a:only-child{color:currentColor}.ivu-btn-dashed:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.active,.ivu-btn-dashed:active{color:#4d5669;background-color:#f2f2f2;border-color:#f2f2f2}.ivu-btn-dashed.active>a:only-child,.ivu-btn-dashed:active>a:only-child{color:currentColor}.ivu-btn-dashed.active>a:only-child:after,.ivu-btn-dashed:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.disabled,.ivu-btn-dashed.disabled.active,.ivu-btn-dashed.disabled:active,.ivu-btn-dashed.disabled:focus,.ivu-btn-dashed.disabled:hover,.ivu-btn-dashed[disabled],.ivu-btn-dashed[disabled].active,.ivu-btn-dashed[disabled]:active,.ivu-btn-dashed[disabled]:focus,.ivu-btn-dashed[disabled]:hover,fieldset[disabled] .ivu-btn-dashed,fieldset[disabled] .ivu-btn-dashed.active,fieldset[disabled] .ivu-btn-dashed:active,fieldset[disabled] .ivu-btn-dashed:focus,fieldset[disabled] .ivu-btn-dashed:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-dashed.disabled.active>a:only-child,.ivu-btn-dashed.disabled:active>a:only-child,.ivu-btn-dashed.disabled:focus>a:only-child,.ivu-btn-dashed.disabled:hover>a:only-child,.ivu-btn-dashed.disabled>a:only-child,.ivu-btn-dashed[disabled].active>a:only-child,.ivu-btn-dashed[disabled]:active>a:only-child,.ivu-btn-dashed[disabled]:focus>a:only-child,.ivu-btn-dashed[disabled]:hover>a:only-child,.ivu-btn-dashed[disabled]>a:only-child,fieldset[disabled] .ivu-btn-dashed.active>a:only-child,fieldset[disabled] .ivu-btn-dashed:active>a:only-child,fieldset[disabled] .ivu-btn-dashed:focus>a:only-child,fieldset[disabled] .ivu-btn-dashed:hover>a:only-child,fieldset[disabled] .ivu-btn-dashed>a:only-child{color:currentColor}.ivu-btn-dashed.disabled.active>a:only-child:after,.ivu-btn-dashed.disabled:active>a:only-child:after,.ivu-btn-dashed.disabled:focus>a:only-child:after,.ivu-btn-dashed.disabled:hover>a:only-child:after,.ivu-btn-dashed.disabled>a:only-child:after,.ivu-btn-dashed[disabled].active>a:only-child:after,.ivu-btn-dashed[disabled]:active>a:only-child:after,.ivu-btn-dashed[disabled]:focus>a:only-child:after,.ivu-btn-dashed[disabled]:hover>a:only-child:after,.ivu-btn-dashed[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-dashed.active>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:active>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:focus>a:only-child:after,fieldset[disabled] .ivu-btn-dashed:hover>a:only-child:after,fieldset[disabled] .ivu-btn-dashed>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:hover{color:#57a3f3;background-color:#fff;border-color:#57a3f3}.ivu-btn-dashed:hover>a:only-child{color:currentColor}.ivu-btn-dashed:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed.active,.ivu-btn-dashed:active{color:#2b85e4;background-color:#fff;border-color:#2b85e4}.ivu-btn-dashed.active>a:only-child,.ivu-btn-dashed:active>a:only-child{color:currentColor}.ivu-btn-dashed.active>a:only-child:after,.ivu-btn-dashed:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-dashed:focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-btn-text{color:#515a6e;background-color:transparent;border-color:transparent}.ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:hover{color:#747b8b;background-color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.ivu-btn-text:hover>a:only-child{color:currentColor}.ivu-btn-text:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.active,.ivu-btn-text:active{color:#4d5669;background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.ivu-btn-text.active>a:only-child,.ivu-btn-text:active>a:only-child{color:currentColor}.ivu-btn-text.active>a:only-child:after,.ivu-btn-text:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.disabled,.ivu-btn-text.disabled.active,.ivu-btn-text.disabled:active,.ivu-btn-text.disabled:focus,.ivu-btn-text.disabled:hover,.ivu-btn-text[disabled],.ivu-btn-text[disabled].active,.ivu-btn-text[disabled]:active,.ivu-btn-text[disabled]:focus,.ivu-btn-text[disabled]:hover,fieldset[disabled] .ivu-btn-text,fieldset[disabled] .ivu-btn-text.active,fieldset[disabled] .ivu-btn-text:active,fieldset[disabled] .ivu-btn-text:focus,fieldset[disabled] .ivu-btn-text:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-text.disabled.active>a:only-child,.ivu-btn-text.disabled:active>a:only-child,.ivu-btn-text.disabled:focus>a:only-child,.ivu-btn-text.disabled:hover>a:only-child,.ivu-btn-text.disabled>a:only-child,.ivu-btn-text[disabled].active>a:only-child,.ivu-btn-text[disabled]:active>a:only-child,.ivu-btn-text[disabled]:focus>a:only-child,.ivu-btn-text[disabled]:hover>a:only-child,.ivu-btn-text[disabled]>a:only-child,fieldset[disabled] .ivu-btn-text.active>a:only-child,fieldset[disabled] .ivu-btn-text:active>a:only-child,fieldset[disabled] .ivu-btn-text:focus>a:only-child,fieldset[disabled] .ivu-btn-text:hover>a:only-child,fieldset[disabled] .ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text.disabled.active>a:only-child:after,.ivu-btn-text.disabled:active>a:only-child:after,.ivu-btn-text.disabled:focus>a:only-child:after,.ivu-btn-text.disabled:hover>a:only-child:after,.ivu-btn-text.disabled>a:only-child:after,.ivu-btn-text[disabled].active>a:only-child:after,.ivu-btn-text[disabled]:active>a:only-child:after,.ivu-btn-text[disabled]:focus>a:only-child:after,.ivu-btn-text[disabled]:hover>a:only-child:after,.ivu-btn-text[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-text.active>a:only-child:after,fieldset[disabled] .ivu-btn-text:active>a:only-child:after,fieldset[disabled] .ivu-btn-text:focus>a:only-child:after,fieldset[disabled] .ivu-btn-text:hover>a:only-child:after,fieldset[disabled] .ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.disabled,.ivu-btn-text.disabled.active,.ivu-btn-text.disabled:active,.ivu-btn-text.disabled:focus,.ivu-btn-text.disabled:hover,.ivu-btn-text[disabled],.ivu-btn-text[disabled].active,.ivu-btn-text[disabled]:active,.ivu-btn-text[disabled]:focus,.ivu-btn-text[disabled]:hover,fieldset[disabled] .ivu-btn-text,fieldset[disabled] .ivu-btn-text.active,fieldset[disabled] .ivu-btn-text:active,fieldset[disabled] .ivu-btn-text:focus,fieldset[disabled] .ivu-btn-text:hover{color:#c5c8ce;background-color:#fff;border-color:transparent}.ivu-btn-text.disabled.active>a:only-child,.ivu-btn-text.disabled:active>a:only-child,.ivu-btn-text.disabled:focus>a:only-child,.ivu-btn-text.disabled:hover>a:only-child,.ivu-btn-text.disabled>a:only-child,.ivu-btn-text[disabled].active>a:only-child,.ivu-btn-text[disabled]:active>a:only-child,.ivu-btn-text[disabled]:focus>a:only-child,.ivu-btn-text[disabled]:hover>a:only-child,.ivu-btn-text[disabled]>a:only-child,fieldset[disabled] .ivu-btn-text.active>a:only-child,fieldset[disabled] .ivu-btn-text:active>a:only-child,fieldset[disabled] .ivu-btn-text:focus>a:only-child,fieldset[disabled] .ivu-btn-text:hover>a:only-child,fieldset[disabled] .ivu-btn-text>a:only-child{color:currentColor}.ivu-btn-text.disabled.active>a:only-child:after,.ivu-btn-text.disabled:active>a:only-child:after,.ivu-btn-text.disabled:focus>a:only-child:after,.ivu-btn-text.disabled:hover>a:only-child:after,.ivu-btn-text.disabled>a:only-child:after,.ivu-btn-text[disabled].active>a:only-child:after,.ivu-btn-text[disabled]:active>a:only-child:after,.ivu-btn-text[disabled]:focus>a:only-child:after,.ivu-btn-text[disabled]:hover>a:only-child:after,.ivu-btn-text[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-text.active>a:only-child:after,fieldset[disabled] .ivu-btn-text:active>a:only-child:after,fieldset[disabled] .ivu-btn-text:focus>a:only-child:after,fieldset[disabled] .ivu-btn-text:hover>a:only-child:after,fieldset[disabled] .ivu-btn-text>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:hover{color:#57a3f3;background-color:#fff;border-color:transparent}.ivu-btn-text:hover>a:only-child{color:currentColor}.ivu-btn-text:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text.active,.ivu-btn-text:active{color:#2b85e4;background-color:#fff;border-color:transparent}.ivu-btn-text.active>a:only-child,.ivu-btn-text:active>a:only-child{color:currentColor}.ivu-btn-text.active>a:only-child:after,.ivu-btn-text:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-text:focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-btn-success{color:#fff;background-color:#19be6b;border-color:#19be6b}.ivu-btn-success>a:only-child{color:currentColor}.ivu-btn-success>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success:hover{color:#fff;background-color:#47cb89;border-color:#47cb89}.ivu-btn-success:hover>a:only-child{color:currentColor}.ivu-btn-success:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.active,.ivu-btn-success:active{color:#f2f2f2;background-color:#18b566;border-color:#18b566}.ivu-btn-success.active>a:only-child,.ivu-btn-success:active>a:only-child{color:currentColor}.ivu-btn-success.active>a:only-child:after,.ivu-btn-success:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.disabled,.ivu-btn-success.disabled.active,.ivu-btn-success.disabled:active,.ivu-btn-success.disabled:focus,.ivu-btn-success.disabled:hover,.ivu-btn-success[disabled],.ivu-btn-success[disabled].active,.ivu-btn-success[disabled]:active,.ivu-btn-success[disabled]:focus,.ivu-btn-success[disabled]:hover,fieldset[disabled] .ivu-btn-success,fieldset[disabled] .ivu-btn-success.active,fieldset[disabled] .ivu-btn-success:active,fieldset[disabled] .ivu-btn-success:focus,fieldset[disabled] .ivu-btn-success:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-success.disabled.active>a:only-child,.ivu-btn-success.disabled:active>a:only-child,.ivu-btn-success.disabled:focus>a:only-child,.ivu-btn-success.disabled:hover>a:only-child,.ivu-btn-success.disabled>a:only-child,.ivu-btn-success[disabled].active>a:only-child,.ivu-btn-success[disabled]:active>a:only-child,.ivu-btn-success[disabled]:focus>a:only-child,.ivu-btn-success[disabled]:hover>a:only-child,.ivu-btn-success[disabled]>a:only-child,fieldset[disabled] .ivu-btn-success.active>a:only-child,fieldset[disabled] .ivu-btn-success:active>a:only-child,fieldset[disabled] .ivu-btn-success:focus>a:only-child,fieldset[disabled] .ivu-btn-success:hover>a:only-child,fieldset[disabled] .ivu-btn-success>a:only-child{color:currentColor}.ivu-btn-success.disabled.active>a:only-child:after,.ivu-btn-success.disabled:active>a:only-child:after,.ivu-btn-success.disabled:focus>a:only-child:after,.ivu-btn-success.disabled:hover>a:only-child:after,.ivu-btn-success.disabled>a:only-child:after,.ivu-btn-success[disabled].active>a:only-child:after,.ivu-btn-success[disabled]:active>a:only-child:after,.ivu-btn-success[disabled]:focus>a:only-child:after,.ivu-btn-success[disabled]:hover>a:only-child:after,.ivu-btn-success[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-success.active>a:only-child:after,fieldset[disabled] .ivu-btn-success:active>a:only-child:after,fieldset[disabled] .ivu-btn-success:focus>a:only-child:after,fieldset[disabled] .ivu-btn-success:hover>a:only-child:after,fieldset[disabled] .ivu-btn-success>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-success.active,.ivu-btn-success:active,.ivu-btn-success:hover{color:#fff}.ivu-btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(25,190,107,.2);box-shadow:0 0 0 2px rgba(25,190,107,.2)}.ivu-btn-warning{color:#fff;background-color:#f90;border-color:#f90}.ivu-btn-warning>a:only-child{color:currentColor}.ivu-btn-warning>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning:hover{color:#fff;background-color:#ffad33;border-color:#ffad33}.ivu-btn-warning:hover>a:only-child{color:currentColor}.ivu-btn-warning:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.active,.ivu-btn-warning:active{color:#f2f2f2;background-color:#f29100;border-color:#f29100}.ivu-btn-warning.active>a:only-child,.ivu-btn-warning:active>a:only-child{color:currentColor}.ivu-btn-warning.active>a:only-child:after,.ivu-btn-warning:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.disabled,.ivu-btn-warning.disabled.active,.ivu-btn-warning.disabled:active,.ivu-btn-warning.disabled:focus,.ivu-btn-warning.disabled:hover,.ivu-btn-warning[disabled],.ivu-btn-warning[disabled].active,.ivu-btn-warning[disabled]:active,.ivu-btn-warning[disabled]:focus,.ivu-btn-warning[disabled]:hover,fieldset[disabled] .ivu-btn-warning,fieldset[disabled] .ivu-btn-warning.active,fieldset[disabled] .ivu-btn-warning:active,fieldset[disabled] .ivu-btn-warning:focus,fieldset[disabled] .ivu-btn-warning:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-warning.disabled.active>a:only-child,.ivu-btn-warning.disabled:active>a:only-child,.ivu-btn-warning.disabled:focus>a:only-child,.ivu-btn-warning.disabled:hover>a:only-child,.ivu-btn-warning.disabled>a:only-child,.ivu-btn-warning[disabled].active>a:only-child,.ivu-btn-warning[disabled]:active>a:only-child,.ivu-btn-warning[disabled]:focus>a:only-child,.ivu-btn-warning[disabled]:hover>a:only-child,.ivu-btn-warning[disabled]>a:only-child,fieldset[disabled] .ivu-btn-warning.active>a:only-child,fieldset[disabled] .ivu-btn-warning:active>a:only-child,fieldset[disabled] .ivu-btn-warning:focus>a:only-child,fieldset[disabled] .ivu-btn-warning:hover>a:only-child,fieldset[disabled] .ivu-btn-warning>a:only-child{color:currentColor}.ivu-btn-warning.disabled.active>a:only-child:after,.ivu-btn-warning.disabled:active>a:only-child:after,.ivu-btn-warning.disabled:focus>a:only-child:after,.ivu-btn-warning.disabled:hover>a:only-child:after,.ivu-btn-warning.disabled>a:only-child:after,.ivu-btn-warning[disabled].active>a:only-child:after,.ivu-btn-warning[disabled]:active>a:only-child:after,.ivu-btn-warning[disabled]:focus>a:only-child:after,.ivu-btn-warning[disabled]:hover>a:only-child:after,.ivu-btn-warning[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-warning.active>a:only-child:after,fieldset[disabled] .ivu-btn-warning:active>a:only-child:after,fieldset[disabled] .ivu-btn-warning:focus>a:only-child:after,fieldset[disabled] .ivu-btn-warning:hover>a:only-child:after,fieldset[disabled] .ivu-btn-warning>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-warning.active,.ivu-btn-warning:active,.ivu-btn-warning:hover{color:#fff}.ivu-btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(255,153,0,.2);box-shadow:0 0 0 2px rgba(255,153,0,.2)}.ivu-btn-error{color:#fff;background-color:#ed4014;border-color:#ed4014}.ivu-btn-error>a:only-child{color:currentColor}.ivu-btn-error>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error:hover{color:#fff;background-color:#f16643;border-color:#f16643}.ivu-btn-error:hover>a:only-child{color:currentColor}.ivu-btn-error:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.active,.ivu-btn-error:active{color:#f2f2f2;background-color:#e13d13;border-color:#e13d13}.ivu-btn-error.active>a:only-child,.ivu-btn-error:active>a:only-child{color:currentColor}.ivu-btn-error.active>a:only-child:after,.ivu-btn-error:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.disabled,.ivu-btn-error.disabled.active,.ivu-btn-error.disabled:active,.ivu-btn-error.disabled:focus,.ivu-btn-error.disabled:hover,.ivu-btn-error[disabled],.ivu-btn-error[disabled].active,.ivu-btn-error[disabled]:active,.ivu-btn-error[disabled]:focus,.ivu-btn-error[disabled]:hover,fieldset[disabled] .ivu-btn-error,fieldset[disabled] .ivu-btn-error.active,fieldset[disabled] .ivu-btn-error:active,fieldset[disabled] .ivu-btn-error:focus,fieldset[disabled] .ivu-btn-error:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-error.disabled.active>a:only-child,.ivu-btn-error.disabled:active>a:only-child,.ivu-btn-error.disabled:focus>a:only-child,.ivu-btn-error.disabled:hover>a:only-child,.ivu-btn-error.disabled>a:only-child,.ivu-btn-error[disabled].active>a:only-child,.ivu-btn-error[disabled]:active>a:only-child,.ivu-btn-error[disabled]:focus>a:only-child,.ivu-btn-error[disabled]:hover>a:only-child,.ivu-btn-error[disabled]>a:only-child,fieldset[disabled] .ivu-btn-error.active>a:only-child,fieldset[disabled] .ivu-btn-error:active>a:only-child,fieldset[disabled] .ivu-btn-error:focus>a:only-child,fieldset[disabled] .ivu-btn-error:hover>a:only-child,fieldset[disabled] .ivu-btn-error>a:only-child{color:currentColor}.ivu-btn-error.disabled.active>a:only-child:after,.ivu-btn-error.disabled:active>a:only-child:after,.ivu-btn-error.disabled:focus>a:only-child:after,.ivu-btn-error.disabled:hover>a:only-child:after,.ivu-btn-error.disabled>a:only-child:after,.ivu-btn-error[disabled].active>a:only-child:after,.ivu-btn-error[disabled]:active>a:only-child:after,.ivu-btn-error[disabled]:focus>a:only-child:after,.ivu-btn-error[disabled]:hover>a:only-child:after,.ivu-btn-error[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-error.active>a:only-child:after,fieldset[disabled] .ivu-btn-error:active>a:only-child:after,fieldset[disabled] .ivu-btn-error:focus>a:only-child:after,fieldset[disabled] .ivu-btn-error:hover>a:only-child:after,fieldset[disabled] .ivu-btn-error>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-error.active,.ivu-btn-error:active,.ivu-btn-error:hover{color:#fff}.ivu-btn-error:focus{-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-btn-info{color:#fff;background-color:#2db7f5;border-color:#2db7f5}.ivu-btn-info>a:only-child{color:currentColor}.ivu-btn-info>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info:hover{color:#fff;background-color:#57c5f7;border-color:#57c5f7}.ivu-btn-info:hover>a:only-child{color:currentColor}.ivu-btn-info:hover>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.active,.ivu-btn-info:active{color:#f2f2f2;background-color:#2baee9;border-color:#2baee9}.ivu-btn-info.active>a:only-child,.ivu-btn-info:active>a:only-child{color:currentColor}.ivu-btn-info.active>a:only-child:after,.ivu-btn-info:active>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.disabled,.ivu-btn-info.disabled.active,.ivu-btn-info.disabled:active,.ivu-btn-info.disabled:focus,.ivu-btn-info.disabled:hover,.ivu-btn-info[disabled],.ivu-btn-info[disabled].active,.ivu-btn-info[disabled]:active,.ivu-btn-info[disabled]:focus,.ivu-btn-info[disabled]:hover,fieldset[disabled] .ivu-btn-info,fieldset[disabled] .ivu-btn-info.active,fieldset[disabled] .ivu-btn-info:active,fieldset[disabled] .ivu-btn-info:focus,fieldset[disabled] .ivu-btn-info:hover{color:#c5c8ce;background-color:#f7f7f7;border-color:#dcdee2}.ivu-btn-info.disabled.active>a:only-child,.ivu-btn-info.disabled:active>a:only-child,.ivu-btn-info.disabled:focus>a:only-child,.ivu-btn-info.disabled:hover>a:only-child,.ivu-btn-info.disabled>a:only-child,.ivu-btn-info[disabled].active>a:only-child,.ivu-btn-info[disabled]:active>a:only-child,.ivu-btn-info[disabled]:focus>a:only-child,.ivu-btn-info[disabled]:hover>a:only-child,.ivu-btn-info[disabled]>a:only-child,fieldset[disabled] .ivu-btn-info.active>a:only-child,fieldset[disabled] .ivu-btn-info:active>a:only-child,fieldset[disabled] .ivu-btn-info:focus>a:only-child,fieldset[disabled] .ivu-btn-info:hover>a:only-child,fieldset[disabled] .ivu-btn-info>a:only-child{color:currentColor}.ivu-btn-info.disabled.active>a:only-child:after,.ivu-btn-info.disabled:active>a:only-child:after,.ivu-btn-info.disabled:focus>a:only-child:after,.ivu-btn-info.disabled:hover>a:only-child:after,.ivu-btn-info.disabled>a:only-child:after,.ivu-btn-info[disabled].active>a:only-child:after,.ivu-btn-info[disabled]:active>a:only-child:after,.ivu-btn-info[disabled]:focus>a:only-child:after,.ivu-btn-info[disabled]:hover>a:only-child:after,.ivu-btn-info[disabled]>a:only-child:after,fieldset[disabled] .ivu-btn-info.active>a:only-child:after,fieldset[disabled] .ivu-btn-info:active>a:only-child:after,fieldset[disabled] .ivu-btn-info:focus>a:only-child:after,fieldset[disabled] .ivu-btn-info:hover>a:only-child:after,fieldset[disabled] .ivu-btn-info>a:only-child:after{content:'';position:absolute;top:0;left:0;bottom:0;right:0;background:0 0}.ivu-btn-info.active,.ivu-btn-info:active,.ivu-btn-info:hover{color:#fff}.ivu-btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(45,183,245,.2);box-shadow:0 0 0 2px rgba(45,183,245,.2)}.ivu-btn-circle,.ivu-btn-circle-outline{border-radius:32px}.ivu-btn-circle-outline.ivu-btn-large,.ivu-btn-circle.ivu-btn-large{border-radius:36px}.ivu-btn-circle-outline.ivu-btn-size,.ivu-btn-circle.ivu-btn-size{border-radius:24px}.ivu-btn-circle-outline.ivu-btn-icon-only,.ivu-btn-circle.ivu-btn-icon-only{width:32px;height:32px;padding:0;font-size:16px;border-radius:50%}.ivu-btn-circle-outline.ivu-btn-icon-only.ivu-btn-large,.ivu-btn-circle.ivu-btn-icon-only.ivu-btn-large{width:36px;height:36px;padding:0;font-size:16px;border-radius:50%}.ivu-btn-circle-outline.ivu-btn-icon-only.ivu-btn-small,.ivu-btn-circle.ivu-btn-icon-only.ivu-btn-small{width:24px;height:24px;padding:0;font-size:14px;border-radius:50%}.ivu-btn:before{position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;background:#fff;opacity:.35;content:'';border-radius:inherit;z-index:1;-webkit-transition:opacity .2s;transition:opacity .2s;pointer-events:none;display:none}.ivu-btn.ivu-btn-loading{pointer-events:none;position:relative}.ivu-btn.ivu-btn-loading:before{display:block}.ivu-btn-group{position:relative;display:inline-block;vertical-align:middle}.ivu-btn-group>.ivu-btn{position:relative;float:left}.ivu-btn-group>.ivu-btn.active,.ivu-btn-group>.ivu-btn:active,.ivu-btn-group>.ivu-btn:hover{z-index:2}.ivu-btn-group .ivu-btn-icon-only .ivu-icon{font-size:13px;position:relative}.ivu-btn-group-large .ivu-btn-icon-only .ivu-icon{font-size:15px}.ivu-btn-group-small .ivu-btn-icon-only .ivu-icon{font-size:12px}.ivu-btn-group-circle .ivu-btn{border-radius:32px}.ivu-btn-group-large.ivu-btn-group-circle .ivu-btn{border-radius:36px}.ivu-btn-group-large>.ivu-btn{padding:6px 15px 6px 15px;font-size:14px;border-radius:4px}.ivu-btn-group-small.ivu-btn-group-circle .ivu-btn{border-radius:24px}.ivu-btn-group-small>.ivu-btn{padding:1px 7px 2px;font-size:12px;border-radius:3px}.ivu-btn-group-small>.ivu-btn>.ivu-icon{font-size:12px}.ivu-btn+.ivu-btn-group,.ivu-btn-group .ivu-btn+.ivu-btn,.ivu-btn-group+.ivu-btn,.ivu-btn-group+.ivu-btn-group{margin-left:-1px}.ivu-btn-group .ivu-btn:not(:first-child):not(:last-child){border-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:first-child{margin-left:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.ivu-btn-group>.ivu-btn-group{float:left}.ivu-btn-group>.ivu-btn-group:not(:first-child):not(:last-child)>.ivu-btn{border-radius:0}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn-group:first-child:not(:last-child)>.ivu-btn:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ivu-btn-group:not(.ivu-btn-group-vertical)>.ivu-btn-group:last-child:not(:first-child)>.ivu-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ivu-btn-group-vertical{display:inline-block;vertical-align:middle}.ivu-btn-group-vertical>.ivu-btn{display:block;width:100%;max-width:100%;float:none}.ivu-btn+.ivu-btn-group-vertical,.ivu-btn-group-vertical .ivu-btn+.ivu-btn,.ivu-btn-group-vertical+.ivu-btn,.ivu-btn-group-vertical+.ivu-btn-group-vertical{margin-top:-1px;margin-left:0}.ivu-btn-group-vertical>.ivu-btn:first-child{margin-top:0}.ivu-btn-group-vertical>.ivu-btn:first-child:not(:last-child){border-bottom-left-radius:0;border-bottom-right-radius:0}.ivu-btn-group-vertical>.ivu-btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.ivu-btn-group-vertical>.ivu-btn-group-vertical:first-child:not(:last-child)>.ivu-btn:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0;padding-bottom:8px}.ivu-btn-group-vertical>.ivu-btn-group-vertical:last-child:not(:first-child)>.ivu-btn:first-child{border-bottom-right-radius:0;border-bottom-left-radius:0;padding-top:8px}.ivu-btn-ghost{color:#fff;background:0 0}.ivu-btn-ghost:hover{background:0 0}.ivu-btn-ghost.ivu-btn-dashed,.ivu-btn-ghost.ivu-btn-default{color:#fff;border-color:#fff}.ivu-btn-ghost.ivu-btn-dashed:hover,.ivu-btn-ghost.ivu-btn-default:hover{color:#57a3f3;border-color:#57a3f3}.ivu-btn-ghost.ivu-btn-primary{color:#2d8cf0}.ivu-btn-ghost.ivu-btn-primary:hover{color:#57a3f3;background:rgba(245,249,254,.5)}.ivu-btn-ghost.ivu-btn-info{color:#2db7f5}.ivu-btn-ghost.ivu-btn-info:hover{color:#57c5f7;background:rgba(245,251,254,.5)}.ivu-btn-ghost.ivu-btn-success{color:#19be6b}.ivu-btn-ghost.ivu-btn-success:hover{color:#47cb89;background:rgba(244,252,248,.5)}.ivu-btn-ghost.ivu-btn-warning{color:#f90}.ivu-btn-ghost.ivu-btn-warning:hover{color:#ffad33;background:rgba(255,250,242,.5)}.ivu-btn-ghost.ivu-btn-error{color:#ed4014}.ivu-btn-ghost.ivu-btn-error:hover{color:#f16643;background:rgba(254,245,243,.5)}.ivu-btn-ghost.ivu-btn-dashed[disabled],.ivu-btn-ghost.ivu-btn-default[disabled],.ivu-btn-ghost.ivu-btn-error[disabled],.ivu-btn-ghost.ivu-btn-info[disabled],.ivu-btn-ghost.ivu-btn-primary[disabled],.ivu-btn-ghost.ivu-btn-success[disabled],.ivu-btn-ghost.ivu-btn-warning[disabled]{background:0 0;color:rgba(0,0,0,.25);border-color:#dcdee2}.ivu-btn-ghost.ivu-btn-text[disabled]{background:0 0;color:rgba(0,0,0,.25)}.ivu-affix{position:fixed;z-index:10}.ivu-back-top{z-index:10;position:fixed;cursor:pointer;display:none}.ivu-back-top.ivu-back-top-show{display:block}.ivu-back-top-inner{background-color:rgba(0,0,0,.6);border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-back-top-inner:hover{background-color:rgba(0,0,0,.7)}.ivu-back-top i{color:#fff;font-size:24px;padding:8px 12px}.ivu-badge{position:relative;display:inline-block}.ivu-badge-count{font-family:\"Monospaced Number\";line-height:1;vertical-align:middle;position:absolute;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);top:-10px;right:0;height:20px;border-radius:10px;min-width:20px;background:#ed4014;border:1px solid transparent;color:#fff;line-height:18px;text-align:center;padding:0 6px;font-size:12px;white-space:nowrap;-webkit-transform-origin:-10% center;-ms-transform-origin:-10% center;transform-origin:-10% center;z-index:10;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ivu-badge-count a,.ivu-badge-count a:hover{color:#fff}.ivu-badge-count-alone{top:auto;display:block;position:relative;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.ivu-badge-count-primary{background:#2d8cf0}.ivu-badge-count-success{background:#19be6b}.ivu-badge-count-error{background:#ed4014}.ivu-badge-count-warning{background:#f90}.ivu-badge-count-info{background:#2db7f5}.ivu-badge-count-normal{background:#e6ebf1;color:#808695}.ivu-badge-dot{position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center;top:-4px;right:-8px;height:8px;width:8px;border-radius:100%;background:#ed4014;z-index:10;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ivu-badge-status{line-height:inherit;vertical-align:baseline}.ivu-badge-status-dot{width:6px;height:6px;display:inline-block;border-radius:50%;vertical-align:middle;position:relative;top:-1px}.ivu-badge-status-success{background-color:#19be6b}.ivu-badge-status-processing{background-color:#2d8cf0;position:relative}.ivu-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:50%;border:1px solid #2d8cf0;content:'';-webkit-animation:aniStatusProcessing 1.2s infinite ease-in-out;animation:aniStatusProcessing 1.2s infinite ease-in-out}.ivu-badge-status-default{background-color:#e6ebf1}.ivu-badge-status-error{background-color:#ed4014}.ivu-badge-status-warning{background-color:#f90}.ivu-badge-status-text{display:inline-block;color:#515a6e;font-size:12px;margin-left:6px}@-webkit-keyframes aniStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}100%{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}@keyframes aniStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}100%{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}.ivu-chart-circle{display:inline-block;position:relative}.ivu-chart-circle-inner{width:100%;text-align:center;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);line-height:1}.ivu-spin{color:#2d8cf0;vertical-align:middle;text-align:center}.ivu-spin-dot{position:relative;display:block;border-radius:50%;background-color:#2d8cf0;width:20px;height:20px;-webkit-animation:ani-spin-bounce 1s 0s ease-in-out infinite;animation:ani-spin-bounce 1s 0s ease-in-out infinite}.ivu-spin-large .ivu-spin-dot{width:32px;height:32px}.ivu-spin-small .ivu-spin-dot{width:12px;height:12px}.ivu-spin-fix{position:absolute;top:0;left:0;z-index:8;width:100%;height:100%;background-color:rgba(255,255,255,.9)}.ivu-spin-fullscreen{z-index:2010}.ivu-spin-fullscreen-wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.ivu-spin-fix .ivu-spin-main{position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ivu-spin-fix .ivu-spin-dot{display:inline-block}.ivu-spin-show-text .ivu-spin-dot,.ivu-spin-text{display:none}.ivu-spin-show-text .ivu-spin-text{display:block}.ivu-table-wrapper>.ivu-spin-fix{border:1px solid #dcdee2;border-top:0;border-left:0}@-webkit-keyframes ani-spin-bounce{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes ani-spin-bounce{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.ivu-alert{position:relative;padding:8px 48px 8px 16px;border-radius:4px;color:#515a6e;font-size:12px;line-height:16px;margin-bottom:10px}.ivu-alert.ivu-alert-with-icon{padding:8px 48px 8px 38px}.ivu-alert-icon{font-size:16px;top:6px;left:12px;position:absolute}.ivu-alert-desc{font-size:12px;color:#515a6e;line-height:21px;display:none;text-align:justify}.ivu-alert-success{border:1px solid #8ce6b0;background-color:#edfff3}.ivu-alert-success .ivu-alert-icon{color:#19be6b}.ivu-alert-info{border:1px solid #abdcff;background-color:#f0faff}.ivu-alert-info .ivu-alert-icon{color:#2d8cf0}.ivu-alert-warning{border:1px solid #ffd77a;background-color:#fff9e6}.ivu-alert-warning .ivu-alert-icon{color:#f90}.ivu-alert-error{border:1px solid #ffb08f;background-color:#ffefe6}.ivu-alert-error .ivu-alert-icon{color:#ed4014}.ivu-alert-close{font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-alert-close .ivu-icon-ios-close{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-alert-close .ivu-icon-ios-close:hover{color:#444}.ivu-alert-with-desc{padding:16px;position:relative;border-radius:4px;margin-bottom:10px;color:#515a6e;line-height:1.5}.ivu-alert-with-desc.ivu-alert-with-icon{padding:16px 16px 16px 69px}.ivu-alert-with-desc .ivu-alert-desc{display:block}.ivu-alert-with-desc .ivu-alert-message{font-size:14px;color:#17233d;display:block}.ivu-alert-with-desc .ivu-alert-icon{top:50%;left:24px;margin-top:-24px;font-size:28px}.ivu-alert-with-banner{border-radius:0}.ivu-collapse{background-color:#f7f7f7;border-radius:3px;border:1px solid #dcdee2}.ivu-collapse-simple{border-left:none;border-right:none;background-color:#fff;border-radius:0}.ivu-collapse>.ivu-collapse-item{border-top:1px solid #dcdee2}.ivu-collapse>.ivu-collapse-item:first-child{border-top:0}.ivu-collapse>.ivu-collapse-item>.ivu-collapse-header{height:38px;line-height:38px;padding-left:16px;color:#666;cursor:pointer;position:relative;border-bottom:1px solid transparent;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-collapse>.ivu-collapse-item>.ivu-collapse-header>i{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;margin-right:14px}.ivu-collapse>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header{border-bottom:1px solid #dcdee2}.ivu-collapse-simple>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header{border-bottom:1px solid transparent}.ivu-collapse>.ivu-collapse-item.ivu-collapse-item-active>.ivu-collapse-header>i{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-collapse-content{color:#515a6e;padding:0 16px;background-color:#fff}.ivu-collapse-content>.ivu-collapse-content-box{padding-top:16px;padding-bottom:16px}.ivu-collapse-simple>.ivu-collapse-item>.ivu-collapse-content>.ivu-collapse-content-box{padding-top:0}.ivu-collapse-item:last-child>.ivu-collapse-content{border-radius:0 0 3px 3px}.ivu-card{background:#fff;border-radius:4px;font-size:14px;position:relative;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-card-bordered{border:1px solid #dcdee2;border-color:#e8eaec}.ivu-card-shadow{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.ivu-card:hover{-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);border-color:#eee}.ivu-card.ivu-card-dis-hover:hover{-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ivu-card.ivu-card-dis-hover.ivu-card-bordered:hover{border-color:#e8eaec}.ivu-card.ivu-card-shadow:hover{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.ivu-card-head{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-card-head p,.ivu-card-head-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:14px;color:#17233d;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-card-head p i,.ivu-card-head p span{vertical-align:middle}.ivu-card-extra{position:absolute;right:16px;top:14px}.ivu-card-body{padding:16px}.ivu-message{font-size:14px;position:fixed;z-index:1010;width:100%;top:16px;left:0;pointer-events:none}.ivu-message-notice{padding:8px;text-align:center;-webkit-transition:height .3s ease-in-out,padding .3s ease-in-out;transition:height .3s ease-in-out,padding .3s ease-in-out}.ivu-message-notice:first-child{margin-top:-8px}.ivu-message-notice-close{position:absolute;right:4px;top:10px;color:#999;outline:0}.ivu-message-notice-close i.ivu-icon{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-message-notice-close i.ivu-icon:hover{color:#444}.ivu-message-notice-content{display:inline-block;pointer-events:all;padding:8px 16px;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;position:relative}.ivu-message-notice-content-text{display:inline-block}.ivu-message-notice-closable .ivu-message-notice-content-text{padding-right:32px}.ivu-message-success .ivu-icon{color:#19be6b}.ivu-message-error .ivu-icon{color:#ed4014}.ivu-message-warning .ivu-icon{color:#f90}.ivu-message-info .ivu-icon,.ivu-message-loading .ivu-icon{color:#2d8cf0}.ivu-message .ivu-icon{margin-right:4px;font-size:16px;vertical-align:middle}.ivu-message-custom-content span{vertical-align:middle}.ivu-notice{width:335px;margin-right:24px;position:fixed;z-index:1010}.ivu-notice-content-with-icon{margin-left:51px}.ivu-notice-with-desc.ivu-notice-with-icon .ivu-notice-title{margin-left:51px}.ivu-notice-notice{margin-bottom:10px;padding:16px;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);background:#fff;line-height:1;position:relative;overflow:hidden}.ivu-notice-notice-close{position:absolute;right:8px;top:15px;color:#999;outline:0}.ivu-notice-notice-close i{font-size:22px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:-3px}.ivu-notice-notice-close i:hover{color:#444}.ivu-notice-notice-content-with-render .ivu-notice-desc{display:none}.ivu-notice-notice-with-desc .ivu-notice-notice-close{top:11px}.ivu-notice-content-with-render-notitle{margin-left:26px}.ivu-notice-title{font-size:14px;line-height:17px;color:#17233d;padding-right:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-notice-with-desc .ivu-notice-title{font-weight:700;margin-bottom:8px}.ivu-notice-desc{font-size:12px;color:#515a6e;text-align:justify;line-height:1.5}.ivu-notice-with-desc.ivu-notice-with-icon .ivu-notice-desc{margin-left:51px}.ivu-notice-with-icon .ivu-notice-title{margin-left:26px}.ivu-notice-icon{position:absolute;top:-2px;font-size:16px}.ivu-notice-icon-success{color:#19be6b}.ivu-notice-icon-info{color:#2d8cf0}.ivu-notice-icon-warning{color:#f90}.ivu-notice-icon-error{color:#ed4014}.ivu-notice-with-desc .ivu-notice-icon{font-size:36px;top:-6px}.ivu-notice-custom-content{position:relative}.ivu-radio-focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2);z-index:1}.ivu-radio-group{display:inline-block;font-size:12px;vertical-align:middle}.ivu-radio-group-vertical .ivu-radio-wrapper{display:block;height:30px;line-height:30px}.ivu-radio-wrapper{font-size:12px;vertical-align:middle;display:inline-block;position:relative;white-space:nowrap;margin-right:8px;cursor:pointer}.ivu-radio-wrapper-disabled{cursor:not-allowed}.ivu-radio{display:inline-block;margin-right:4px;white-space:nowrap;position:relative;line-height:1;vertical-align:middle;cursor:pointer}.ivu-radio:hover .ivu-radio-inner{border-color:#bcbcbc}.ivu-radio-inner{display:inline-block;width:14px;height:14px;position:relative;top:0;left:0;background-color:#fff;border:1px solid #dcdee2;border-radius:50%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-inner:after{position:absolute;width:8px;height:8px;left:2px;top:2px;border-radius:6px;display:table;border-top:0;border-left:0;content:' ';background-color:#2d8cf0;opacity:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.ivu-radio-large{font-size:14px}.ivu-radio-large .ivu-radio-inner{width:16px;height:16px}.ivu-radio-large .ivu-radio-inner:after{width:10px;height:10px}.ivu-radio-large .ivu-radio-wrapper,.ivu-radio-large.ivu-radio-wrapper{font-size:14px}.ivu-radio-small .ivu-radio-inner{width:12px;height:12px}.ivu-radio-small .ivu-radio-inner:after{width:6px;height:6px}.ivu-radio-input{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;opacity:0;cursor:pointer}.ivu-radio-checked .ivu-radio-inner{border-color:#2d8cf0}.ivu-radio-checked .ivu-radio-inner:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-checked:hover .ivu-radio-inner{border-color:#2d8cf0}.ivu-radio-disabled{cursor:not-allowed}.ivu-radio-disabled .ivu-radio-input{cursor:not-allowed}.ivu-radio-disabled:hover .ivu-radio-inner{border-color:#dcdee2}.ivu-radio-disabled .ivu-radio-inner{border-color:#dcdee2;background-color:#f3f3f3}.ivu-radio-disabled .ivu-radio-inner:after{background-color:#ccc}.ivu-radio-disabled .ivu-radio-disabled+span{color:#ccc}span.ivu-radio+*{margin-left:2px;margin-right:2px}.ivu-radio-group-button{font-size:0;-webkit-text-size-adjust:none}.ivu-radio-group-button .ivu-radio{width:0;margin-right:0}.ivu-radio-group-button .ivu-radio-wrapper{display:inline-block;height:32px;line-height:30px;margin:0;padding:0 15px;font-size:12px;color:#515a6e;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border:1px solid #dcdee2;border-left:0;background:#fff;position:relative}.ivu-radio-group-button .ivu-radio-wrapper>span{margin-left:0}.ivu-radio-group-button .ivu-radio-wrapper:after,.ivu-radio-group-button .ivu-radio-wrapper:before{content:'';display:block;position:absolute;width:1px;height:100%;left:-1px;top:0;background:#dcdee2;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-group-button .ivu-radio-wrapper:after{height:36px;left:-1px;top:-3px;background:rgba(45,140,240,.2);opacity:0}.ivu-radio-group-button .ivu-radio-wrapper:first-child{border-radius:4px 0 0 4px;border-left:1px solid #dcdee2}.ivu-radio-group-button .ivu-radio-wrapper:first-child:after,.ivu-radio-group-button .ivu-radio-wrapper:first-child:before{display:none}.ivu-radio-group-button .ivu-radio-wrapper:last-child{border-radius:0 4px 4px 0}.ivu-radio-group-button .ivu-radio-wrapper:first-child:last-child{border-radius:4px}.ivu-radio-group-button .ivu-radio-wrapper:hover{position:relative;color:#2d8cf0}.ivu-radio-group-button .ivu-radio-wrapper:hover .ivu-radio{background-color:#000}.ivu-radio-group-button .ivu-radio-wrapper .ivu-radio-inner,.ivu-radio-group-button .ivu-radio-wrapper input{opacity:0;width:0;height:0}.ivu-radio-group-button .ivu-radio-wrapper-checked{background:#fff;border-color:#2d8cf0;color:#2d8cf0;-webkit-box-shadow:-1px 0 0 0 #2d8cf0;box-shadow:-1px 0 0 0 #2d8cf0;z-index:1}.ivu-radio-group-button .ivu-radio-wrapper-checked:before{background:#2d8cf0;opacity:.1}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus{-webkit-box-shadow:-1px 0 0 0 #2d8cf0,0 0 0 2px rgba(45,140,240,.2);box-shadow:-1px 0 0 0 #2d8cf0,0 0 0 2px rgba(45,140,240,.2);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus:after{left:-3px;top:-3px;opacity:1;background:rgba(45,140,240,.2)}.ivu-radio-group-button .ivu-radio-wrapper-checked.ivu-radio-focus:first-child{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-radio-group-button .ivu-radio-wrapper-checked:first-child{border-color:#2d8cf0;-webkit-box-shadow:none;box-shadow:none}.ivu-radio-group-button .ivu-radio-wrapper-checked:hover{border-color:#57a3f3;color:#57a3f3}.ivu-radio-group-button .ivu-radio-wrapper-checked:active{border-color:#2b85e4;color:#2b85e4}.ivu-radio-group-button .ivu-radio-wrapper-disabled{border-color:#dcdee2;background-color:#f7f7f7;cursor:not-allowed;color:#ccc}.ivu-radio-group-button .ivu-radio-wrapper-disabled:first-child,.ivu-radio-group-button .ivu-radio-wrapper-disabled:hover{border-color:#dcdee2;background-color:#f7f7f7;color:#ccc}.ivu-radio-group-button .ivu-radio-wrapper-disabled:first-child{border-left-color:#dcdee2}.ivu-radio-group-button .ivu-radio-wrapper-disabled.ivu-radio-wrapper-checked{color:#fff;background-color:#e6e6e6;border-color:#dcdee2;-webkit-box-shadow:none!important;box-shadow:none!important}.ivu-radio-group-button.ivu-radio-group-large .ivu-radio-wrapper{height:36px;line-height:34px;font-size:14px}.ivu-radio-group-button.ivu-radio-group-large .ivu-radio-wrapper:after{height:40px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper{height:24px;line-height:22px;padding:0 12px;font-size:12px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:after{height:28px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:first-child{border-radius:3px 0 0 3px}.ivu-radio-group-button.ivu-radio-group-small .ivu-radio-wrapper:last-child{border-radius:0 3px 3px 0}.ivu-checkbox-focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2);z-index:1}.ivu-checkbox{display:inline-block;vertical-align:middle;white-space:nowrap;cursor:pointer;line-height:1;position:relative}.ivu-checkbox-disabled{cursor:not-allowed}.ivu-checkbox:hover .ivu-checkbox-inner{border-color:#bcbcbc}.ivu-checkbox-inner{display:inline-block;width:14px;height:14px;position:relative;top:0;left:0;border:1px solid #dcdee2;border-radius:2px;background-color:#fff;-webkit-transition:border-color .2s ease-in-out,background-color .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,box-shadow .2s ease-in-out;transition:border-color .2s ease-in-out,background-color .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-checkbox-inner:after{content:'';display:table;width:4px;height:8px;position:absolute;top:1px;left:4px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-checkbox-large .ivu-checkbox-inner{width:16px;height:16px}.ivu-checkbox-large .ivu-checkbox-inner:after{width:5px;height:9px}.ivu-checkbox-small{font-size:12px}.ivu-checkbox-small .ivu-checkbox-inner{width:12px;height:12px}.ivu-checkbox-small .ivu-checkbox-inner:after{top:0;left:3px}.ivu-checkbox-input{width:100%;height:100%;position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;cursor:pointer;opacity:0}.ivu-checkbox-input[disabled]{cursor:not-allowed}.ivu-checkbox-checked:hover .ivu-checkbox-inner{border-color:#2d8cf0}.ivu-checkbox-checked .ivu-checkbox-inner{border-color:#2d8cf0;background-color:#2d8cf0}.ivu-checkbox-checked .ivu-checkbox-inner:after{content:'';display:table;width:4px;height:8px;position:absolute;top:1px;left:4px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-checkbox-large .ivu-checkbox-checked .ivu-checkbox-inner:after{width:5px;height:9px}.ivu-checkbox-small .ivu-checkbox-checked .ivu-checkbox-inner:after{top:0;left:3px}.ivu-checkbox-disabled.ivu-checkbox-checked:hover .ivu-checkbox-inner{border-color:#dcdee2}.ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner{background-color:#f3f3f3;border-color:#dcdee2}.ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#ccc}.ivu-checkbox-disabled:hover .ivu-checkbox-inner{border-color:#dcdee2}.ivu-checkbox-disabled .ivu-checkbox-inner{border-color:#dcdee2;background-color:#f3f3f3}.ivu-checkbox-disabled .ivu-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f3f3f3}.ivu-checkbox-disabled .ivu-checkbox-inner-input{cursor:default}.ivu-checkbox-disabled+span{color:#ccc;cursor:not-allowed}.ivu-checkbox-indeterminate .ivu-checkbox-inner:after{content:'';width:8px;height:1px;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:5px}.ivu-checkbox-indeterminate:hover .ivu-checkbox-inner{border-color:#2d8cf0}.ivu-checkbox-indeterminate .ivu-checkbox-inner{background-color:#2d8cf0;border-color:#2d8cf0}.ivu-checkbox-indeterminate.ivu-checkbox-disabled .ivu-checkbox-inner{background-color:#f3f3f3;border-color:#dcdee2}.ivu-checkbox-indeterminate.ivu-checkbox-disabled .ivu-checkbox-inner:after{border-color:#c5c8ce}.ivu-checkbox-large .ivu-checkbox-indeterminate .ivu-checkbox-inner:after{width:10px;top:6px}.ivu-checkbox-small .ivu-checkbox-indeterminate .ivu-checkbox-inner:after{width:6px;top:4px}.ivu-checkbox-wrapper{cursor:pointer;font-size:12px;display:inline-block;margin-right:8px}.ivu-checkbox-wrapper-disabled{cursor:not-allowed}.ivu-checkbox-wrapper.ivu-checkbox-large{font-size:14px}.ivu-checkbox+span,.ivu-checkbox-wrapper+span{margin-right:4px}.ivu-checkbox-group{font-size:14px}.ivu-checkbox-group-item{display:inline-block}.ivu-switch{display:inline-block;width:44px;height:22px;line-height:20px;border-radius:22px;vertical-align:middle;border:1px solid #ccc;background-color:#ccc;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-switch-loading{opacity:.4}.ivu-switch-inner{color:#fff;font-size:12px;position:absolute;left:23px}.ivu-switch-inner i{width:12px;height:12px;text-align:center;position:relative;top:-1px}.ivu-switch:after{content:'';width:18px;height:18px;border-radius:18px;background-color:#fff;position:absolute;left:1px;top:1px;cursor:pointer;-webkit-transition:left .2s ease-in-out,width .2s ease-in-out;transition:left .2s ease-in-out,width .2s ease-in-out}.ivu-switch:active:after{width:26px}.ivu-switch:before{content:'';display:none;width:14px;height:14px;border-radius:50%;background-color:transparent;position:absolute;left:3px;top:3px;z-index:1;border:1px solid #2d8cf0;border-color:transparent transparent transparent #2d8cf0;-webkit-animation:switch-loading 1s linear;animation:switch-loading 1s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.ivu-switch-loading:before{display:block}.ivu-switch:focus{-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2);outline:0}.ivu-switch:focus:hover{-webkit-box-shadow:none;box-shadow:none}.ivu-switch-small{width:28px;height:16px;line-height:14px}.ivu-switch-small:after{width:12px;height:12px}.ivu-switch-small:active:after{width:14px}.ivu-switch-small:before{width:10px;height:10px;left:2px;top:2px}.ivu-switch-small.ivu-switch-checked:after{left:13px}.ivu-switch-small.ivu-switch-checked:before{left:14px}.ivu-switch-small:active.ivu-switch-checked:after{left:11px}.ivu-switch-large{width:56px}.ivu-switch-large:active:after{width:26px}.ivu-switch-large:active:after{width:30px}.ivu-switch-large.ivu-switch-checked:after{left:35px}.ivu-switch-large.ivu-switch-checked:before{left:37px}.ivu-switch-large:active.ivu-switch-checked:after{left:23px}.ivu-switch-checked{border-color:#2d8cf0;background-color:#2d8cf0}.ivu-switch-checked .ivu-switch-inner{left:7px}.ivu-switch-checked:after{left:23px}.ivu-switch-checked:before{left:25px}.ivu-switch-checked:active:after{left:15px}.ivu-switch-disabled{cursor:not-allowed;background:#f3f3f3;border-color:#f3f3f3}.ivu-switch-disabled:after{background:#ccc;cursor:not-allowed}.ivu-switch-disabled .ivu-switch-inner{color:#ccc}@-webkit-keyframes switch-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes switch-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ivu-input-number{display:inline-block;width:100%;line-height:1.5;padding:4px 7px;font-size:12px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;margin:0;padding:0;width:80px;height:32px;line-height:32px;vertical-align:middle;border:1px solid #dcdee2;border-radius:4px;overflow:hidden}.ivu-input-number::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-input-number:-ms-input-placeholder{color:#c5c8ce}.ivu-input-number::-webkit-input-placeholder{color:#c5c8ce}.ivu-input-number:hover{border-color:#57a3f3}.ivu-input-number:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-input-number[disabled],fieldset[disabled] .ivu-input-number{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number[disabled]:hover,fieldset[disabled] .ivu-input-number:hover{border-color:#e3e5e8}textarea.ivu-input-number{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-input-number-large{font-size:14px;padding:6px 7px;height:36px}.ivu-input-number-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-input-number-handler-wrap{width:22px;height:100%;border-left:1px solid #dcdee2;border-radius:0 4px 4px 0;background:#fff;position:absolute;top:0;right:0;opacity:0;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.ivu-input-number:hover .ivu-input-number-handler-wrap{opacity:1}.ivu-input-number-handler-up{cursor:pointer}.ivu-input-number-handler-up-inner{top:1px}.ivu-input-number-handler-down{border-top:1px solid #dcdee2;top:-1px;cursor:pointer}.ivu-input-number-handler{display:block;width:100%;height:16px;line-height:0;text-align:center;overflow:hidden;color:#999;position:relative}.ivu-input-number-handler:hover .ivu-input-number-handler-down-inner,.ivu-input-number-handler:hover .ivu-input-number-handler-up-inner{color:#57a3f3}.ivu-input-number-handler-down-inner,.ivu-input-number-handler-up-inner{width:12px;height:12px;line-height:12px;font-size:14px;color:#999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:5px;-webkit-transition:all .2s linear;transition:all .2s linear}.ivu-input-number:hover{border-color:#57a3f3}.ivu-input-number-focused{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-input-number-disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number-disabled:hover{border-color:#e3e5e8}.ivu-input-number-input-wrap{overflow:hidden;height:32px}.ivu-input-number-input{width:100%;height:32px;line-height:32px;padding:0 7px;text-align:left;outline:0;-moz-appearance:textfield;color:#666;border:0;border-radius:4px;-webkit-transition:all .2s linear;transition:all .2s linear}.ivu-input-number-input[disabled]{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input-number-input[disabled]:hover{border-color:#e3e5e8}.ivu-input-number-large{padding:0}.ivu-input-number-large .ivu-input-number-input-wrap{height:36px}.ivu-input-number-large .ivu-input-number-handler{height:18px}.ivu-input-number-large input{height:36px;line-height:36px}.ivu-input-number-large .ivu-input-number-handler-up-inner{top:2px}.ivu-input-number-large .ivu-input-number-handler-down-inner{bottom:2px}.ivu-input-number-small{padding:0}.ivu-input-number-small .ivu-input-number-input-wrap{height:24px}.ivu-input-number-small .ivu-input-number-handler{height:12px}.ivu-input-number-small input{height:24px;line-height:24px;margin-top:-1px;vertical-align:top}.ivu-input-number-small .ivu-input-number-handler-up-inner{top:-1px}.ivu-input-number-small .ivu-input-number-handler-down-inner{bottom:-1px}.ivu-input-number-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-disabled .ivu-input-number-handler-up-inner,.ivu-input-number-handler-down-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-handler-down-disabled .ivu-input-number-handler-up-inner,.ivu-input-number-handler-up-disabled .ivu-input-number-handler-down-inner,.ivu-input-number-handler-up-disabled .ivu-input-number-handler-up-inner{opacity:.72;color:#ccc!important;cursor:not-allowed}.ivu-input-number-disabled .ivu-input-number-input{opacity:.72;cursor:not-allowed;background-color:#f3f3f3}.ivu-input-number-disabled .ivu-input-number-handler-wrap{display:none}.ivu-input-number-disabled .ivu-input-number-handler{opacity:.72;color:#ccc!important;cursor:not-allowed}.ivu-form-item-error .ivu-input-number{border:1px solid #ed4014}.ivu-form-item-error .ivu-input-number:hover{border-color:#ed4014}.ivu-form-item-error .ivu-input-number:focus{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-form-item-error .ivu-input-number-focused{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-scroll-wrapper{width:auto;margin:0 auto;position:relative;outline:0}.ivu-scroll-container{overflow-y:scroll}.ivu-scroll-content{opacity:1;-webkit-transition:opacity .5s;transition:opacity .5s}.ivu-scroll-content-loading{opacity:.5}.ivu-scroll-loader{text-align:center;padding:0;-webkit-transition:padding .5s;transition:padding .5s}.ivu-scroll-loader-wrapper{padding:5px 0;height:0;background-color:inherit;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transition:opacity .3s,height .5s,-webkit-transform .5s;transition:opacity .3s,height .5s,-webkit-transform .5s;transition:opacity .3s,transform .5s,height .5s;transition:opacity .3s,transform .5s,height .5s,-webkit-transform .5s}.ivu-scroll-loader-wrapper-active{height:40px;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}@-webkit-keyframes ani-demo-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes ani-demo-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ivu-scroll-loader-wrapper .ivu-scroll-spinner{position:relative}.ivu-scroll-loader-wrapper .ivu-scroll-spinner-icon{-webkit-animation:ani-demo-spin 1s linear infinite;animation:ani-demo-spin 1s linear infinite}.ivu-tag{display:inline-block;height:22px;line-height:22px;margin:2px 4px 2px 0;padding:0 8px;border:1px solid #e8eaec;border-radius:3px;background:#f7f7f7;font-size:12px;vertical-align:middle;opacity:1;overflow:hidden;cursor:pointer}.ivu-tag:not(.ivu-tag-border):not(.ivu-tag-dot):not(.ivu-tag-checked){background:0 0;border:0;color:#515a6e}.ivu-tag:not(.ivu-tag-border):not(.ivu-tag-dot):not(.ivu-tag-checked) .ivu-icon-ios-close{color:#515a6e!important}.ivu-tag-color-error{color:#ed4014!important;border-color:#ed4014}.ivu-tag-color-success{color:#19be6b!important;border-color:#19be6b}.ivu-tag-color-primary{color:#2d8cf0!important;border-color:#2d8cf0}.ivu-tag-color-warning{color:#f90!important;border-color:#f90}.ivu-tag-color-white{color:#fff!important}.ivu-tag-dot{height:32px;line-height:32px;border:1px solid #e8eaec!important;color:#515a6e!important;background:#fff!important;padding:0 12px}.ivu-tag-dot-inner{display:inline-block;width:12px;height:12px;margin-right:8px;border-radius:50%;background:#e8eaec;position:relative;top:1px}.ivu-tag-dot .ivu-icon-ios-close{color:#666!important;margin-left:12px!important}.ivu-tag-border{height:24px;line-height:24px;border:1px solid #e8eaec;color:#e8eaec;background:#fff!important;position:relative}.ivu-tag-border .ivu-icon-ios-close{color:#666;margin-left:12px!important}.ivu-tag-border:after{content:\"\";display:none;width:1px;background:currentColor;position:absolute;top:0;bottom:0;right:22px}.ivu-tag-border.ivu-tag-closable:after{display:block}.ivu-tag-border.ivu-tag-closable .ivu-icon-ios-close{margin-left:18px!important;left:4px;top:-1px}.ivu-tag-border.ivu-tag-primary{color:#2d8cf0!important;border:1px solid #2d8cf0!important}.ivu-tag-border.ivu-tag-primary:after{background:#2d8cf0}.ivu-tag-border.ivu-tag-primary .ivu-icon-ios-close{color:#2d8cf0!important}.ivu-tag-border.ivu-tag-success{color:#19be6b!important;border:1px solid #19be6b!important}.ivu-tag-border.ivu-tag-success:after{background:#19be6b}.ivu-tag-border.ivu-tag-success .ivu-icon-ios-close{color:#19be6b!important}.ivu-tag-border.ivu-tag-warning{color:#f90!important;border:1px solid #f90!important}.ivu-tag-border.ivu-tag-warning:after{background:#f90}.ivu-tag-border.ivu-tag-warning .ivu-icon-ios-close{color:#f90!important}.ivu-tag-border.ivu-tag-error{color:#ed4014!important;border:1px solid #ed4014!important}.ivu-tag-border.ivu-tag-error:after{background:#ed4014}.ivu-tag-border.ivu-tag-error .ivu-icon-ios-close{color:#ed4014!important}.ivu-tag:hover{opacity:.85}.ivu-tag-text{color:#515a6e}.ivu-tag-text a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ivu-tag .ivu-icon-ios-close{display:inline-block;font-size:14px;-webkit-transform:scale(1.42857143) rotate(0);-ms-transform:scale(1.42857143) rotate(0);transform:scale(1.42857143) rotate(0);cursor:pointer;margin-left:2px;color:#666;opacity:.66;position:relative;top:-1px}:root .ivu-tag .ivu-icon-ios-close{font-size:14px}.ivu-tag .ivu-icon-ios-close:hover{opacity:1}.ivu-tag-error,.ivu-tag-primary,.ivu-tag-success,.ivu-tag-warning{border:0}.ivu-tag-error,.ivu-tag-error .ivu-icon-ios-close,.ivu-tag-error .ivu-icon-ios-close:hover,.ivu-tag-error a,.ivu-tag-error a:hover,.ivu-tag-primary,.ivu-tag-primary .ivu-icon-ios-close,.ivu-tag-primary .ivu-icon-ios-close:hover,.ivu-tag-primary a,.ivu-tag-primary a:hover,.ivu-tag-success,.ivu-tag-success .ivu-icon-ios-close,.ivu-tag-success .ivu-icon-ios-close:hover,.ivu-tag-success a,.ivu-tag-success a:hover,.ivu-tag-warning,.ivu-tag-warning .ivu-icon-ios-close,.ivu-tag-warning .ivu-icon-ios-close:hover,.ivu-tag-warning a,.ivu-tag-warning a:hover{color:#fff}.ivu-tag-primary,.ivu-tag-primary.ivu-tag-dot .ivu-tag-dot-inner{background:#2d8cf0}.ivu-tag-success,.ivu-tag-success.ivu-tag-dot .ivu-tag-dot-inner{background:#19be6b}.ivu-tag-warning,.ivu-tag-warning.ivu-tag-dot .ivu-tag-dot-inner{background:#f90}.ivu-tag-error,.ivu-tag-error.ivu-tag-dot .ivu-tag-dot-inner{background:#ed4014}.ivu-tag-pink{line-height:20px;background:#fff0f6;border-color:#ffadd2}.ivu-tag-pink .ivu-tag-text{color:#eb2f96!important}.ivu-tag-magenta{line-height:20px;background:#fff0f6;border-color:#ffadd2}.ivu-tag-magenta .ivu-tag-text{color:#eb2f96!important}.ivu-tag-red{line-height:20px;background:#fff1f0;border-color:#ffa39e}.ivu-tag-red .ivu-tag-text{color:#f5222d!important}.ivu-tag-volcano{line-height:20px;background:#fff2e8;border-color:#ffbb96}.ivu-tag-volcano .ivu-tag-text{color:#fa541c!important}.ivu-tag-orange{line-height:20px;background:#fff7e6;border-color:#ffd591}.ivu-tag-orange .ivu-tag-text{color:#fa8c16!important}.ivu-tag-yellow{line-height:20px;background:#feffe6;border-color:#fffb8f}.ivu-tag-yellow .ivu-tag-text{color:#fadb14!important}.ivu-tag-gold{line-height:20px;background:#fffbe6;border-color:#ffe58f}.ivu-tag-gold .ivu-tag-text{color:#faad14!important}.ivu-tag-cyan{line-height:20px;background:#e6fffb;border-color:#87e8de}.ivu-tag-cyan .ivu-tag-text{color:#13c2c2!important}.ivu-tag-lime{line-height:20px;background:#fcffe6;border-color:#eaff8f}.ivu-tag-lime .ivu-tag-text{color:#a0d911!important}.ivu-tag-green{line-height:20px;background:#f6ffed;border-color:#b7eb8f}.ivu-tag-green .ivu-tag-text{color:#52c41a!important}.ivu-tag-blue{line-height:20px;background:#e6f7ff;border-color:#91d5ff}.ivu-tag-blue .ivu-tag-text{color:#1890ff!important}.ivu-tag-geekblue{line-height:20px;background:#f0f5ff;border-color:#adc6ff}.ivu-tag-geekblue .ivu-tag-text{color:#2f54eb!important}.ivu-tag-purple{line-height:20px;background:#f9f0ff;border-color:#d3adf7}.ivu-tag-purple .ivu-tag-text{color:#722ed1!important}.ivu-layout{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:auto;flex:auto;background:#f5f7f9}.ivu-layout.ivu-layout-has-sider{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ivu-layout.ivu-layout-has-sider>.ivu-layout,.ivu-layout.ivu-layout-has-sider>.ivu-layout-content{overflow-x:hidden}.ivu-layout-footer,.ivu-layout-header{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ivu-layout-header{background:#515a6e;padding:0 50px;height:64px;line-height:64px}.ivu-layout-sider{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;position:relative;background:#515a6e;min-width:0}.ivu-layout-sider-children{height:100%;padding-top:.1px;margin-top:-.1px}.ivu-layout-sider-has-trigger{padding-bottom:48px}.ivu-layout-sider-trigger{position:fixed;bottom:0;text-align:center;cursor:pointer;height:48px;line-height:48px;color:#fff;background:#515a6e;z-index:1000;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-layout-sider-trigger .ivu-icon{font-size:16px}.ivu-layout-sider-trigger>*{-webkit-transition:all .2s;transition:all .2s}.ivu-layout-sider-trigger-collapsed .ivu-layout-sider-trigger-icon{-webkit-transform:rotateZ(180deg);-ms-transform:rotate(180deg);transform:rotateZ(180deg)}.ivu-layout-sider-zero-width>*{overflow:hidden}.ivu-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;text-align:center;width:36px;height:42px;line-height:42px;background:#515a6e;color:#fff;font-size:18px;border-radius:0 6px 6px 0;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ivu-layout-sider-zero-width-trigger:hover{background:#626b7d}.ivu-layout-sider-zero-width-trigger.ivu-layout-sider-zero-width-trigger-left{right:0;left:-36px;border-radius:6px 0 0 6px}.ivu-layout-footer{background:#f5f7f9;padding:24px 50px;color:#515a6e;font-size:14px}.ivu-layout-content{-webkit-box-flex:1;-ms-flex:auto;flex:auto}.ivu-loading-bar{width:100%;position:fixed;top:0;left:0;right:0;z-index:2000}.ivu-loading-bar-inner{-webkit-transition:width .2s linear;transition:width .2s linear}.ivu-loading-bar-inner-color-primary{background-color:#2d8cf0}.ivu-loading-bar-inner-failed-color-error{background-color:#ed4014}.ivu-progress{display:inline-block;width:100%;font-size:12px;position:relative}.ivu-progress-vertical{height:100%;width:auto}.ivu-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ivu-progress-show-info .ivu-progress-outer{padding-right:55px;margin-right:-55px}.ivu-progress-vertical .ivu-progress-outer{height:100%;width:auto}.ivu-progress-inner{display:inline-block;width:100%;background-color:#f3f3f3;border-radius:100px;vertical-align:middle;position:relative}.ivu-progress-vertical .ivu-progress-inner{height:100%;width:auto}.ivu-progress-vertical .ivu-progress-inner:after,.ivu-progress-vertical .ivu-progress-inner>*{display:inline-block;vertical-align:bottom}.ivu-progress-vertical .ivu-progress-inner:after{content:'';height:100%}.ivu-progress-bg{border-radius:100px;background-color:#2d8cf0;-webkit-transition:all .2s linear;transition:all .2s linear;position:relative}.ivu-progress-success-bg{border-radius:100px;background-color:#19be6b;-webkit-transition:all .2s linear;transition:all .2s linear;position:absolute;top:0;left:0}.ivu-progress-text{display:inline-block;margin-left:5px;text-align:left;font-size:1em;vertical-align:middle}.ivu-progress-active .ivu-progress-bg:before{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:10px;-webkit-animation:ivu-progress-active 2s ease-in-out infinite;animation:ivu-progress-active 2s ease-in-out infinite}.ivu-progress-vertical.ivu-progress-active .ivu-progress-bg:before{top:auto;-webkit-animation:ivu-progress-active-vertical 2s ease-in-out infinite;animation:ivu-progress-active-vertical 2s ease-in-out infinite}.ivu-progress-wrong .ivu-progress-bg{background-color:#ed4014}.ivu-progress-wrong .ivu-progress-text{color:#ed4014}.ivu-progress-success .ivu-progress-bg{background-color:#19be6b}.ivu-progress-success .ivu-progress-text{color:#19be6b}@-webkit-keyframes ivu-progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@keyframes ivu-progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@-webkit-keyframes ivu-progress-active-vertical{0%{opacity:.3;height:0}100%{opacity:0;height:100%}}@keyframes ivu-progress-active-vertical{0%{opacity:.3;height:0}100%{opacity:0;height:100%}}.ivu-timeline{list-style:none;margin:0;padding:0}.ivu-timeline-item{margin:0!important;padding:0 0 12px 0;list-style:none;position:relative}.ivu-timeline-item-tail{height:100%;border-left:1px solid #e8eaec;position:absolute;left:6px;top:0}.ivu-timeline-item-pending .ivu-timeline-item-tail{display:none}.ivu-timeline-item-head{width:13px;height:13px;background-color:#fff;border-radius:50%;border:1px solid transparent;position:absolute}.ivu-timeline-item-head-blue{border-color:#2d8cf0;color:#2d8cf0}.ivu-timeline-item-head-red{border-color:#ed4014;color:#ed4014}.ivu-timeline-item-head-green{border-color:#19be6b;color:#19be6b}.ivu-timeline-item-head-custom{width:40px;height:auto;margin-top:6px;padding:3px 0;text-align:center;line-height:1;border:0;border-radius:0;font-size:14px;position:absolute;left:-13px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ivu-timeline-item-content{padding:1px 1px 10px 24px;font-size:12px;position:relative;top:-3px}.ivu-timeline-item:last-child .ivu-timeline-item-tail{display:none}.ivu-timeline.ivu-timeline-pending .ivu-timeline-item:nth-last-of-type(2) .ivu-timeline-item-tail{border-left:1px dotted #e8eaec}.ivu-timeline.ivu-timeline-pending .ivu-timeline-item:nth-last-of-type(2) .ivu-timeline-item-content{min-height:48px}.ivu-page:after{content:'';display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.ivu-page-item{display:inline-block;vertical-align:middle;min-width:32px;height:32px;line-height:30px;margin-right:4px;text-align:center;list-style:none;background-color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;font-family:Arial;font-weight:500;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:border .2s ease-in-out,color .2s ease-in-out;transition:border .2s ease-in-out,color .2s ease-in-out}.ivu-page-item a{font-family:\"Monospaced Number\";margin:0 6px;text-decoration:none;color:#515a6e}.ivu-page-item:hover{border-color:#2d8cf0}.ivu-page-item:hover a{color:#2d8cf0}.ivu-page-item-active{border-color:#2d8cf0}.ivu-page-item-active a,.ivu-page-item-active:hover a{color:#2d8cf0}.ivu-page-item-jump-next:after,.ivu-page-item-jump-prev:after{content:\"•••\";display:block;letter-spacing:1px;color:#ccc;text-align:center}.ivu-page-item-jump-next i,.ivu-page-item-jump-prev i{display:none}.ivu-page-item-jump-next:hover:after,.ivu-page-item-jump-prev:hover:after{display:none}.ivu-page-item-jump-next:hover i,.ivu-page-item-jump-prev:hover i{display:inline}.ivu-page-item-jump-prev:hover i:after{content:\"\\F115\";margin-left:-8px}.ivu-page-item-jump-next:hover i:after{content:\"\\F11F\";margin-left:-8px}.ivu-page-prev{margin-right:4px}.ivu-page-item-jump-next,.ivu-page-item-jump-prev{margin-right:4px}.ivu-page-item-jump-next,.ivu-page-item-jump-prev,.ivu-page-next,.ivu-page-prev{display:inline-block;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;min-width:32px;height:32px;line-height:30px;list-style:none;text-align:center;cursor:pointer;color:#666;font-family:Arial;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-page-item-jump-next,.ivu-page-item-jump-prev{border-color:transparent}.ivu-page-next,.ivu-page-prev{background-color:#fff}.ivu-page-next a,.ivu-page-prev a{color:#666;font-size:14px}.ivu-page-next:hover,.ivu-page-prev:hover{border-color:#2d8cf0}.ivu-page-next:hover a,.ivu-page-prev:hover a{color:#2d8cf0}.ivu-page-disabled{cursor:not-allowed}.ivu-page-disabled a{color:#ccc}.ivu-page-disabled:hover{border-color:#dcdee2}.ivu-page-disabled:hover a{color:#ccc;cursor:not-allowed}.ivu-page-options{display:inline-block;vertical-align:middle;margin-left:15px}.ivu-page-options-sizer{display:inline-block;margin-right:10px}.ivu-page-options-elevator{display:inline-block;vertical-align:middle;height:32px;line-height:32px}.ivu-page-options-elevator input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:12px;border:1px solid #dcdee2;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;border-radius:4px;margin:0 8px;width:50px}.ivu-page-options-elevator input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-page-options-elevator input:-ms-input-placeholder{color:#c5c8ce}.ivu-page-options-elevator input::-webkit-input-placeholder{color:#c5c8ce}.ivu-page-options-elevator input:hover{border-color:#57a3f3}.ivu-page-options-elevator input:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-page-options-elevator input[disabled],fieldset[disabled] .ivu-page-options-elevator input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-page-options-elevator input[disabled]:hover,fieldset[disabled] .ivu-page-options-elevator input:hover{border-color:#e3e5e8}textarea.ivu-page-options-elevator input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-page-options-elevator input-large{font-size:14px;padding:6px 7px;height:36px}.ivu-page-options-elevator input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-page-total{display:inline-block;height:32px;line-height:32px;margin-right:10px}.ivu-page-simple .ivu-page-next,.ivu-page-simple .ivu-page-prev{margin:0;border:0;height:24px;line-height:normal;font-size:18px}.ivu-page-simple .ivu-page-simple-pager{display:inline-block;margin-right:8px;vertical-align:middle}.ivu-page-simple .ivu-page-simple-pager input{width:30px;height:24px;margin:0 8px;padding:5px 8px;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;outline:0;border:1px solid #dcdee2;border-radius:4px;-webkit-transition:border-color .2s ease-in-out;transition:border-color .2s ease-in-out}.ivu-page-simple .ivu-page-simple-pager input:hover{border-color:#2d8cf0}.ivu-page-simple .ivu-page-simple-pager span{padding:0 8px 0 2px}.ivu-page-custom-text,.ivu-page-custom-text:hover{border-color:transparent}.ivu-page.mini .ivu-page-total{height:24px;line-height:24px}.ivu-page.mini .ivu-page-item{border:0;margin:0;min-width:24px;height:24px;line-height:24px;border-radius:3px}.ivu-page.mini .ivu-page-next,.ivu-page.mini .ivu-page-prev{margin:0;min-width:24px;height:24px;line-height:22px;border:0}.ivu-page.mini .ivu-page-next a i:after,.ivu-page.mini .ivu-page-prev a i:after{height:24px;line-height:24px}.ivu-page.mini .ivu-page-item-jump-next,.ivu-page.mini .ivu-page-item-jump-prev{height:24px;line-height:24px;border:none;margin-right:0}.ivu-page.mini .ivu-page-options{margin-left:8px}.ivu-page.mini .ivu-page-options-elevator{height:24px;line-height:24px}.ivu-page.mini .ivu-page-options-elevator input{padding:1px 7px;height:24px;border-radius:3px;width:44px}.ivu-steps{font-size:0;width:100%;line-height:1.5}.ivu-steps-item{display:inline-block;position:relative;vertical-align:top}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner{background-color:#fff}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner>.ivu-steps-icon{color:#ccc}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-title{color:#999}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-content{color:#999}.ivu-steps-item.ivu-steps-status-wait .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner{border-color:#2d8cf0;background-color:#2d8cf0}.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner>.ivu-steps-icon{color:#fff}.ivu-steps-item.ivu-steps-status-process .ivu-steps-title{color:#666}.ivu-steps-item.ivu-steps-status-process .ivu-steps-content{color:#666}.ivu-steps-item.ivu-steps-status-process .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner{background-color:#fff;border-color:#2d8cf0}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner span,.ivu-steps-item.ivu-steps-status-finish .ivu-steps-head-inner>.ivu-steps-icon{color:#2d8cf0}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-tail>i:after{width:100%;background:#2d8cf0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;opacity:1}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-title{color:#999}.ivu-steps-item.ivu-steps-status-finish .ivu-steps-content{color:#999}.ivu-steps-item.ivu-steps-status-error .ivu-steps-head-inner{background-color:#fff;border-color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-head-inner>.ivu-steps-icon{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-title{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-content{color:#ed4014}.ivu-steps-item.ivu-steps-status-error .ivu-steps-tail>i{background-color:#e8eaec}.ivu-steps-item.ivu-steps-next-error .ivu-steps-tail>i,.ivu-steps-item.ivu-steps-next-error .ivu-steps-tail>i:after{background-color:#ed4014}.ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner{background:0 0;border:0;width:auto;height:auto}.ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner>.ivu-steps-icon{font-size:20px;top:2px;width:20px;height:20px}.ivu-steps-item.ivu-steps-custom.ivu-steps-status-process .ivu-steps-head-inner>.ivu-steps-icon{color:#2d8cf0}.ivu-steps-item:last-child .ivu-steps-tail{display:none}.ivu-steps .ivu-steps-head,.ivu-steps .ivu-steps-main{position:relative;display:inline-block;vertical-align:top}.ivu-steps .ivu-steps-head{background:#fff}.ivu-steps .ivu-steps-head-inner{display:block;width:26px;height:26px;line-height:24px;margin-right:8px;text-align:center;border:1px solid #ccc;border-radius:50%;font-size:14px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon{line-height:1;position:relative}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon{font-size:24px}.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon-ios-checkmark-empty,.ivu-steps .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon-ios-close-empty{font-weight:700}.ivu-steps .ivu-steps-main{margin-top:2.5px;display:inline}.ivu-steps .ivu-steps-custom .ivu-steps-title{margin-top:2.5px}.ivu-steps .ivu-steps-title{display:inline-block;margin-bottom:4px;padding-right:10px;font-size:14px;font-weight:700;color:#666;background:#fff}.ivu-steps .ivu-steps-title>a:first-child:last-child{color:#666}.ivu-steps .ivu-steps-item-last .ivu-steps-title{padding-right:0;width:100%}.ivu-steps .ivu-steps-content{font-size:12px;color:#999}.ivu-steps .ivu-steps-tail{width:100%;padding:0 10px;position:absolute;left:0;top:13px}.ivu-steps .ivu-steps-tail>i{display:inline-block;width:100%;height:1px;vertical-align:top;background:#e8eaec;border-radius:1px;position:relative}.ivu-steps .ivu-steps-tail>i:after{content:'';width:0;height:100%;background:#e8eaec;opacity:0;position:absolute;top:0}.ivu-steps.ivu-steps-small .ivu-steps-head-inner{width:18px;height:18px;line-height:16px;margin-right:10px;text-align:center;border-radius:50%;font-size:12px}.ivu-steps.ivu-steps-small .ivu-steps-head-inner>.ivu-steps-icon.ivu-icon{font-size:16px;top:0}.ivu-steps.ivu-steps-small .ivu-steps-main{margin-top:0}.ivu-steps.ivu-steps-small .ivu-steps-title{margin-bottom:4px;margin-top:0;color:#666;font-size:12px;font-weight:700}.ivu-steps.ivu-steps-small .ivu-steps-content{font-size:12px;color:#999;padding-left:30px}.ivu-steps.ivu-steps-small .ivu-steps-tail{top:8px;padding:0 8px}.ivu-steps.ivu-steps-small .ivu-steps-tail>i{height:1px;width:100%;border-radius:1px}.ivu-steps .ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner,.ivu-steps.ivu-steps-small .ivu-steps-item.ivu-steps-custom .ivu-steps-head-inner{width:inherit;height:inherit;line-height:inherit;border-radius:0;border:0;background:0 0}.ivu-steps-vertical .ivu-steps-item{display:block}.ivu-steps-vertical .ivu-steps-tail{position:absolute;left:13px;top:0;height:100%;width:1px;padding:30px 0 4px 0}.ivu-steps-vertical .ivu-steps-tail>i{height:100%;width:1px}.ivu-steps-vertical .ivu-steps-tail>i:after{height:0;width:100%}.ivu-steps-vertical .ivu-steps-status-finish .ivu-steps-tail>i:after{height:100%}.ivu-steps-vertical .ivu-steps-head{float:left}.ivu-steps-vertical .ivu-steps-head-inner{margin-right:16px}.ivu-steps-vertical .ivu-steps-main{min-height:47px;overflow:hidden;display:block}.ivu-steps-vertical .ivu-steps-main .ivu-steps-title{line-height:26px}.ivu-steps-vertical .ivu-steps-main .ivu-steps-content{padding-bottom:12px;padding-left:0}.ivu-steps-vertical .ivu-steps-custom .ivu-steps-icon{left:4px}.ivu-steps-vertical.ivu-steps-small .ivu-steps-custom .ivu-steps-icon{left:0}.ivu-steps-vertical.ivu-steps-small .ivu-steps-tail{position:absolute;left:9px;top:0;padding:22px 0 4px 0}.ivu-steps-vertical.ivu-steps-small .ivu-steps-tail>i{height:100%}.ivu-steps-vertical.ivu-steps-small .ivu-steps-title{line-height:18px}.ivu-steps-horizontal.ivu-steps-hidden{visibility:hidden}.ivu-steps-horizontal .ivu-steps-content{padding-left:35px}.ivu-steps-horizontal .ivu-steps-item:not(:first-child) .ivu-steps-head{padding-left:10px;margin-left:-10px}.ivu-modal{width:auto;margin:0 auto;position:relative;outline:0;top:100px}.ivu-modal-hidden{display:none!important}.ivu-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ivu-modal-wrap *{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.ivu-modal-mask{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,55,55,.6);height:100%;z-index:1000}.ivu-modal-mask-hidden{display:none}.ivu-modal-content{position:relative;background-color:#fff;border:0;border-radius:6px;background-clip:padding-box;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}.ivu-modal-content-no-mask{pointer-events:auto}.ivu-modal-content-drag{position:absolute}.ivu-modal-content-drag .ivu-modal-header{cursor:move}.ivu-modal-content-dragging{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-modal-header{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-modal-header p,.ivu-modal-header-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:14px;color:#17233d;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-modal-header p i,.ivu-modal-header p span{vertical-align:middle}.ivu-modal-close{z-index:1;font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-modal-close .ivu-icon-ios-close{font-size:31px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:1px}.ivu-modal-close .ivu-icon-ios-close:hover{color:#444}.ivu-modal-body{padding:16px;font-size:12px;line-height:1.5}.ivu-modal-footer{border-top:1px solid #e8eaec;padding:12px 18px 12px 18px;text-align:right}.ivu-modal-footer button+button{margin-left:8px;margin-bottom:0}.ivu-modal-fullscreen{width:100%!important;top:0;bottom:0;position:absolute}.ivu-modal-fullscreen .ivu-modal-content{width:100%;border-radius:0;position:absolute;top:0;bottom:0}.ivu-modal-fullscreen .ivu-modal-body{width:100%;overflow:auto;position:absolute;top:51px;bottom:61px}.ivu-modal-fullscreen-no-header .ivu-modal-body{top:0}.ivu-modal-fullscreen-no-footer .ivu-modal-body{bottom:0}.ivu-modal-fullscreen .ivu-modal-footer{position:absolute;width:100%;bottom:0}.ivu-modal-no-mask{pointer-events:none}@media (max-width:768px){.ivu-modal{width:auto!important;margin:10px}.vertical-center-modal .ivu-modal{-webkit-box-flex:1;-ms-flex:1;flex:1}}.ivu-modal-confirm{padding:0 4px}.ivu-modal-confirm-head{padding:0 12px 0 0}.ivu-modal-confirm-head-icon{display:inline-block;font-size:28px;vertical-align:middle;position:relative;top:-2px}.ivu-modal-confirm-head-icon-info{color:#2d8cf0}.ivu-modal-confirm-head-icon-success{color:#19be6b}.ivu-modal-confirm-head-icon-warning{color:#f90}.ivu-modal-confirm-head-icon-error{color:#ed4014}.ivu-modal-confirm-head-icon-confirm{color:#f90}.ivu-modal-confirm-head-title{display:inline-block;vertical-align:middle;margin-left:12px;font-size:16px;color:#17233d;font-weight:700}.ivu-modal-confirm-body{padding-left:42px;font-size:14px;color:#515a6e;position:relative}.ivu-modal-confirm-body-render{margin:0;padding:0}.ivu-modal-confirm-footer{margin-top:20px;text-align:right}.ivu-modal-confirm-footer button+button{margin-left:8px;margin-bottom:0}.ivu-select{display:inline-block;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;color:#515a6e;font-size:14px;line-height:normal}.ivu-select-selection{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;background-color:#fff;border-radius:4px;border:1px solid #dcdee2;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-select-selection-focused,.ivu-select-selection:hover{border-color:#57a3f3}.ivu-select-selection-focused .ivu-select-arrow,.ivu-select-selection:hover .ivu-select-arrow{display:inline-block}.ivu-select-arrow{position:absolute;top:50%;right:8px;line-height:1;margin-top:-7px;font-size:14px;color:#808695;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-select-visible .ivu-select-selection{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-select-visible .ivu-select-arrow{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);display:inline-block}.ivu-select-disabled .ivu-select-selection{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-select-disabled .ivu-select-selection:hover{border-color:#e3e5e8}.ivu-select-disabled .ivu-select-selection .ivu-select-arrow{display:none}.ivu-select-disabled .ivu-select-selection:hover{border-color:#dcdee2;-webkit-box-shadow:none;box-shadow:none}.ivu-select-disabled .ivu-select-selection:hover .ivu-select-arrow{display:inline-block}.ivu-select-single .ivu-select-selection{height:32px;position:relative}.ivu-select-single .ivu-select-selection .ivu-select-placeholder{color:#c5c8ce}.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-single .ivu-select-selection .ivu-select-selected-value{display:block;height:30px;line-height:30px;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:8px;padding-right:24px}.ivu-select-multiple .ivu-select-selection{padding:0 24px 0 4px}.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder{display:block;height:30px;line-height:30px;color:#c5c8ce;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:4px;padding-right:22px}.ivu-select-large.ivu-select-single .ivu-select-selection{height:36px}.ivu-select-large.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-large.ivu-select-single .ivu-select-selection .ivu-select-selected-value{height:34px;line-height:34px;font-size:14px}.ivu-select-large.ivu-select-multiple .ivu-select-selection{min-height:36px}.ivu-select-large.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder,.ivu-select-large.ivu-select-multiple .ivu-select-selection .ivu-select-selected-value{min-height:34px;line-height:34px;font-size:14px}.ivu-select-small.ivu-select-single .ivu-select-selection{height:24px;border-radius:3px}.ivu-select-small.ivu-select-single .ivu-select-selection .ivu-select-placeholder,.ivu-select-small.ivu-select-single .ivu-select-selection .ivu-select-selected-value{height:22px;line-height:22px}.ivu-select-small.ivu-select-multiple .ivu-select-selection{min-height:24px;border-radius:3px}.ivu-select-small.ivu-select-multiple .ivu-select-selection .ivu-select-placeholder,.ivu-select-small.ivu-select-multiple .ivu-select-selection .ivu-select-selected-value{height:auto;min-height:22px;line-height:22px}.ivu-select-input{display:inline-block;height:32px;line-height:32px;padding:0 24px 0 8px;font-size:12px;outline:0;border:none;-webkit-box-sizing:border-box;box-sizing:border-box;color:#515a6e;background-color:transparent;position:relative;cursor:pointer}.ivu-select-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-select-input:-ms-input-placeholder{color:#c5c8ce}.ivu-select-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-select-input[disabled]{cursor:not-allowed;color:#ccc}.ivu-select-single .ivu-select-input{width:100%}.ivu-select-large .ivu-select-input{font-size:14px;height:36px}.ivu-select-small .ivu-select-input{height:22px;line-height:22px}.ivu-select-multiple .ivu-select-input{height:29px;line-height:32px;padding:0 0 0 4px}.ivu-select-not-found{text-align:center;color:#c5c8ce}.ivu-select-not-found li:not([class^=ivu-]){margin-bottom:0}.ivu-select-loading{text-align:center;color:#c5c8ce}.ivu-select-multiple .ivu-tag{height:24px;line-height:22px;margin:3px 4px 3px 0}.ivu-select-large.ivu-select-multiple .ivu-tag{height:28px;line-height:26px;font-size:14px}.ivu-select-large.ivu-select-multiple .ivu-tag i{top:1px}.ivu-select-small.ivu-select-multiple .ivu-tag{height:17px;line-height:15px;font-size:12px;padding:0 6px;margin:3px 4px 2px 0}.ivu-select-small.ivu-select-multiple .ivu-tag i{top:1px}.ivu-select-dropdown-list{min-width:100%;list-style:none}.ivu-select .ivu-select-dropdown{width:auto}.ivu-select-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-select-item:hover{background:#f3f3f3}.ivu-select-item-focus{background:#f3f3f3}.ivu-select-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-select-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-select-item-selected,.ivu-select-item-selected:hover{color:#2d8cf0}.ivu-select-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-select-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-select-large .ivu-select-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-select-item{white-space:normal}}.ivu-select-multiple .ivu-select-item{position:relative}.ivu-select-multiple .ivu-select-item-selected{color:rgba(45,140,240,.9);background:#fff}.ivu-select-multiple .ivu-select-item-focus,.ivu-select-multiple .ivu-select-item-selected:hover{background:#f3f3f3}.ivu-select-multiple .ivu-select-item-selected.ivu-select-multiple .ivu-select-item-focus{color:rgba(40,123,211,.91);background:#fff}.ivu-select-multiple .ivu-select-item-selected:after{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle;font-size:24px;content:'\\F171';color:rgba(45,140,240,.9);position:absolute;top:2px;right:8px}.ivu-select-group{list-style:none;margin:0;padding:0}.ivu-select-group-title{padding-left:8px;font-size:12px;color:#999;height:30px;line-height:30px}.ivu-form-item-error .ivu-select-selection{border:1px solid #ed4014}.ivu-form-item-error .ivu-select-arrow{color:#ed4014}.ivu-form-item-error .ivu-select-visible .ivu-select-selection{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-select-dropdown{width:inherit;max-height:200px;overflow:auto;margin:5px 0;padding:5px 0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);position:absolute;z-index:900}.ivu-select-dropdown-transfer{z-index:1060;width:auto}.ivu-select-dropdown.ivu-transfer-no-max-height{max-height:none}.ivu-modal .ivu-select-dropdown{position:absolute!important}.ivu-split-wrapper{position:relative;width:100%;height:100%}.ivu-split-pane{position:absolute}.ivu-split-pane.left-pane,.ivu-split-pane.right-pane{top:0;bottom:0}.ivu-split-pane.left-pane{left:0}.ivu-split-pane.right-pane{right:0}.ivu-split-pane.bottom-pane,.ivu-split-pane.top-pane{left:0;right:0}.ivu-split-pane.top-pane{top:0}.ivu-split-pane.bottom-pane{bottom:0}.ivu-split-pane-moving{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-split-trigger{border:1px solid #dcdee2}.ivu-split-trigger-con{position:absolute;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10}.ivu-split-trigger-bar-con{position:absolute;overflow:hidden}.ivu-split-trigger-bar-con.vertical{left:1px;top:50%;height:32px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.ivu-split-trigger-bar-con.horizontal{left:50%;top:1px;width:32px;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.ivu-split-trigger-vertical{width:6px;height:100%;background:#f8f8f9;border-top:none;border-bottom:none;cursor:col-resize}.ivu-split-trigger-vertical .ivu-split-trigger-bar{width:4px;height:1px;background:rgba(23,35,61,.25);float:left;margin-top:3px}.ivu-split-trigger-horizontal{height:6px;width:100%;background:#f8f8f9;border-left:none;border-right:none;cursor:row-resize}.ivu-split-trigger-horizontal .ivu-split-trigger-bar{height:4px;width:1px;background:rgba(23,35,61,.25);float:left;margin-right:3px}.ivu-split-horizontal .ivu-split-trigger-con{top:50%;height:100%;width:0}.ivu-split-vertical .ivu-split-trigger-con{left:50%;height:0;width:100%}.ivu-split .no-select{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-tooltip{display:inline-block}.ivu-tooltip-rel{display:inline-block;position:relative;width:inherit}.ivu-tooltip-popper{display:block;visibility:visible;font-size:12px;line-height:1.5;position:absolute;z-index:1060}.ivu-tooltip-popper[x-placement^=top]{padding:5px 0 8px 0}.ivu-tooltip-popper[x-placement^=right]{padding:0 5px 0 8px}.ivu-tooltip-popper[x-placement^=bottom]{padding:8px 0 5px 0}.ivu-tooltip-popper[x-placement^=left]{padding:0 8px 0 5px}.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=top] .ivu-tooltip-arrow{left:50%;margin-left:-5px}.ivu-tooltip-popper[x-placement=top-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-popper[x-placement=top-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=right] .ivu-tooltip-arrow{top:50%;margin-top:-5px}.ivu-tooltip-popper[x-placement=right-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-popper[x-placement=right-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=left] .ivu-tooltip-arrow{top:50%;margin-top:-5px}.ivu-tooltip-popper[x-placement=left-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-popper[x-placement=left-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(70,76,91,.9)}.ivu-tooltip-popper[x-placement=bottom] .ivu-tooltip-arrow{left:50%;margin-left:-5px}.ivu-tooltip-popper[x-placement=bottom-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-popper[x-placement=bottom-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper{display:block;visibility:visible;font-size:12px;line-height:1.5;position:absolute;z-index:1060}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top]{padding:7px 0 10px 0}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right]{padding:0 7px 0 10px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom]{padding:10px 0 7px 0}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left]{padding:0 10px 0 7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow{bottom:3px;border-width:7px 7px 0;border-top-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top] .ivu-tooltip-arrow{left:50%;margin-left:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=top-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow{left:3px;border-width:7px 7px 7px 0;border-right-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right] .ivu-tooltip-arrow{top:50%;margin-top:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=right-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow{right:3px;border-width:7px 0 7px 7px;border-left-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left] .ivu-tooltip-arrow{top:50%;margin-top:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left-start] .ivu-tooltip-arrow{top:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=left-end] .ivu-tooltip-arrow{bottom:8px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow{top:3px;border-width:0 7px 7px;border-bottom-color:rgba(217,217,217,.5)}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom] .ivu-tooltip-arrow{left:50%;margin-left:-7px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom-start] .ivu-tooltip-arrow{left:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement=bottom-end] .ivu-tooltip-arrow{right:16px}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=top] .ivu-tooltip-arrow:after{content:\" \";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-width:7px;border-top-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=right] .ivu-tooltip-arrow:after{content:\" \";left:1px;bottom:-7px;border-left-width:0;border-right-width:7px;border-right-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=bottom] .ivu-tooltip-arrow:after{content:\" \";top:1px;margin-left:-7px;border-top-width:0;border-bottom-width:7px;border-bottom-color:#fff}.ivu-tooltip-light.ivu-tooltip-popper[x-placement^=left] .ivu-tooltip-arrow:after{content:\" \";right:1px;border-right-width:0;border-left-width:7px;border-left-color:#fff;bottom:-7px}.ivu-tooltip-inner{max-width:250px;min-height:34px;padding:8px 12px;color:#fff;text-align:left;text-decoration:none;background-color:rgba(70,76,91,.9);border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:nowrap}.ivu-tooltip-inner-with-width{white-space:pre-wrap;text-align:justify}.ivu-tooltip-light .ivu-tooltip-inner{background-color:#fff;color:#515a6e}.ivu-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ivu-tooltip-light .ivu-tooltip-arrow{border-width:8px}.ivu-tooltip-light .ivu-tooltip-arrow:after{display:block;width:0;height:0;position:absolute;border-color:transparent;border-style:solid;content:\"\";border-width:7px}.ivu-poptip{display:inline-block}.ivu-poptip-rel{display:inline-block;position:relative}.ivu-poptip-title{margin:0;padding:8px 16px;position:relative}.ivu-poptip-title:after{content:'';display:block;height:1px;position:absolute;left:8px;right:8px;bottom:0;background-color:#e8eaec}.ivu-poptip-title-inner{color:#17233d;font-size:14px}.ivu-poptip-body{padding:8px 16px}.ivu-poptip-body-content{overflow:auto}.ivu-poptip-body-content-word-wrap{white-space:pre-wrap;text-align:justify}.ivu-poptip-body-content-inner{color:#515a6e}.ivu-poptip-inner{width:100%;background-color:#fff;background-clip:padding-box;border-radius:4px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:nowrap}.ivu-poptip-popper{min-width:150px;display:block;visibility:visible;font-size:12px;line-height:1.5;position:absolute;z-index:1060}.ivu-poptip-popper[x-placement^=top]{padding:7px 0 10px 0}.ivu-poptip-popper[x-placement^=right]{padding:0 7px 0 10px}.ivu-poptip-popper[x-placement^=bottom]{padding:10px 0 7px 0}.ivu-poptip-popper[x-placement^=left]{padding:0 10px 0 7px}.ivu-poptip-popper[x-placement^=top] .ivu-poptip-arrow{bottom:3px;border-width:7px 7px 0;border-top-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=top] .ivu-poptip-arrow{left:50%;margin-left:-7px}.ivu-poptip-popper[x-placement=top-start] .ivu-poptip-arrow{left:16px}.ivu-poptip-popper[x-placement=top-end] .ivu-poptip-arrow{right:16px}.ivu-poptip-popper[x-placement^=right] .ivu-poptip-arrow{left:3px;border-width:7px 7px 7px 0;border-right-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=right] .ivu-poptip-arrow{top:50%;margin-top:-7px}.ivu-poptip-popper[x-placement=right-start] .ivu-poptip-arrow{top:8px}.ivu-poptip-popper[x-placement=right-end] .ivu-poptip-arrow{bottom:8px}.ivu-poptip-popper[x-placement^=left] .ivu-poptip-arrow{right:3px;border-width:7px 0 7px 7px;border-left-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=left] .ivu-poptip-arrow{top:50%;margin-top:-7px}.ivu-poptip-popper[x-placement=left-start] .ivu-poptip-arrow{top:8px}.ivu-poptip-popper[x-placement=left-end] .ivu-poptip-arrow{bottom:8px}.ivu-poptip-popper[x-placement^=bottom] .ivu-poptip-arrow{top:3px;border-width:0 7px 7px;border-bottom-color:rgba(217,217,217,.5)}.ivu-poptip-popper[x-placement=bottom] .ivu-poptip-arrow{left:50%;margin-left:-7px}.ivu-poptip-popper[x-placement=bottom-start] .ivu-poptip-arrow{left:16px}.ivu-poptip-popper[x-placement=bottom-end] .ivu-poptip-arrow{right:16px}.ivu-poptip-popper[x-placement^=top] .ivu-poptip-arrow:after{content:\" \";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-width:7px;border-top-color:#fff}.ivu-poptip-popper[x-placement^=right] .ivu-poptip-arrow:after{content:\" \";left:1px;bottom:-7px;border-left-width:0;border-right-width:7px;border-right-color:#fff}.ivu-poptip-popper[x-placement^=bottom] .ivu-poptip-arrow:after{content:\" \";top:1px;margin-left:-7px;border-top-width:0;border-bottom-width:7px;border-bottom-color:#fff}.ivu-poptip-popper[x-placement^=left] .ivu-poptip-arrow:after{content:\" \";right:1px;border-right-width:0;border-left-width:7px;border-left-color:#fff;bottom:-7px}.ivu-poptip-arrow,.ivu-poptip-arrow:after{display:block;width:0;height:0;position:absolute;border-color:transparent;border-style:solid}.ivu-poptip-arrow{border-width:8px}.ivu-poptip-arrow:after{content:\"\";border-width:7px}.ivu-poptip-confirm .ivu-poptip-popper{max-width:300px}.ivu-poptip-confirm .ivu-poptip-inner{white-space:normal}.ivu-poptip-confirm .ivu-poptip-body{padding:16px 16px 8px}.ivu-poptip-confirm .ivu-poptip-body .ivu-icon{font-size:16px;color:#f90;line-height:18px;position:absolute}.ivu-poptip-confirm .ivu-poptip-body-message{padding-left:20px}.ivu-poptip-confirm .ivu-poptip-footer{text-align:right;padding:8px 16px 16px}.ivu-poptip-confirm .ivu-poptip-footer button{margin-left:4px}.ivu-input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:12px;border:1px solid #dcdee2;border-radius:4px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-input:-ms-input-placeholder{color:#c5c8ce}.ivu-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-input:hover{border-color:#57a3f3}.ivu-input:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-input[disabled],fieldset[disabled] .ivu-input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-input[disabled]:hover,fieldset[disabled] .ivu-input:hover{border-color:#e3e5e8}textarea.ivu-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-input-large{font-size:14px;padding:6px 7px;height:36px}.ivu-input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-input-wrapper{display:inline-block;width:100%;position:relative;vertical-align:middle;line-height:normal}.ivu-input-icon{width:32px;height:32px;line-height:32px;font-size:16px;text-align:center;color:#808695;position:absolute;right:0;z-index:3}.ivu-input-hide-icon .ivu-input-icon{display:none}.ivu-input-icon-validate{display:none}.ivu-input-icon-clear{display:none}.ivu-input-wrapper:hover .ivu-input-icon-clear{display:inline-block}.ivu-input-icon-normal+.ivu-input{padding-right:32px}.ivu-input-hide-icon .ivu-input-icon-normal+.ivu-input{padding-right:7px}.ivu-input-wrapper-large .ivu-input-icon{font-size:18px;height:36px;line-height:36px}.ivu-input-wrapper-small .ivu-input-icon{width:24px;font-size:14px;height:24px;line-height:24px}.ivu-input-prefix,.ivu-input-suffix{width:32px;height:100%;text-align:center;position:absolute;left:0;top:0;z-index:1}.ivu-input-prefix i,.ivu-input-suffix i{font-size:16px;line-height:32px;color:#808695}.ivu-input-suffix{left:auto;right:0}.ivu-input-wrapper-small .ivu-input-prefix i,.ivu-input-wrapper-small .ivu-input-suffix i{font-size:14px;line-height:24px}.ivu-input-wrapper-large .ivu-input-prefix i,.ivu-input-wrapper-large .ivu-input-suffix i{font-size:18px;line-height:36px}.ivu-input-with-prefix{padding-left:32px}.ivu-input-with-suffix{padding-right:32px}.ivu-input-search{cursor:pointer;padding:0 16px!important;background:#2d8cf0!important;color:#fff!important;border-color:#2d8cf0!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;position:relative;z-index:2}.ivu-input-search i{font-size:16px}.ivu-input-search:hover{background:#57a3f3!important;border-color:#57a3f3!important}.ivu-input-search:active{background:#2b85e4!important;border-color:#2b85e4!important}.ivu-input-search-icon{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-input-search-icon:hover{color:inherit}.ivu-input-search:before{content:'';display:block;width:1px;position:absolute;top:-1px;bottom:-1px;left:-1px;background:inherit}.ivu-input-wrapper-small .ivu-input-search{padding:0 12px!important}.ivu-input-wrapper-small .ivu-input-search i{font-size:14px}.ivu-input-wrapper-large .ivu-input-search{padding:0 20px!important}.ivu-input-wrapper-large .ivu-input-search i{font-size:18px}.ivu-input-with-search:hover .ivu-input{border-color:#57a3f3}.ivu-input-group{display:table;width:100%;border-collapse:separate;position:relative;font-size:12px;top:1px}.ivu-input-group-large{font-size:14px}.ivu-input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ivu-input-group>[class*=col-]{padding-right:8px}.ivu-input-group-append,.ivu-input-group-prepend,.ivu-input-group>.ivu-input{display:table-cell}.ivu-input-group-with-prepend .ivu-input,.ivu-input-group-with-prepend.ivu-input-group-small .ivu-input{border-top-left-radius:0;border-bottom-left-radius:0}.ivu-input-group-with-append .ivu-input,.ivu-input-group-with-append.ivu-input-group-small .ivu-input{border-top-right-radius:0;border-bottom-right-radius:0}.ivu-input-group-append .ivu-btn,.ivu-input-group-prepend .ivu-btn{border-color:transparent;background-color:transparent;color:inherit;margin:-6px -7px}.ivu-input-group-append,.ivu-input-group-prepend{width:1px;white-space:nowrap;vertical-align:middle}.ivu-input-group .ivu-input{width:100%;float:left;margin-bottom:0;position:relative;z-index:2}.ivu-input-group-append,.ivu-input-group-prepend{padding:4px 7px;font-size:inherit;font-weight:400;line-height:1;color:#515a6e;text-align:center;background-color:#f8f8f9;border:1px solid #dcdee2;border-radius:4px}.ivu-input-group-append .ivu-select,.ivu-input-group-prepend .ivu-select{margin:-5px -7px}.ivu-input-group-append .ivu-select-selection,.ivu-input-group-prepend .ivu-select-selection{background-color:inherit;margin:-1px;border:1px solid transparent}.ivu-input-group-append .ivu-select-visible .ivu-select-selection,.ivu-input-group-prepend .ivu-select-visible .ivu-select-selection{-webkit-box-shadow:none;box-shadow:none}.ivu-input-group-prepend,.ivu-input-group>.ivu-input:first-child,.ivu-input-group>span>.ivu-input:first-child{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.ivu-input-group-prepend .ivu--select .ivu--select-selection,.ivu-input-group>.ivu-input:first-child .ivu--select .ivu--select-selection,.ivu-input-group>span>.ivu-input:first-child .ivu--select .ivu--select-selection{border-bottom-right-radius:0;border-top-right-radius:0}.ivu-input-group-prepend{border-right:0}.ivu-input-group-append{border-left:0}.ivu-input-group-append,.ivu-input-group>.ivu-input:last-child{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.ivu-input-group-append .ivu--select .ivu--select-selection,.ivu-input-group>.ivu-input:last-child .ivu--select .ivu--select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ivu-input-group-large .ivu-input,.ivu-input-group-large>.ivu-input-group-append,.ivu-input-group-large>.ivu-input-group-prepend{font-size:14px;padding:6px 7px;height:36px}.ivu-input-group-small .ivu-input,.ivu-input-group-small>.ivu-input-group-append,.ivu-input-group-small>.ivu-input-group-prepend{padding:1px 7px;height:24px;border-radius:3px}.ivu-form-item-error .ivu-input{border:1px solid #ed4014}.ivu-form-item-error .ivu-input:hover{border-color:#ed4014}.ivu-form-item-error .ivu-input:focus{border-color:#ed4014;outline:0;-webkit-box-shadow:0 0 0 2px rgba(237,64,20,.2);box-shadow:0 0 0 2px rgba(237,64,20,.2)}.ivu-form-item-error .ivu-input-icon{color:#ed4014}.ivu-form-item-error .ivu-input-group-append,.ivu-form-item-error .ivu-input-group-prepend{background-color:#fff;border:1px solid #ed4014}.ivu-form-item-error .ivu-input-group-append .ivu-select-selection,.ivu-form-item-error .ivu-input-group-prepend .ivu-select-selection{background-color:inherit;border:1px solid transparent}.ivu-form-item-error .ivu-input-group-prepend{border-right:0}.ivu-form-item-error .ivu-input-group-append{border-left:0}.ivu-form-item-error .ivu-transfer .ivu-input{display:inline-block;width:100%;height:32px;line-height:1.5;padding:4px 7px;font-size:12px;border:1px solid #dcdee2;border-radius:4px;color:#515a6e;background-color:#fff;background-image:none;position:relative;cursor:text;-webkit-transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,background .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-form-item-error .ivu-transfer .ivu-input::-moz-placeholder{color:#c5c8ce;opacity:1}.ivu-form-item-error .ivu-transfer .ivu-input:-ms-input-placeholder{color:#c5c8ce}.ivu-form-item-error .ivu-transfer .ivu-input::-webkit-input-placeholder{color:#c5c8ce}.ivu-form-item-error .ivu-transfer .ivu-input:hover{border-color:#57a3f3}.ivu-form-item-error .ivu-transfer .ivu-input:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-form-item-error .ivu-transfer .ivu-input[disabled],fieldset[disabled] .ivu-form-item-error .ivu-transfer .ivu-input{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-form-item-error .ivu-transfer .ivu-input[disabled]:hover,fieldset[disabled] .ivu-form-item-error .ivu-transfer .ivu-input:hover{border-color:#e3e5e8}textarea.ivu-form-item-error .ivu-transfer .ivu-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;font-size:14px}.ivu-form-item-error .ivu-transfer .ivu-input-large{font-size:14px;padding:6px 7px;height:36px}.ivu-form-item-error .ivu-transfer .ivu-input-small{padding:1px 7px;height:24px;border-radius:3px}.ivu-form-item-error .ivu-transfer .ivu-input-icon{color:#808695}.ivu-form-item-validating .ivu-input-icon-validate{display:inline-block}.ivu-form-item-validating .ivu-input-icon+.ivu-input{padding-right:32px}.ivu-slider{line-height:normal}.ivu-slider-wrap{width:100%;height:4px;margin:16px 0;background-color:#e8eaec;border-radius:3px;vertical-align:middle;position:relative;cursor:pointer}.ivu-slider-button-wrap{width:18px;height:18px;text-align:center;background-color:transparent;position:absolute;top:-4px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ivu-slider-button-wrap .ivu-tooltip{display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-slider-button{width:12px;height:12px;border:2px solid #57a3f3;border-radius:50%;background-color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear;outline:0}.ivu-slider-button-dragging,.ivu-slider-button:focus,.ivu-slider-button:hover{border-color:#2d8cf0;-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.ivu-slider-button:hover{cursor:-webkit-grab;cursor:grab}.ivu-slider-button-dragging,.ivu-slider-button-dragging:hover{cursor:-webkit-grabbing;cursor:grabbing}.ivu-slider-bar{height:4px;background:#57a3f3;border-radius:3px;position:absolute}.ivu-slider-stop{position:absolute;width:4px;height:4px;border-radius:50%;background-color:#ccc;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ivu-slider-disabled{cursor:not-allowed}.ivu-slider-disabled .ivu-slider-wrap{background-color:#ccc;cursor:not-allowed}.ivu-slider-disabled .ivu-slider-bar{background-color:#ccc}.ivu-slider-disabled .ivu-slider-button{border-color:#ccc}.ivu-slider-disabled .ivu-slider-button-dragging,.ivu-slider-disabled .ivu-slider-button:hover{border-color:#ccc}.ivu-slider-disabled .ivu-slider-button:hover{cursor:not-allowed}.ivu-slider-disabled .ivu-slider-button-dragging,.ivu-slider-disabled .ivu-slider-button-dragging:hover{cursor:not-allowed}.ivu-slider-input .ivu-slider-wrap{width:auto;margin-right:100px}.ivu-slider-input .ivu-input-number{float:right;margin-top:-14px}.selectDropDown{width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader{line-height:normal}.ivu-cascader-rel{display:inline-block;width:100%;position:relative}.ivu-cascader .ivu-input{display:block;cursor:pointer}.ivu-cascader-disabled .ivu-input{cursor:not-allowed}.ivu-cascader-label{width:100%;height:100%;line-height:32px;padding:0 7px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;cursor:pointer;font-size:12px;position:absolute;left:0;top:0}.ivu-cascader-size-large .ivu-cascader-label{line-height:36px;font-size:14px}.ivu-cascader-size-small .ivu-cascader-label{line-height:26px}.ivu-cascader .ivu-cascader-arrow:nth-of-type(1){display:none;cursor:pointer}.ivu-cascader:hover .ivu-cascader-arrow:nth-of-type(1){display:inline-block}.ivu-cascader-show-clear:hover .ivu-cascader-arrow:nth-of-type(2){display:none}.ivu-cascader-arrow{position:absolute;top:50%;right:8px;line-height:1;margin-top:-7px;font-size:14px;color:#808695;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-visible .ivu-cascader-arrow:nth-of-type(2){-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ivu-cascader .ivu-select-dropdown{width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader .ivu-cascader-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cascader .ivu-cascader-menu-item:hover{background:#f3f3f3}.ivu-cascader .ivu-cascader-menu-item-focus{background:#f3f3f3}.ivu-cascader .ivu-cascader-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cascader .ivu-cascader-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cascader .ivu-cascader-menu-item-selected,.ivu-cascader .ivu-cascader-menu-item-selected:hover{color:#2d8cf0}.ivu-cascader .ivu-cascader-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cascader .ivu-cascader-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cascader .ivu-cascader-large .ivu-cascader-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cascader .ivu-cascader-menu-item{white-space:normal}}.ivu-cascader .ivu-select-item span{color:#ed4014}.ivu-cascader-dropdown{padding:5px 0}.ivu-cascader-dropdown .ivu-select-dropdown-list{max-height:190px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.ivu-cascader-not-found-tip{padding:5px 0;text-align:center;color:#c5c8ce}.ivu-cascader-not-found-tip li:not([class^=ivu-]){list-style:none;margin-bottom:0}.ivu-cascader-not-found .ivu-select-dropdown{width:inherit}.ivu-cascader-menu{display:inline-block;min-width:100px;height:180px;margin:0;padding:5px 0!important;vertical-align:top;list-style:none;border-right:1px solid #e8eaec;overflow:auto}.ivu-cascader-menu:last-child{border-right-color:transparent;margin-right:-1px}.ivu-cascader-menu .ivu-cascader-menu-item{position:relative;padding-right:24px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-menu .ivu-cascader-menu-item i{font-size:12px;position:absolute;right:15px;top:50%;margin-top:-6px}.ivu-cascader-menu .ivu-cascader-menu-item-active{background-color:#f3f3f3;color:#2d8cf0}.ivu-cascader-transfer{z-index:1060;width:auto;padding:0;white-space:nowrap;overflow:visible}.ivu-cascader-transfer .ivu-cascader-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cascader-transfer .ivu-cascader-menu-item:hover{background:#f3f3f3}.ivu-cascader-transfer .ivu-cascader-menu-item-focus{background:#f3f3f3}.ivu-cascader-transfer .ivu-cascader-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cascader-transfer .ivu-cascader-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cascader-transfer .ivu-cascader-menu-item-selected,.ivu-cascader-transfer .ivu-cascader-menu-item-selected:hover{color:#2d8cf0}.ivu-cascader-transfer .ivu-cascader-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cascader-transfer .ivu-cascader-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cascader-transfer .ivu-cascader-large .ivu-cascader-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cascader-transfer .ivu-cascader-menu-item{white-space:normal}}.ivu-cascader-transfer .ivu-select-item span{color:#ed4014}.ivu-cascader-transfer .ivu-cascader-menu-item{padding-right:24px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-cascader-transfer .ivu-cascader-menu-item-active{background-color:#f3f3f3;color:#2d8cf0}.ivu-form-item-error .ivu-cascader-arrow{color:#ed4014}.ivu-transfer{position:relative;line-height:1.5}.ivu-transfer-list{display:inline-block;width:180px;height:210px;font-size:12px;vertical-align:middle;position:relative;padding-top:35px}.ivu-transfer-list-with-footer{padding-bottom:35px}.ivu-transfer-list-header{padding:8px 16px;background:#f9fafc;color:#515a6e;border:1px solid #dcdee2;border-bottom:1px solid #e8eaec;border-radius:6px 6px 0 0;overflow:hidden;position:absolute;top:0;left:0;width:100%}.ivu-transfer-list-header-title{cursor:pointer}.ivu-transfer-list-header>span{padding-left:4px}.ivu-transfer-list-header-count{margin:0!important;float:right}.ivu-transfer-list-body{height:100%;border:1px solid #dcdee2;border-top:none;border-radius:0 0 6px 6px;position:relative;overflow:hidden}.ivu-transfer-list-body-with-search{padding-top:34px}.ivu-transfer-list-body-with-footer{border-radius:0}.ivu-transfer-list-content{height:100%;padding:4px 0;overflow:auto}.ivu-transfer-list-content-item{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ivu-transfer-list-content-item>span{padding-left:4px}.ivu-transfer-list-content-not-found{display:none;text-align:center;color:#c5c8ce}li.ivu-transfer-list-content-not-found:only-child{display:block}.ivu-transfer-list-body-with-search .ivu-transfer-list-content{padding:6px 0 0}.ivu-transfer-list-body-search-wrapper{padding:8px 8px 0;position:absolute;top:0;left:0;right:0}.ivu-transfer-list-search{position:relative}.ivu-transfer-list-footer{border:1px solid #dcdee2;border-top:none;border-radius:0 0 6px 6px;position:absolute;bottom:0;left:0;right:0;zoom:1}.ivu-transfer-list-footer:after,.ivu-transfer-list-footer:before{content:\"\";display:table}.ivu-transfer-list-footer:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-transfer-operation{display:inline-block;margin:0 16px;vertical-align:middle}.ivu-transfer-operation .ivu-btn{display:block;min-width:24px}.ivu-transfer-operation .ivu-btn:first-child{margin-bottom:12px}.ivu-transfer-operation .ivu-btn span i,.ivu-transfer-operation .ivu-btn span span{vertical-align:middle}.ivu-transfer-list-content-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-transfer-list-content-item:hover{background:#f3f3f3}.ivu-transfer-list-content-item-focus{background:#f3f3f3}.ivu-transfer-list-content-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-transfer-list-content-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-transfer-list-content-item-selected,.ivu-transfer-list-content-item-selected:hover{color:#2d8cf0}.ivu-transfer-list-content-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-transfer-list-content-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-transfer-large .ivu-transfer-list-content-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-transfer-list-content-item{white-space:normal}}.ivu-table{width:inherit;height:100%;max-width:100%;overflow:hidden;color:#515a6e;font-size:12px;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-table-wrapper{position:relative;border:1px solid #dcdee2;border-bottom:0;border-right:0}.ivu-table-hide{opacity:0}.ivu-table:before{content:'';width:100%;height:1px;position:absolute;left:0;bottom:0;background-color:#dcdee2;z-index:1}.ivu-table:after{content:'';width:1px;height:100%;position:absolute;top:0;right:0;background-color:#dcdee2;z-index:3}.ivu-table-footer,.ivu-table-title{height:48px;line-height:48px;border-bottom:1px solid #e8eaec}.ivu-table-footer{border-bottom:none}.ivu-table-header{overflow:hidden}.ivu-table-overflowX{overflow-x:scroll}.ivu-table-overflowY{overflow-y:scroll}.ivu-table-tip{overflow-x:auto;overflow-y:hidden}.ivu-table-with-fixed-top.ivu-table-with-footer .ivu-table-footer{border-top:1px solid #dcdee2}.ivu-table-with-fixed-top.ivu-table-with-footer tbody tr:last-child td{border-bottom:none}.ivu-table td,.ivu-table th{min-width:0;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;text-overflow:ellipsis;vertical-align:middle;border-bottom:1px solid #e8eaec}.ivu-table th{height:40px;white-space:nowrap;overflow:hidden;background-color:#f8f8f9}.ivu-table td{background-color:#fff;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}td.ivu-table-column-left,th.ivu-table-column-left{text-align:left}td.ivu-table-column-center,th.ivu-table-column-center{text-align:center}td.ivu-table-column-right,th.ivu-table-column-right{text-align:right}.ivu-table table{table-layout:fixed}.ivu-table-border td,.ivu-table-border th{border-right:1px solid #e8eaec}.ivu-table-cell{padding-left:18px;padding-right:18px;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-table-cell-ellipsis{word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ivu-table-cell-tooltip{width:100%}.ivu-table-cell-tooltip-content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-table-cell-with-expand{height:47px;line-height:47px;padding:0;text-align:center}.ivu-table-cell-expand{cursor:pointer;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.ivu-table-cell-expand i{font-size:14px}.ivu-table-cell-expand-expanded{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-table-cell-sort{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-table-cell-with-selection .ivu-checkbox-wrapper{margin-right:0}.ivu-table-hidden{visibility:hidden}th .ivu-table-cell{display:inline-block;word-wrap:normal;vertical-align:middle}td.ivu-table-expanded-cell{padding:20px 50px;background:#f8f8f9}.ivu-table-stripe .ivu-table-body tr:nth-child(2n) td,.ivu-table-stripe .ivu-table-fixed-body tr:nth-child(2n) td{background-color:#f8f8f9}.ivu-table-stripe .ivu-table-body tr.ivu-table-row-hover td,.ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-hover td{background-color:#ebf7ff}tr.ivu-table-row-hover td{background-color:#ebf7ff}.ivu-table-large{font-size:14px}.ivu-table-large th{height:48px}.ivu-table-large td{height:60px}.ivu-table-large-footer,.ivu-table-large-title{height:60px;line-height:60px}.ivu-table-large .ivu-table-cell-with-expand{height:59px;line-height:59px}.ivu-table-large .ivu-table-cell-with-expand i{font-size:16px}.ivu-table-small th{height:32px}.ivu-table-small td{height:40px}.ivu-table-small-footer,.ivu-table-small-title{height:40px;line-height:40px}.ivu-table-small .ivu-table-cell-with-expand{height:39px;line-height:39px}.ivu-table-row-highlight td,.ivu-table-stripe .ivu-table-body tr.ivu-table-row-highlight:nth-child(2n) td,.ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-highlight:nth-child(2n) td,tr.ivu-table-row-highlight.ivu-table-row-hover td{background-color:#ebf7ff}.ivu-table-fixed,.ivu-table-fixed-right{position:absolute;top:0;left:0;-webkit-box-shadow:2px 0 6px -2px rgba(0,0,0,.2);box-shadow:2px 0 6px -2px rgba(0,0,0,.2)}.ivu-table-fixed-right::before,.ivu-table-fixed::before{content:'';width:100%;height:1px;background-color:#dcdee2;position:absolute;left:0;bottom:0;z-index:4}.ivu-table-fixed-right{top:0;left:auto;right:0;-webkit-box-shadow:-2px 0 6px -2px rgba(0,0,0,.2);box-shadow:-2px 0 6px -2px rgba(0,0,0,.2)}.ivu-table-fixed-right-header{position:absolute;top:-1px;right:0;background-color:#f8f8f9;border-top:1px solid #dcdee2;border-bottom:1px solid #e8eaec}.ivu-table-fixed-header{overflow:hidden}.ivu-table-fixed-header-with-empty .ivu-table-hidden .ivu-table-sort{display:none}.ivu-table-fixed-header-with-empty .ivu-table-hidden .ivu-table-cell span{display:none}.ivu-table-fixed-body{overflow:hidden;position:relative;z-index:3}.ivu-table-fixed-shadow{width:1px;height:100%;position:absolute;top:0;right:0;-webkit-box-shadow:1px 0 6px rgba(0,0,0,.2);box-shadow:1px 0 6px rgba(0,0,0,.2);overflow:hidden;z-index:1}.ivu-table-sort{display:inline-block;width:14px;height:12px;margin-top:-1px;vertical-align:middle;overflow:hidden;cursor:pointer;position:relative}.ivu-table-sort i{display:block;height:6px;line-height:6px;overflow:hidden;position:absolute;color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out;font-size:16px}.ivu-table-sort i:hover{color:inherit}.ivu-table-sort i.on{color:#2d8cf0}.ivu-table-sort i:first-child{top:0}.ivu-table-sort i:last-child{bottom:0}.ivu-table-filter{display:inline-block;cursor:pointer;position:relative}.ivu-table-filter i{color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-table-filter i:hover{color:inherit}.ivu-table-filter i.on{color:#2d8cf0}.ivu-table-filter-list{padding:8px 0 0}.ivu-table-filter-list-item{padding:0 12px 8px}.ivu-table-filter-list-item .ivu-checkbox-wrapper+.ivu-checkbox-wrapper{margin:0}.ivu-table-filter-list-item label{display:block}.ivu-table-filter-list-item label>span{margin-right:4px}.ivu-table-filter-list ul{padding-bottom:8px}.ivu-table-filter-list .ivu-table-filter-select-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-table-filter-list .ivu-table-filter-select-item:hover{background:#f3f3f3}.ivu-table-filter-list .ivu-table-filter-select-item-focus{background:#f3f3f3}.ivu-table-filter-list .ivu-table-filter-select-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-table-filter-list .ivu-table-filter-select-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-table-filter-list .ivu-table-filter-select-item-selected,.ivu-table-filter-list .ivu-table-filter-select-item-selected:hover{color:#2d8cf0}.ivu-table-filter-list .ivu-table-filter-select-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-table-filter-list .ivu-table-filter-select-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-table-filter-list .ivu-table-large .ivu-table-filter-select-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-table-filter-list .ivu-table-filter-select-item{white-space:normal}}.ivu-table-filter-footer{padding:4px;border-top:1px solid #e8eaec;overflow:hidden}.ivu-table-filter-footer button:first-child{float:left}.ivu-table-filter-footer button:last-child{float:right}.ivu-table-tip table{width:100%}.ivu-table-tip table td{text-align:center}.ivu-table-expanded-hidden{visibility:hidden}.ivu-table-popper{min-width:0;text-align:left}.ivu-table-popper .ivu-poptip-body{padding:0}.ivu-dropdown{display:inline-block}.ivu-dropdown .ivu-select-dropdown{overflow:visible;max-height:none}.ivu-dropdown .ivu-dropdown{width:100%}.ivu-dropdown-rel{position:relative}.ivu-dropdown-rel-user-select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ivu-dropdown-menu{min-width:100px}.ivu-dropdown-transfer{width:auto}.ivu-dropdown-item-selected,.ivu-dropdown-item.ivu-dropdown-item-selected:hover{background:#f0faff}.ivu-dropdown-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-dropdown-item:hover{background:#f3f3f3}.ivu-dropdown-item-focus{background:#f3f3f3}.ivu-dropdown-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-dropdown-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-dropdown-item-selected,.ivu-dropdown-item-selected:hover{color:#2d8cf0}.ivu-dropdown-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-dropdown-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-dropdown-large .ivu-dropdown-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-dropdown-item{white-space:normal}}.ivu-tabs{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;overflow:hidden;color:#515a6e;zoom:1}.ivu-tabs:after,.ivu-tabs:before{content:\"\";display:table}.ivu-tabs:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-tabs-bar{outline:0}.ivu-tabs-ink-bar{height:2px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#2d8cf0;position:absolute;left:0;bottom:1px;z-index:1;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ivu-tabs-bar{border-bottom:1px solid #dcdee2;margin-bottom:16px}.ivu-tabs-nav-container{margin-bottom:-1px;line-height:1.5;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;overflow:hidden;position:relative;zoom:1}.ivu-tabs-nav-container:after,.ivu-tabs-nav-container:before{content:\"\";display:table}.ivu-tabs-nav-container:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-tabs-nav-container:focus{outline:0}.ivu-tabs-nav-container:focus .ivu-tabs-tab-focused{border-color:#57a3f3!important}.ivu-tabs-nav-container-scrolling{padding-left:32px;padding-right:32px}.ivu-tabs-nav-wrap{overflow:hidden;margin-bottom:-1px}.ivu-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.ivu-tabs-nav-right{float:right;margin-left:5px}.ivu-tabs-nav-prev{position:absolute;line-height:32px;cursor:pointer;left:0}.ivu-tabs-nav-next{position:absolute;line-height:32px;cursor:pointer;right:0}.ivu-tabs-nav-scrollable{padding:0 12px}.ivu-tabs-nav-scroll-disabled{display:none}.ivu-tabs-nav{padding-left:0;margin:0;float:left;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;-webkit-transition:-webkit-transform .5s ease-in-out;transition:-webkit-transform .5s ease-in-out;transition:transform .5s ease-in-out;transition:transform .5s ease-in-out,-webkit-transform .5s ease-in-out}.ivu-tabs-nav:after,.ivu-tabs-nav:before{display:table;content:\" \"}.ivu-tabs-nav:after{clear:both}.ivu-tabs-nav .ivu-tabs-tab-disabled{pointer-events:none;cursor:default;color:#ccc}.ivu-tabs-nav .ivu-tabs-tab{display:inline-block;height:100%;padding:8px 16px;margin-right:16px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-decoration:none;position:relative;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out}.ivu-tabs-nav .ivu-tabs-tab:hover{color:#57a3f3}.ivu-tabs-nav .ivu-tabs-tab:active{color:#2b85e4}.ivu-tabs-nav .ivu-tabs-tab .ivu-icon{width:14px;height:14px;margin-right:8px}.ivu-tabs-nav .ivu-tabs-tab-active{color:#2d8cf0}.ivu-tabs-mini .ivu-tabs-nav-container{font-size:14px}.ivu-tabs-mini .ivu-tabs-tab{margin-right:0;padding:8px 16px;font-size:12px}.ivu-tabs .ivu-tabs-content-animated{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;will-change:transform;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.ivu-tabs .ivu-tabs-tabpane{-ms-flex-negative:0;flex-shrink:0;width:100%;-webkit-transition:opacity .3s;transition:opacity .3s;opacity:1;outline:0}.ivu-tabs .ivu-tabs-tabpane-inactive{opacity:0;height:0}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-nav-container{height:32px}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-ink-bar{visibility:hidden}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab{margin:0;margin-right:4px;height:31px;padding:5px 16px 4px;border:1px solid #dcdee2;border-bottom:0;border-radius:4px 4px 0 0;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:#f8f8f9}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab-active{height:32px;padding-bottom:5px;background:#fff;-webkit-transform:translateZ(0);transform:translateZ(0);border-color:#dcdee2;color:#2d8cf0}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-nav-wrap{margin-bottom:0}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab .ivu-icon-ios-close{width:0;height:22px;font-size:22px;margin-right:0;color:#999;text-align:right;vertical-align:middle;overflow:hidden;position:relative;top:-1px;-webkit-transform-origin:100% 50%;-ms-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab .ivu-icon-ios-close:hover{color:#444}.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab-active .ivu-icon-ios-close,.ivu-tabs.ivu-tabs-card>.ivu-tabs-bar .ivu-tabs-tab:hover .ivu-icon-ios-close{width:22px;-webkit-transform:translateZ(0);transform:translateZ(0);margin-right:-6px}.ivu-tabs-no-animation>.ivu-tabs-content{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.ivu-tabs-no-animation>.ivu-tabs-content>.ivu-tabs-tabpane-inactive{display:none}.ivu-menu{display:block;margin:0;padding:0;outline:0;list-style:none;color:#515a6e;font-size:14px;position:relative;z-index:900}.ivu-menu-horizontal{height:60px;line-height:60px}.ivu-menu-horizontal.ivu-menu-light:after{content:'';display:block;width:100%;height:1px;background:#dcdee2;position:absolute;bottom:0;left:0}.ivu-menu-vertical.ivu-menu-light:after{content:'';display:block;width:1px;height:100%;background:#dcdee2;position:absolute;top:0;bottom:0;right:0;z-index:1}.ivu-menu-light{background:#fff}.ivu-menu-dark{background:#515a6e}.ivu-menu-primary{background:#2d8cf0}.ivu-menu-item{display:block;outline:0;list-style:none;font-size:14px;position:relative;z-index:1;cursor:pointer;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.ivu-menu-item{color:inherit}a.ivu-menu-item:active,a.ivu-menu-item:hover{color:inherit}.ivu-menu-item>i{margin-right:6px}.ivu-menu-submenu-title span>i,.ivu-menu-submenu-title>i{margin-right:8px}.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-horizontal .ivu-menu-submenu{float:left;padding:0 20px;position:relative;cursor:pointer;z-index:3;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu{height:inherit;line-height:inherit;border-bottom:2px solid transparent;color:#515a6e}.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-light.ivu-menu-horizontal .ivu-menu-submenu:hover{color:#2d8cf0;border-bottom:2px solid #2d8cf0}.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu{color:rgba(255,255,255,.7)}.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-dark.ivu-menu-horizontal .ivu-menu-submenu:hover{color:#fff}.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-item,.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-submenu{color:#fff}.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-item-active,.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-item:hover,.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-submenu-active,.ivu-menu-primary.ivu-menu-horizontal .ivu-menu-submenu:hover{background:#2b85e4}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown{min-width:100%;width:auto;max-height:none}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{height:auto;line-height:normal;border-bottom:0;float:none}.ivu-menu-item-group{line-height:normal}.ivu-menu-item-group-title{height:30px;line-height:30px;padding-left:8px;font-size:12px;color:#999}.ivu-menu-item-group>ul{padding:0!important;list-style:none!important}.ivu-menu-vertical .ivu-menu-item,.ivu-menu-vertical .ivu-menu-submenu-title{padding:14px 24px;position:relative;cursor:pointer;z-index:1;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-menu-vertical .ivu-menu-item:hover,.ivu-menu-vertical .ivu-menu-submenu-title:hover{color:#2d8cf0}.ivu-menu-vertical .ivu-menu-submenu-title-icon{float:right;position:relative;top:4px}.ivu-menu-submenu-title-icon{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.ivu-menu-opened>*>.ivu-menu-submenu-title-icon{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ivu-menu-vertical .ivu-menu-submenu-nested{padding-left:20px}.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item{padding-left:43px}.ivu-menu-vertical .ivu-menu-item-group-title{height:48px;line-height:48px;font-size:14px;padding-left:28px}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-group-title{color:rgba(255,255,255,.36)}.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu){color:#2d8cf0;background:#f0faff;z-index:2}.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):after{content:'';display:block;width:2px;position:absolute;top:0;bottom:0;right:0;background:#2d8cf0}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title{color:rgba(255,255,255,.7)}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu):hover{background:#363e4f}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item:hover,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title:hover{color:#fff;background:#515a6e}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu),.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu){color:#2d8cf0}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item:hover{color:#fff;background:0 0!important}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active,.ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu .ivu-menu-item-active:hover{border-right:none;color:#fff;background:#2d8cf0!important}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-child-item-active>.ivu-menu-submenu-title{color:#fff}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened{background:#363e4f}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-title{background:#515a6e}.ivu-menu-dark.ivu-menu-vertical .ivu-menu-opened .ivu-menu-submenu-has-parent-submenu .ivu-menu-submenu-title{background:0 0}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item:hover{background:#f3f3f3}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-focus{background:#f3f3f3}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-selected,.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-selected:hover{color:#2d8cf0}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-menu-large .ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{white-space:normal}}.ivu-menu-horizontal .ivu-menu-submenu .ivu-select-dropdown .ivu-menu-item{padding:7px 16px 8px;font-size:14px!important}.ivu-date-picker{display:inline-block;line-height:normal}.ivu-date-picker-rel{position:relative}.ivu-date-picker .ivu-select-dropdown{width:auto;padding:0;overflow:visible;max-height:none}.ivu-date-picker-cells{width:196px;margin:10px;white-space:normal}.ivu-date-picker-cells span{display:inline-block;width:24px;height:24px}.ivu-date-picker-cells span em{display:inline-block;width:24px;height:24px;line-height:24px;margin:2px;font-style:normal;border-radius:3px;text-align:center;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-date-picker-cells-header span{line-height:24px;text-align:center;margin:2px;color:#c5c8ce}.ivu-date-picker-cells-cell:hover em{background:#e1f0fe}.ivu-date-picker-cells-focused em{-webkit-box-shadow:0 0 0 1px #2d8cf0 inset;box-shadow:0 0 0 1px #2d8cf0 inset}span.ivu-date-picker-cells-cell{width:28px;height:28px;cursor:pointer}.ivu-date-picker-cells-cell-next-month em,.ivu-date-picker-cells-cell-prev-month em{color:#c5c8ce}.ivu-date-picker-cells-cell-next-month:hover em,.ivu-date-picker-cells-cell-prev-month:hover em{background:0 0}span.ivu-date-picker-cells-cell-disabled,span.ivu-date-picker-cells-cell-disabled:hover,span.ivu-date-picker-cells-cell-week-label,span.ivu-date-picker-cells-cell-week-label:hover{cursor:not-allowed;color:#c5c8ce}span.ivu-date-picker-cells-cell-disabled em,span.ivu-date-picker-cells-cell-disabled:hover em,span.ivu-date-picker-cells-cell-week-label em,span.ivu-date-picker-cells-cell-week-label:hover em{color:inherit;background:inherit}span.ivu-date-picker-cells-cell-disabled,span.ivu-date-picker-cells-cell-disabled:hover{background:#f7f7f7}.ivu-date-picker-cells-cell-today em{position:relative}.ivu-date-picker-cells-cell-today em:after{content:'';display:block;width:6px;height:6px;border-radius:50%;background:#2d8cf0;position:absolute;top:1px;right:1px}.ivu-date-picker-cells-cell-range{position:relative}.ivu-date-picker-cells-cell-range em{position:relative;z-index:1}.ivu-date-picker-cells-cell-range:before{content:'';display:block;background:#e1f0fe;border-radius:0;border:0;position:absolute;top:2px;bottom:2px;left:0;right:0}.ivu-date-picker-cells-cell-selected em,.ivu-date-picker-cells-cell-selected:hover em{background:#2d8cf0;color:#fff}span.ivu-date-picker-cells-cell-disabled.ivu-date-picker-cells-cell-selected em{background:#c5c8ce;color:#f7f7f7}.ivu-date-picker-cells-cell-today.ivu-date-picker-cells-cell-selected em:after{background:#fff}.ivu-date-picker-cells-show-week-numbers{width:226px}.ivu-date-picker-cells-month,.ivu-date-picker-cells-year{margin-top:14px}.ivu-date-picker-cells-month span,.ivu-date-picker-cells-year span{width:40px;height:28px;line-height:28px;margin:10px 12px;border-radius:3px}.ivu-date-picker-cells-month span em,.ivu-date-picker-cells-year span em{width:40px;height:28px;line-height:28px;margin:0}.ivu-date-picker-cells-month .ivu-date-picker-cells-cell-focused,.ivu-date-picker-cells-year .ivu-date-picker-cells-cell-focused{background-color:#d5e8fc}.ivu-date-picker-header{height:32px;line-height:32px;text-align:center;border-bottom:1px solid #e8eaec}.ivu-date-picker-header-label{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-date-picker-header-label:hover{color:#2d8cf0}.ivu-date-picker-btn-pulse{background-color:#d5e8fc!important;border-radius:4px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.ivu-date-picker-prev-btn{float:left}.ivu-date-picker-prev-btn-arrow-double{margin-left:10px}.ivu-date-picker-prev-btn-arrow-double i:after{content:\"\\F115\";margin-left:-8px}.ivu-date-picker-next-btn{float:right}.ivu-date-picker-next-btn-arrow-double{margin-right:10px}.ivu-date-picker-next-btn-arrow-double i:after{content:\"\\F11F\";margin-left:-8px}.ivu-date-picker-with-range .ivu-picker-panel-body{min-width:432px}.ivu-date-picker-with-range .ivu-picker-panel-content{float:left}.ivu-date-picker-with-range .ivu-picker-cells-show-week-numbers{min-width:492px}.ivu-date-picker-with-week-numbers .ivu-picker-panel-body-date{min-width:492px}.ivu-date-picker-transfer{z-index:1060;max-height:none;width:auto}.ivu-date-picker-focused input{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-picker-panel-icon-btn{display:inline-block;width:20px;height:24px;line-height:26px;margin-top:4px;text-align:center;cursor:pointer;color:#c5c8ce;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-picker-panel-icon-btn:hover{color:#2d8cf0}.ivu-picker-panel-icon-btn i{font-size:14px}.ivu-picker-panel-body-wrapper.ivu-picker-panel-with-sidebar{padding-left:92px}.ivu-picker-panel-sidebar{width:92px;float:left;margin-left:-92px;position:absolute;top:0;bottom:0;background:#f8f8f9;border-right:1px solid #e8eaec;border-radius:4px 0 0 4px;overflow:auto}.ivu-picker-panel-shortcut{padding:6px 15px 6px 15px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-picker-panel-shortcut:hover{background:#e8eaec}.ivu-picker-panel-body{float:left}.ivu-picker-confirm{border-top:1px solid #e8eaec;text-align:right;padding:8px;clear:both}.ivu-picker-confirm>span{color:#2d8cf0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;float:left;padding:2px 0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-picker-confirm>span:hover{color:#57a3f3}.ivu-picker-confirm>span:active{color:#2b85e4}.ivu-picker-confirm-time{float:left}.ivu-time-picker-cells{min-width:112px}.ivu-time-picker-cells-with-seconds{min-width:168px}.ivu-time-picker-cells-list{width:56px;max-height:144px;float:left;overflow:hidden;border-left:1px solid #e8eaec;position:relative}.ivu-time-picker-cells-list:hover{overflow-y:auto}.ivu-time-picker-cells-list:first-child{border-left:none;border-radius:4px 0 0 4px}.ivu-time-picker-cells-list:last-child{border-radius:0 4px 4px 0}.ivu-time-picker-cells-list ul{width:100%;margin:0;padding:0 0 120px 0;list-style:none}.ivu-time-picker-cells-list ul li{width:100%;height:24px;line-height:24px;margin:0;padding:0 0 0 16px;-webkit-box-sizing:content-box;box-sizing:content-box;text-align:left;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;list-style:none;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-time-picker-cells-cell:hover{background:#f3f3f3}.ivu-time-picker-cells-cell-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-time-picker-cells-cell-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-time-picker-cells-cell-selected,.ivu-time-picker-cells-cell-selected:hover{color:#2d8cf0;background:#f3f3f3}.ivu-time-picker-cells-cell-focused{background-color:#d5e8fc}.ivu-time-picker-header{height:32px;line-height:32px;text-align:center;border-bottom:1px solid #e8eaec}.ivu-time-picker-with-range .ivu-picker-panel-body{min-width:228px}.ivu-time-picker-with-range .ivu-picker-panel-content{float:left;position:relative}.ivu-time-picker-with-range .ivu-picker-panel-content:after{content:'';display:block;width:2px;position:absolute;top:31px;bottom:0;right:-2px;background:#e8eaec;z-index:1}.ivu-time-picker-with-range .ivu-picker-panel-content-right{float:right}.ivu-time-picker-with-range .ivu-picker-panel-content-right:after{right:auto;left:-2px}.ivu-time-picker-with-range .ivu-time-picker-cells-list:first-child{border-radius:0}.ivu-time-picker-with-range .ivu-time-picker-cells-list:last-child{border-radius:0}.ivu-time-picker-with-range.ivu-time-picker-with-seconds .ivu-picker-panel-body{min-width:340px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells{min-width:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds{min-width:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds .ivu-time-picker-cells-list{width:72px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-with-seconds .ivu-time-picker-cells-list ul li{padding:0 0 0 28px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list{width:108px;max-height:216px}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list:first-child{border-radius:0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list:last-child{border-radius:0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list ul{padding:0 0 192px 0}.ivu-picker-panel-content .ivu-picker-panel-content .ivu-time-picker-cells-list ul li{padding:0 0 0 46px}.ivu-form .ivu-form-item-label{text-align:right;vertical-align:middle;float:left;font-size:12px;color:#515a6e;line-height:1;padding:10px 12px 10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.ivu-form-label-left .ivu-form-item-label{text-align:left}.ivu-form-label-top .ivu-form-item-label{float:none;display:inline-block;padding:0 0 10px 0}.ivu-form-inline .ivu-form-item{display:inline-block;margin-right:10px;vertical-align:top}.ivu-form-item{margin-bottom:24px;vertical-align:top;zoom:1}.ivu-form-item:after,.ivu-form-item:before{content:\"\";display:table}.ivu-form-item:after{clear:both;visibility:hidden;font-size:0;height:0}.ivu-form-item-content{position:relative;line-height:32px;font-size:12px}.ivu-form-item .ivu-form-item{margin-bottom:0}.ivu-form-item .ivu-form-item .ivu-form-item-content{margin-left:0!important}.ivu-form-item-error-tip{position:absolute;top:100%;left:0;line-height:1;padding-top:6px;color:#ed4014}.ivu-form-item-required .ivu-form-item-label:before{content:'*';display:inline-block;margin-right:4px;line-height:1;font-family:SimSun;font-size:12px;color:#ed4014}.ivu-carousel{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.ivu-carousel-list,.ivu-carousel-track{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ivu-carousel-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.ivu-carousel-track{position:relative;top:0;left:0;display:block;overflow:hidden;z-index:1}.ivu-carousel-track.higher{z-index:2}.ivu-carousel-item{float:left;height:100%;min-height:1px;display:block}.ivu-carousel-arrow{border:none;outline:0;padding:0;margin:0;width:36px;height:36px;border-radius:50%;cursor:pointer;display:none;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s;transition:.2s;background-color:rgba(31,45,61,.11);color:#fff;text-align:center;font-size:1em;font-family:inherit;line-height:inherit}.ivu-carousel-arrow:hover{background-color:rgba(31,45,61,.5)}.ivu-carousel-arrow>*{vertical-align:baseline}.ivu-carousel-arrow.left{left:16px}.ivu-carousel-arrow.right{right:16px}.ivu-carousel-arrow-always{display:inherit}.ivu-carousel-arrow-hover{display:inherit;opacity:0}.ivu-carousel:hover .ivu-carousel-arrow-hover{opacity:1}.ivu-carousel-dots{z-index:10;display:none;position:relative;list-style:none;text-align:center;padding:0;width:100%;height:17px}.ivu-carousel-dots-inside{display:block;position:absolute;bottom:3px}.ivu-carousel-dots-outside{display:block;margin-top:3px}.ivu-carousel-dots li{position:relative;display:inline-block;vertical-align:top;text-align:center;margin:0 2px;padding:7px 0;cursor:pointer}.ivu-carousel-dots li button{border:0;cursor:pointer;background:#8391a5;opacity:.3;display:block;width:16px;height:3px;border-radius:1px;outline:0;font-size:0;color:transparent;-webkit-transition:all .5s;transition:all .5s}.ivu-carousel-dots li button.radius{width:6px;height:6px;border-radius:50%}.ivu-carousel-dots li:hover>button{opacity:.7}.ivu-carousel-dots li.ivu-carousel-active>button{opacity:1;width:24px}.ivu-carousel-dots li.ivu-carousel-active>button.radius{width:6px}.ivu-rate{display:inline-block;margin:0;padding:0;font-size:20px;vertical-align:middle;font-weight:400;font-style:normal}.ivu-rate-disabled .ivu-rate-star-content:before,.ivu-rate-disabled .ivu-rate-star:before{cursor:default}.ivu-rate-disabled .ivu-rate-star:hover{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.ivu-rate-star-full,.ivu-rate-star-zero{position:relative}.ivu-rate-star-first{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden;opacity:0}.ivu-rate-star-first,.ivu-rate-star-second{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s ease;transition:all .3s ease;color:#e9e9e9;cursor:pointer}.ivu-rate-star-chart{display:inline-block;margin:0;padding:0;margin-right:8px;position:relative;font-family:Ionicons;-webkit-transition:all .3s ease;transition:all .3s ease}.ivu-rate-star-chart:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ivu-rate-star-chart.ivu-rate-star-full .ivu-rate-star-first,.ivu-rate-star-chart.ivu-rate-star-full .ivu-rate-star-second{color:#f5a623}.ivu-rate-star-chart.ivu-rate-star-half .ivu-rate-star-first{opacity:1;color:#f5a623}.ivu-rate-star{display:inline-block;margin:0;padding:0;margin-right:8px;position:relative;font-family:Ionicons;-webkit-transition:all .3s ease;transition:all .3s ease}.ivu-rate-star:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ivu-rate-star-content:before,.ivu-rate-star:before{color:#e9e9e9;cursor:pointer;content:\"\\F2BF\";-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:block}.ivu-rate-star-content{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden}.ivu-rate-star-content:before{color:transparent}.ivu-rate-star-full:before,.ivu-rate-star-half .ivu-rate-star-content:before{color:#f5a623}.ivu-rate-star-full:hover:before,.ivu-rate-star-half:hover .ivu-rate-star-content:before{color:#f7b84f}.ivu-rate-text{margin-left:8px;vertical-align:middle;display:inline-block;font-size:12px}.ivu-upload input[type=file]{display:none}.ivu-upload-list{margin-top:8px}.ivu-upload-list-file{padding:4px;color:#515a6e;border-radius:4px;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out;overflow:hidden;position:relative}.ivu-upload-list-file>span{cursor:pointer;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.ivu-upload-list-file>span i{display:inline-block;width:12px;height:12px;color:#515a6e;text-align:center}.ivu-upload-list-file:hover{background:#f3f3f3}.ivu-upload-list-file:hover>span{color:#2d8cf0}.ivu-upload-list-file:hover>span i{color:#515a6e}.ivu-upload-list-file:hover .ivu-upload-list-remove{opacity:1}.ivu-upload-list-remove{opacity:0;font-size:18px;cursor:pointer;float:right;margin-right:4px;color:#999;-webkit-transition:all .2s ease;transition:all .2s ease}.ivu-upload-list-remove:hover{color:#444}.ivu-upload-select{display:inline-block}.ivu-upload-drag{background:#fff;border:1px dashed #dcdee2;border-radius:4px;text-align:center;cursor:pointer;position:relative;overflow:hidden;-webkit-transition:border-color .2s ease;transition:border-color .2s ease}.ivu-upload-drag:hover{border:1px dashed #2d8cf0}.ivu-upload-dragOver{border:2px dashed #2d8cf0}.ivu-tree ul{list-style:none;margin:0;padding:0;font-size:12px}.ivu-tree ul li{list-style:none;margin:8px 0;padding:0;white-space:nowrap;outline:0}.ivu-tree li ul{margin:0;padding:0 0 0 18px}.ivu-tree-title{display:inline-block;margin:0;padding:0 4px;border-radius:3px;cursor:pointer;vertical-align:top;color:#515a6e;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.ivu-tree-title:hover{background-color:#eaf4fe}.ivu-tree-title-selected,.ivu-tree-title-selected:hover{background-color:#d5e8fc}.ivu-tree-arrow{cursor:pointer;width:12px;text-align:center;display:inline-block}.ivu-tree-arrow i{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;font-size:14px;vertical-align:middle}.ivu-tree-arrow-open i{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ivu-tree-arrow-disabled{cursor:not-allowed}.ivu-tree .ivu-checkbox-wrapper{margin-right:4px;margin-left:4px}.ivu-avatar{display:inline-block;text-align:center;background:#ccc;color:#fff;white-space:nowrap;position:relative;overflow:hidden;vertical-align:middle;width:32px;height:32px;line-height:32px;border-radius:16px}.ivu-avatar-image{background:0 0}.ivu-avatar .ivu-icon{position:relative;top:-1px}.ivu-avatar>*{line-height:32px}.ivu-avatar.ivu-avatar-icon{font-size:18px}.ivu-avatar-large{width:40px;height:40px;line-height:40px;border-radius:20px}.ivu-avatar-large>*{line-height:40px}.ivu-avatar-large.ivu-avatar-icon{font-size:24px}.ivu-avatar-large .ivu-icon{position:relative;top:-2px}.ivu-avatar-small{width:24px;height:24px;line-height:24px;border-radius:12px}.ivu-avatar-small>*{line-height:24px}.ivu-avatar-small.ivu-avatar-icon{font-size:14px}.ivu-avatar-square{border-radius:4px}.ivu-avatar>img{width:100%;height:100%}.ivu-color-picker{display:inline-block}.ivu-color-picker-hide{display:none}.ivu-color-picker-hide-drop{visibility:hidden}.ivu-color-picker-disabled{background-color:#f3f3f3;opacity:1;cursor:not-allowed;color:#ccc}.ivu-color-picker-disabled:hover{border-color:#e3e5e8}.ivu-color-picker>div:first-child:hover .ivu-input{border-color:#57a3f3}.ivu-color-picker>div:first-child.ivu-color-picker-disabled:hover .ivu-input{border-color:#e3e5e8}.ivu-color-picker .ivu-select-dropdown{padding:0}.ivu-color-picker-input.ivu-input:focus{-webkit-box-shadow:none;box-shadow:none}.ivu-color-picker-focused{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-rel{line-height:0}.ivu-color-picker-color{width:18px;height:18px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px;position:relative;top:2px}.ivu-color-picker-color div{width:100%;height:100%;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);border-radius:2px}.ivu-color-picker-color-empty{background:#fff;overflow:hidden;text-align:center}.ivu-color-picker-color-empty i{font-size:18px;vertical-align:baseline}.ivu-color-picker-color-focused{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-large .ivu-color-picker-color{width:20px;height:20px;top:1px}.ivu-color-picker-large .ivu-color-picker-color-empty i{font-size:20px}.ivu-color-picker-small .ivu-color-picker-color{width:14px;height:14px;top:3px}.ivu-color-picker-small .ivu-color-picker-color-empty i{font-size:14px}.ivu-color-picker-picker-wrapper{padding:8px 8px 0}.ivu-color-picker-picker-panel{width:240px;margin:0 auto;-webkit-box-sizing:initial;box-sizing:initial;position:relative}.ivu-color-picker-picker-alpha-slider,.ivu-color-picker-picker-hue-slider{height:10px;margin-top:8px;position:relative}.ivu-color-picker-picker-colors{margin-top:8px;overflow:hidden;border-radius:2px;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-picker-colors:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-picker-colors-wrapper{display:inline;width:20px;height:20px;float:left;position:relative}.ivu-color-picker-picker-colors-wrapper-color{outline:0;display:block;position:absolute;width:16px;height:16px;margin:2px;cursor:pointer;border-radius:2px;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.ivu-color-picker-picker-colors-wrapper-circle{width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);-ms-transform:translate(-2px,-2px);transform:translate(-2px,-2px);position:absolute;top:10px;left:10px;cursor:pointer}.ivu-color-picker-picker .ivu-picker-confirm{margin-top:8px}.ivu-color-picker-saturation-wrapper{width:100%;padding-bottom:75%;position:relative;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-saturation-wrapper:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-saturation,.ivu-color-picker-saturation--black,.ivu-color-picker-saturation--white{cursor:pointer;position:absolute;top:0;left:0;right:0;bottom:0}.ivu-color-picker-saturation--white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.ivu-color-picker-saturation--black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.ivu-color-picker-saturation-pointer{cursor:pointer;position:absolute}.ivu-color-picker-saturation-circle{width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);-ms-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.ivu-color-picker-hue{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-hue:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-hue-container{cursor:pointer;margin:0 2px;position:relative;height:100%}.ivu-color-picker-hue-pointer{z-index:2;position:absolute}.ivu-color-picker-hue-picker{cursor:pointer;margin-top:1px;width:4px;border-radius:1px;height:8px;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);background:#fff;-webkit-transform:translateX(-2px);-ms-transform:translateX(-2px);transform:translateX(-2px)}.ivu-color-picker-alpha{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;-webkit-transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,-webkit-box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out;transition:border .2s ease-in-out,box-shadow .2s ease-in-out,-webkit-box-shadow .2s ease-in-out}.ivu-color-picker-alpha:focus{border-color:#57a3f3;outline:0;-webkit-box-shadow:0 0 0 2px rgba(45,140,240,.2);box-shadow:0 0 0 2px rgba(45,140,240,.2)}.ivu-color-picker-alpha-checkboard-wrap{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border-radius:2px}.ivu-color-picker-alpha-checkerboard{position:absolute;top:0;right:0;bottom:0;left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.ivu-color-picker-alpha-gradient{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px}.ivu-color-picker-alpha-container{cursor:pointer;position:relative;z-index:2;height:100%;margin:0 3px}.ivu-color-picker-alpha-pointer{z-index:2;position:absolute}.ivu-color-picker-alpha-picker{cursor:pointer;width:4px;border-radius:1px;height:8px;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);background:#fff;margin-top:1px;-webkit-transform:translateX(-2px);-ms-transform:translateX(-2px);transform:translateX(-2px)}.ivu-color-picker-confirm{margin-top:8px;position:relative;border-top:1px solid #e8eaec;text-align:right;padding:8px;clear:both}.ivu-color-picker-confirm-color{position:absolute;top:11px;left:8px}.ivu-color-picker-confirm-color-editable{top:8px}.ivu-auto-complete .ivu-select-not-found{display:none}.ivu-auto-complete .ivu-icon-ios-close{display:none}.ivu-auto-complete:hover .ivu-icon-ios-close{display:inline-block}.ivu-auto-complete.ivu-select-dropdown{max-height:none}.ivu-divider{font-family:\"Helvetica Neue\",Helvetica,\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",\"微软雅黑\",Arial,sans-serif;font-size:14px;line-height:1.5;color:#515a6e;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;background:#e8eaec}.ivu-divider,.ivu-divider-vertical{margin:0 8px;display:inline-block;height:.9em;width:1px;vertical-align:middle;position:relative;top:-.06em}.ivu-divider-horizontal{display:block;height:1px;width:100%;margin:24px 0;clear:both}.ivu-divider-horizontal.ivu-divider-with-text-center,.ivu-divider-horizontal.ivu-divider-with-text-left,.ivu-divider-horizontal.ivu-divider-with-text-right{display:table;white-space:nowrap;text-align:center;background:0 0;font-weight:500;color:#17233d;font-size:16px;margin:16px 0}.ivu-divider-horizontal.ivu-divider-with-text-center:after,.ivu-divider-horizontal.ivu-divider-with-text-center:before,.ivu-divider-horizontal.ivu-divider-with-text-left:after,.ivu-divider-horizontal.ivu-divider-with-text-left:before,.ivu-divider-horizontal.ivu-divider-with-text-right:after,.ivu-divider-horizontal.ivu-divider-with-text-right:before{content:'';display:table-cell;position:relative;top:50%;width:50%;border-top:1px solid #e8eaec;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.ivu-divider-horizontal.ivu-divider-with-text-left,.ivu-divider-horizontal.ivu-divider-with-text-right{font-size:14px}.ivu-divider-horizontal.ivu-divider-with-text-left .ivu-divider-inner-text,.ivu-divider-horizontal.ivu-divider-with-text-right .ivu-divider-inner-text{display:inline-block;padding:0 10px}.ivu-divider-horizontal.ivu-divider-with-text-left:before{top:50%;width:5%}.ivu-divider-horizontal.ivu-divider-with-text-left:after{top:50%;width:95%}.ivu-divider-horizontal.ivu-divider-with-text-right:before{top:50%;width:95%}.ivu-divider-horizontal.ivu-divider-with-text-right:after{top:50%;width:5%}.ivu-divider-inner-text{display:inline-block;padding:0 24px}.ivu-divider-dashed{background:0 0;border-top:1px dashed #e8eaec}.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed{border-top:0}.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text-left.ivu-divider-dashed:before,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text-right.ivu-divider-dashed:before,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed:after,.ivu-divider-horizontal.ivu-divider-with-text.ivu-divider-dashed:before{border-style:dashed none none}.ivu-anchor{position:relative;padding-left:2px}.ivu-anchor-wrapper{overflow:auto;padding-left:4px;margin-left:-4px}.ivu-anchor-ink{position:absolute;height:100%;left:0;top:0}.ivu-anchor-ink:before{content:' ';position:relative;width:2px;height:100%;display:block;background-color:#e8eaec;margin:0 auto}.ivu-anchor-ink-ball{display:inline-block;position:absolute;width:8px;height:8px;border-radius:50%;border:2px solid #2d8cf0;background-color:#fff;left:50%;-webkit-transition:top .2s ease-in-out;transition:top .2s ease-in-out;-webkit-transform:translate(-50%,2px);-ms-transform:translate(-50%,2px);transform:translate(-50%,2px)}.ivu-anchor.fixed .ivu-anchor-ink .ivu-anchor-ink-ball{display:none}.ivu-anchor-link{padding:8px 0 8px 16px;line-height:1}.ivu-anchor-link-title{display:block;position:relative;-webkit-transition:all .3s;transition:all .3s;color:#515a6e;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:8px}.ivu-anchor-link-title:only-child{margin-bottom:0}.ivu-anchor-link-active>.ivu-anchor-link-title{color:#2d8cf0}.ivu-anchor-link .ivu-anchor-link{padding-top:6px;padding-bottom:6px}.ivu-time-with-hash{cursor:pointer}.ivu-time-with-hash:hover{text-decoration:underline}.ivu-cell{position:relative;overflow:hidden}.ivu-cell-link,.ivu-cell-link:active,.ivu-cell-link:hover{color:inherit}.ivu-cell-icon{display:inline-block;margin-right:4px;font-size:14px;vertical-align:middle}.ivu-cell-icon:empty{display:none}.ivu-cell-main{display:inline-block;vertical-align:middle}.ivu-cell-title{line-height:24px;font-size:14px}.ivu-cell-label{line-height:1.2;font-size:12px;color:#808695}.ivu-cell-selected .ivu-cell-label{color:inherit}.ivu-cell-selected,.ivu-cell.ivu-cell-selected:hover{background:#f0faff}.ivu-cell-footer{display:inline-block;position:absolute;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;right:16px;color:#515a6e}.ivu-cell-with-link .ivu-cell-footer{right:32px}.ivu-cell-selected .ivu-cell-footer{color:inherit}.ivu-cell-arrow{display:inline-block;position:absolute;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;right:16px;font-size:14px}.ivu-cell:focus{background:#f3f3f3;outline:0}.ivu-cell-selected:focus{background:rgba(40,123,211,.91)}.ivu-cell{margin:0;line-height:normal;padding:7px 16px;clear:both;color:#515a6e;font-size:12px!important;white-space:nowrap;list-style:none;cursor:pointer;-webkit-transition:background .2s ease-in-out;transition:background .2s ease-in-out}.ivu-cell:hover{background:#f3f3f3}.ivu-cell-focus{background:#f3f3f3}.ivu-cell-disabled{color:#c5c8ce;cursor:not-allowed}.ivu-cell-disabled:hover{color:#c5c8ce;background-color:#fff;cursor:not-allowed}.ivu-cell-selected,.ivu-cell-selected:hover{color:#2d8cf0}.ivu-cell-divided{margin-top:5px;border-top:1px solid #e8eaec}.ivu-cell-divided:before{content:'';height:5px;display:block;margin:0 -16px;background-color:#fff;position:relative;top:-7px}.ivu-cell-large .ivu-cell{padding:7px 16px 8px;font-size:14px!important}@-moz-document url-prefix(){.ivu-cell{white-space:normal}}.ivu-drawer{width:auto;height:100%;position:fixed;top:0}.ivu-drawer-inner{position:absolute}.ivu-drawer-left{left:0}.ivu-drawer-right{right:0}.ivu-drawer-hidden{display:none!important}.ivu-drawer-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ivu-drawer-wrap-inner{position:absolute}.ivu-drawer-wrap *{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.ivu-drawer-mask{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(55,55,55,.6);height:100%;z-index:1000}.ivu-drawer-mask-hidden{display:none}.ivu-drawer-mask-inner{position:absolute}.ivu-drawer-content{width:100%;height:100%;position:absolute;top:0;bottom:0;background-color:#fff;border:0;background-clip:padding-box;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}.ivu-drawer-content-no-mask{pointer-events:auto}.ivu-drawer-header{border-bottom:1px solid #e8eaec;padding:14px 16px;line-height:1}.ivu-drawer-header p,.ivu-drawer-header-inner{display:inline-block;width:100%;height:20px;line-height:20px;font-size:14px;color:#17233d;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ivu-drawer-header p i,.ivu-drawer-header p span{vertical-align:middle}.ivu-drawer-close{z-index:1;font-size:12px;position:absolute;right:8px;top:8px;overflow:hidden;cursor:pointer}.ivu-drawer-close .ivu-icon-ios-close{font-size:31px;color:#999;-webkit-transition:color .2s ease;transition:color .2s ease;position:relative;top:1px}.ivu-drawer-close .ivu-icon-ios-close:hover{color:#444}.ivu-drawer-body{width:100%;height:calc(100% - 51px);padding:16px;font-size:12px;line-height:1.5;word-wrap:break-word;position:absolute;overflow:auto}.ivu-drawer-no-header .ivu-drawer-body{height:100%}.ivu-drawer-no-mask{pointer-events:none}"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/jquery/3.3.1/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n    \"use strict\";\n\n    if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n        // For CommonJS and CommonJS-like environments where a proper `window`\n        // is present, execute the factory and get jQuery.\n        // For environments that do not have a `window` with a `document`\n        // (such as Node.js), expose a factory as module.exports.\n        // This accentuates the need for the creation of a real `window`.\n        // e.g. var jQuery = require(\"jquery\")(window);\n        // See ticket #14549 for more info.\n        module.exports = global.document ?\n            factory( global, true ) :\n            function( w ) {\n                if ( !w.document ) {\n                    throw new Error( \"jQuery requires a window with a document\" );\n                }\n                return factory( w );\n            };\n    } else {\n        factory( global );\n    }\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n    \"use strict\";\n\n    var arr = [];\n\n    var document = window.document;\n\n    var getProto = Object.getPrototypeOf;\n\n    var slice = arr.slice;\n\n    var concat = arr.concat;\n\n    var push = arr.push;\n\n    var indexOf = arr.indexOf;\n\n    var class2type = {};\n\n    var toString = class2type.toString;\n\n    var hasOwn = class2type.hasOwnProperty;\n\n    var fnToString = hasOwn.toString;\n\n    var ObjectFunctionString = fnToString.call( Object );\n\n    var support = {};\n\n    var isFunction = function isFunction( obj ) {\n\n        // Support: Chrome <=57, Firefox <=52\n        // In some browsers, typeof returns \"function\" for HTML <object> elements\n        // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n        // We don't want to classify *any* DOM node as a function.\n        return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n    };\n\n\n    var isWindow = function isWindow( obj ) {\n        return obj != null && obj === obj.window;\n    };\n\n\n\n\n    var preservedScriptAttributes = {\n        type: true,\n        src: true,\n        noModule: true\n    };\n\n    function DOMEval( code, doc, node ) {\n        doc = doc || document;\n\n        var i,\n            script = doc.createElement( \"script\" );\n\n        script.text = code;\n        if ( node ) {\n            for ( i in preservedScriptAttributes ) {\n                if ( node[ i ] ) {\n                    script[ i ] = node[ i ];\n                }\n            }\n        }\n        doc.head.appendChild( script ).parentNode.removeChild( script );\n    }\n\n\n    function toType( obj ) {\n        if ( obj == null ) {\n            return obj + \"\";\n        }\n\n        // Support: Android <=2.3 only (functionish RegExp)\n        return typeof obj === \"object\" || typeof obj === \"function\" ?\n        class2type[ toString.call( obj ) ] || \"object\" :\n            typeof obj;\n    }\n    /* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\n    var\n        version = \"3.3.1\",\n\n    // Define a local copy of jQuery\n        jQuery = function( selector, context ) {\n\n            // The jQuery object is actually just the init constructor 'enhanced'\n            // Need init if jQuery is called (just allow error to be thrown if not included)\n            return new jQuery.fn.init( selector, context );\n        },\n\n    // Support: Android <=4.0 only\n    // Make sure we trim BOM and NBSP\n        rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n    jQuery.fn = jQuery.prototype = {\n\n        // The current version of jQuery being used\n        jquery: version,\n\n        constructor: jQuery,\n\n        // The default length of a jQuery object is 0\n        length: 0,\n\n        toArray: function() {\n            return slice.call( this );\n        },\n\n        // Get the Nth element in the matched element set OR\n        // Get the whole matched element set as a clean array\n        get: function( num ) {\n\n            // Return all the elements in a clean array\n            if ( num == null ) {\n                return slice.call( this );\n            }\n\n            // Return just the one element from the set\n            return num < 0 ? this[ num + this.length ] : this[ num ];\n        },\n\n        // Take an array of elements and push it onto the stack\n        // (returning the new matched element set)\n        pushStack: function( elems ) {\n\n            // Build a new jQuery matched element set\n            var ret = jQuery.merge( this.constructor(), elems );\n\n            // Add the old object onto the stack (as a reference)\n            ret.prevObject = this;\n\n            // Return the newly-formed element set\n            return ret;\n        },\n\n        // Execute a callback for every element in the matched set.\n        each: function( callback ) {\n            return jQuery.each( this, callback );\n        },\n\n        map: function( callback ) {\n            return this.pushStack( jQuery.map( this, function( elem, i ) {\n                return callback.call( elem, i, elem );\n            } ) );\n        },\n\n        slice: function() {\n            return this.pushStack( slice.apply( this, arguments ) );\n        },\n\n        first: function() {\n            return this.eq( 0 );\n        },\n\n        last: function() {\n            return this.eq( -1 );\n        },\n\n        eq: function( i ) {\n            var len = this.length,\n                j = +i + ( i < 0 ? len : 0 );\n            return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n        },\n\n        end: function() {\n            return this.prevObject || this.constructor();\n        },\n\n        // For internal use only.\n        // Behaves like an Array's method, not like a jQuery method.\n        push: push,\n        sort: arr.sort,\n        splice: arr.splice\n    };\n\n    jQuery.extend = jQuery.fn.extend = function() {\n        var options, name, src, copy, copyIsArray, clone,\n            target = arguments[ 0 ] || {},\n            i = 1,\n            length = arguments.length,\n            deep = false;\n\n        // Handle a deep copy situation\n        if ( typeof target === \"boolean\" ) {\n            deep = target;\n\n            // Skip the boolean and the target\n            target = arguments[ i ] || {};\n            i++;\n        }\n\n        // Handle case when target is a string or something (possible in deep copy)\n        if ( typeof target !== \"object\" && !isFunction( target ) ) {\n            target = {};\n        }\n\n        // Extend jQuery itself if only one argument is passed\n        if ( i === length ) {\n            target = this;\n            i--;\n        }\n\n        for ( ; i < length; i++ ) {\n\n            // Only deal with non-null/undefined values\n            if ( ( options = arguments[ i ] ) != null ) {\n\n                // Extend the base object\n                for ( name in options ) {\n                    src = target[ name ];\n                    copy = options[ name ];\n\n                    // Prevent never-ending loop\n                    if ( target === copy ) {\n                        continue;\n                    }\n\n                    // Recurse if we're merging plain objects or arrays\n                    if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n                        ( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n                        if ( copyIsArray ) {\n                            copyIsArray = false;\n                            clone = src && Array.isArray( src ) ? src : [];\n\n                        } else {\n                            clone = src && jQuery.isPlainObject( src ) ? src : {};\n                        }\n\n                        // Never move original objects, clone them\n                        target[ name ] = jQuery.extend( deep, clone, copy );\n\n                        // Don't bring in undefined values\n                    } else if ( copy !== undefined ) {\n                        target[ name ] = copy;\n                    }\n                }\n            }\n        }\n\n        // Return the modified object\n        return target;\n    };\n\n    jQuery.extend( {\n\n        // Unique for each copy of jQuery on the pages\n        expando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n        // Assume jQuery is ready without the ready module\n        isReady: true,\n\n        error: function( msg ) {\n            throw new Error( msg );\n        },\n\n        noop: function() {},\n\n        isPlainObject: function( obj ) {\n            var proto, Ctor;\n\n            // Detect obvious negatives\n            // Use toString instead of jQuery.type to catch host objects\n            if ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n                return false;\n            }\n\n            proto = getProto( obj );\n\n            // Objects with no prototype (e.g., `Object.create( null )`) are plain\n            if ( !proto ) {\n                return true;\n            }\n\n            // Objects with prototype are plain iff they were constructed by a global Object function\n            Ctor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n            return typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n        },\n\n        isEmptyObject: function( obj ) {\n\n            /* eslint-disable no-unused-vars */\n            // See https://github.com/eslint/eslint/issues/6125\n            var name;\n\n            for ( name in obj ) {\n                return false;\n            }\n            return true;\n        },\n\n        // Evaluates a script in a global context\n        globalEval: function( code ) {\n            DOMEval( code );\n        },\n\n        each: function( obj, callback ) {\n            var length, i = 0;\n\n            if ( isArrayLike( obj ) ) {\n                length = obj.length;\n                for ( ; i < length; i++ ) {\n                    if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n                        break;\n                    }\n                }\n            } else {\n                for ( i in obj ) {\n                    if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n                        break;\n                    }\n                }\n            }\n\n            return obj;\n        },\n\n        // Support: Android <=4.0 only\n        trim: function( text ) {\n            return text == null ?\n                \"\" :\n                ( text + \"\" ).replace( rtrim, \"\" );\n        },\n\n        // results is for internal usage only\n        makeArray: function( arr, results ) {\n            var ret = results || [];\n\n            if ( arr != null ) {\n                if ( isArrayLike( Object( arr ) ) ) {\n                    jQuery.merge( ret,\n                        typeof arr === \"string\" ?\n                            [ arr ] : arr\n                    );\n                } else {\n                    push.call( ret, arr );\n                }\n            }\n\n            return ret;\n        },\n\n        inArray: function( elem, arr, i ) {\n            return arr == null ? -1 : indexOf.call( arr, elem, i );\n        },\n\n        // Support: Android <=4.0 only, PhantomJS 1 only\n        // push.apply(_, arraylike) throws on ancient WebKit\n        merge: function( first, second ) {\n            var len = +second.length,\n                j = 0,\n                i = first.length;\n\n            for ( ; j < len; j++ ) {\n                first[ i++ ] = second[ j ];\n            }\n\n            first.length = i;\n\n            return first;\n        },\n\n        grep: function( elems, callback, invert ) {\n            var callbackInverse,\n                matches = [],\n                i = 0,\n                length = elems.length,\n                callbackExpect = !invert;\n\n            // Go through the array, only saving the items\n            // that pass the validator function\n            for ( ; i < length; i++ ) {\n                callbackInverse = !callback( elems[ i ], i );\n                if ( callbackInverse !== callbackExpect ) {\n                    matches.push( elems[ i ] );\n                }\n            }\n\n            return matches;\n        },\n\n        // arg is for internal usage only\n        map: function( elems, callback, arg ) {\n            var length, value,\n                i = 0,\n                ret = [];\n\n            // Go through the array, translating each of the items to their new values\n            if ( isArrayLike( elems ) ) {\n                length = elems.length;\n                for ( ; i < length; i++ ) {\n                    value = callback( elems[ i ], i, arg );\n\n                    if ( value != null ) {\n                        ret.push( value );\n                    }\n                }\n\n                // Go through every key on the object,\n            } else {\n                for ( i in elems ) {\n                    value = callback( elems[ i ], i, arg );\n\n                    if ( value != null ) {\n                        ret.push( value );\n                    }\n                }\n            }\n\n            // Flatten any nested arrays\n            return concat.apply( [], ret );\n        },\n\n        // A global GUID counter for objects\n        guid: 1,\n\n        // jQuery.support is not used in Core but other projects attach their\n        // properties to it so it needs to exist.\n        support: support\n    } );\n\n    if ( typeof Symbol === \"function\" ) {\n        jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n    }\n\n// Populate the class2type map\n    jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n        function( i, name ) {\n            class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n        } );\n\n    function isArrayLike( obj ) {\n\n        // Support: real iOS 8.2 only (not reproducible in simulator)\n        // `in` check used to prevent JIT error (gh-2145)\n        // hasOwn isn't used here due to false negatives\n        // regarding Nodelist length in IE\n        var length = !!obj && \"length\" in obj && obj.length,\n            type = toType( obj );\n\n        if ( isFunction( obj ) || isWindow( obj ) ) {\n            return false;\n        }\n\n        return type === \"array\" || length === 0 ||\n            typeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n    }\n    var Sizzle =\n        /*!\n         * Sizzle CSS Selector Engine v2.3.3\n         * https://sizzlejs.com/\n         *\n         * Copyright jQuery Foundation and other contributors\n         * Released under the MIT license\n         * http://jquery.org/license\n         *\n         * Date: 2016-08-08\n         */\n        (function( window ) {\n\n            var i,\n                support,\n                Expr,\n                getText,\n                isXML,\n                tokenize,\n                compile,\n                select,\n                outermostContext,\n                sortInput,\n                hasDuplicate,\n\n            // Local document vars\n                setDocument,\n                document,\n                docElem,\n                documentIsHTML,\n                rbuggyQSA,\n                rbuggyMatches,\n                matches,\n                contains,\n\n            // Instance-specific data\n                expando = \"sizzle\" + 1 * new Date(),\n                preferredDoc = window.document,\n                dirruns = 0,\n                done = 0,\n                classCache = createCache(),\n                tokenCache = createCache(),\n                compilerCache = createCache(),\n                sortOrder = function( a, b ) {\n                    if ( a === b ) {\n                        hasDuplicate = true;\n                    }\n                    return 0;\n                },\n\n            // Instance methods\n                hasOwn = ({}).hasOwnProperty,\n                arr = [],\n                pop = arr.pop,\n                push_native = arr.push,\n                push = arr.push,\n                slice = arr.slice,\n            // Use a stripped-down indexOf as it's faster than native\n            // https://jsperf.com/thor-indexof-vs-for/5\n                indexOf = function( list, elem ) {\n                    var i = 0,\n                        len = list.length;\n                    for ( ; i < len; i++ ) {\n                        if ( list[i] === elem ) {\n                            return i;\n                        }\n                    }\n                    return -1;\n                },\n\n                booleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n            // Regular expressions\n\n            // http://www.w3.org/TR/css3-selectors/#whitespace\n                whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n            // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n                identifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n            // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n                attributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n                    // Operator (capture 2)\n                    \"*([*^$|!~]?=)\" + whitespace +\n                    // \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n                    \"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n                    \"*\\\\]\",\n\n                pseudos = \":(\" + identifier + \")(?:\\\\((\" +\n                    // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n                    // 1. quoted (capture 3; capture 4 or capture 5)\n                    \"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n                    // 2. simple (capture 6)\n                    \"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n                    // 3. anything else (capture 2)\n                    \".*\" +\n                    \")\\\\)|)\",\n\n            // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n                rwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n                rtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n                rcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n                rcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n                rattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n                rpseudo = new RegExp( pseudos ),\n                ridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n                matchExpr = {\n                    \"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n                    \"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n                    \"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n                    \"ATTR\": new RegExp( \"^\" + attributes ),\n                    \"PSEUDO\": new RegExp( \"^\" + pseudos ),\n                    \"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n                        \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n                        \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n                    \"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n                    // For use in libraries implementing .is()\n                    // We use this for POS matching in `select`\n                    \"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n                        whitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n                },\n\n                rinputs = /^(?:input|select|textarea|button)$/i,\n                rheader = /^h\\d$/i,\n\n                rnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n            // Easily-parseable/retrievable ID or TAG or CLASS selectors\n                rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n                rsibling = /[+~]/,\n\n            // CSS escapes\n            // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n                runescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n                funescape = function( _, escaped, escapedWhitespace ) {\n                    var high = \"0x\" + escaped - 0x10000;\n                    // NaN means non-codepoint\n                    // Support: Firefox<24\n                    // Workaround erroneous numeric interpretation of +\"0x\"\n                    return high !== high || escapedWhitespace ?\n                        escaped :\n                        high < 0 ?\n                            // BMP codepoint\n                            String.fromCharCode( high + 0x10000 ) :\n                            // Supplemental Plane codepoint (surrogate pair)\n                            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n                },\n\n            // CSS string/identifier serialization\n            // https://drafts.csswg.org/cssom/#common-serializing-idioms\n                rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n                fcssescape = function( ch, asCodePoint ) {\n                    if ( asCodePoint ) {\n\n                        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n                        if ( ch === \"\\0\" ) {\n                            return \"\\uFFFD\";\n                        }\n\n                        // Control characters and (dependent upon position) numbers get escaped as code points\n                        return ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n                    }\n\n                    // Other potentially-special ASCII characters get backslash-escaped\n                    return \"\\\\\" + ch;\n                },\n\n            // Used for iframes\n            // See setDocument()\n            // Removing the function wrapper causes a \"Permission Denied\"\n            // error in IE\n                unloadHandler = function() {\n                    setDocument();\n                },\n\n                disabledAncestor = addCombinator(\n                    function( elem ) {\n                        return elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n                    },\n                    { dir: \"parentNode\", next: \"legend\" }\n                );\n\n// Optimize for push.apply( _, NodeList )\n            try {\n                push.apply(\n                    (arr = slice.call( preferredDoc.childNodes )),\n                    preferredDoc.childNodes\n                );\n                // Support: Android<4.0\n                // Detect silently failing push.apply\n                arr[ preferredDoc.childNodes.length ].nodeType;\n            } catch ( e ) {\n                push = { apply: arr.length ?\n\n                    // Leverage slice if possible\n                    function( target, els ) {\n                        push_native.apply( target, slice.call(els) );\n                    } :\n\n                    // Support: IE<9\n                    // Otherwise append directly\n                    function( target, els ) {\n                        var j = target.length,\n                            i = 0;\n                        // Can't trust NodeList.length\n                        while ( (target[j++] = els[i++]) ) {}\n                        target.length = j - 1;\n                    }\n                };\n            }\n\n            function Sizzle( selector, context, results, seed ) {\n                var m, i, elem, nid, match, groups, newSelector,\n                    newContext = context && context.ownerDocument,\n\n                // nodeType defaults to 9, since context defaults to document\n                    nodeType = context ? context.nodeType : 9;\n\n                results = results || [];\n\n                // Return early from calls with invalid selector or context\n                if ( typeof selector !== \"string\" || !selector ||\n                    nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n                    return results;\n                }\n\n                // Try to shortcut find operations (as opposed to filters) in HTML documents\n                if ( !seed ) {\n\n                    if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n                        setDocument( context );\n                    }\n                    context = context || document;\n\n                    if ( documentIsHTML ) {\n\n                        // If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n                        // (excepting DocumentFragment context, where the methods don't exist)\n                        if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n                            // ID selector\n                            if ( (m = match[1]) ) {\n\n                                // Document context\n                                if ( nodeType === 9 ) {\n                                    if ( (elem = context.getElementById( m )) ) {\n\n                                        // Support: IE, Opera, Webkit\n                                        // TODO: identify versions\n                                        // getElementById can match elements by name instead of ID\n                                        if ( elem.id === m ) {\n                                            results.push( elem );\n                                            return results;\n                                        }\n                                    } else {\n                                        return results;\n                                    }\n\n                                    // Element context\n                                } else {\n\n                                    // Support: IE, Opera, Webkit\n                                    // TODO: identify versions\n                                    // getElementById can match elements by name instead of ID\n                                    if ( newContext && (elem = newContext.getElementById( m )) &&\n                                        contains( context, elem ) &&\n                                        elem.id === m ) {\n\n                                        results.push( elem );\n                                        return results;\n                                    }\n                                }\n\n                                // Type selector\n                            } else if ( match[2] ) {\n                                push.apply( results, context.getElementsByTagName( selector ) );\n                                return results;\n\n                                // Class selector\n                            } else if ( (m = match[3]) && support.getElementsByClassName &&\n                                context.getElementsByClassName ) {\n\n                                push.apply( results, context.getElementsByClassName( m ) );\n                                return results;\n                            }\n                        }\n\n                        // Take advantage of querySelectorAll\n                        if ( support.qsa &&\n                            !compilerCache[ selector + \" \" ] &&\n                            (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n                            if ( nodeType !== 1 ) {\n                                newContext = context;\n                                newSelector = selector;\n\n                                // qSA looks outside Element context, which is not what we want\n                                // Thanks to Andrew Dupont for this workaround technique\n                                // Support: IE <=8\n                                // Exclude object elements\n                            } else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n                                // Capture the context ID, setting it first if necessary\n                                if ( (nid = context.getAttribute( \"id\" )) ) {\n                                    nid = nid.replace( rcssescape, fcssescape );\n                                } else {\n                                    context.setAttribute( \"id\", (nid = expando) );\n                                }\n\n                                // Prefix every selector in the list\n                                groups = tokenize( selector );\n                                i = groups.length;\n                                while ( i-- ) {\n                                    groups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n                                }\n                                newSelector = groups.join( \",\" );\n\n                                // Expand context for sibling selectors\n                                newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n                                    context;\n                            }\n\n                            if ( newSelector ) {\n                                try {\n                                    push.apply( results,\n                                        newContext.querySelectorAll( newSelector )\n                                    );\n                                    return results;\n                                } catch ( qsaError ) {\n                                } finally {\n                                    if ( nid === expando ) {\n                                        context.removeAttribute( \"id\" );\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                // All others\n                return select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n            }\n\n            /**\n             * Create key-value caches of limited size\n             * @returns {function(string, object)} Returns the Object data after storing it on itself with\n             *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n             *\tdeleting the oldest entry\n             */\n            function createCache() {\n                var keys = [];\n\n                function cache( key, value ) {\n                    // Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n                    if ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n                        // Only keep the most recent entries\n                        delete cache[ keys.shift() ];\n                    }\n                    return (cache[ key + \" \" ] = value);\n                }\n                return cache;\n            }\n\n            /**\n             * Mark a function for special use by Sizzle\n             * @param {Function} fn The function to mark\n             */\n            function markFunction( fn ) {\n                fn[ expando ] = true;\n                return fn;\n            }\n\n            /**\n             * Support testing using an element\n             * @param {Function} fn Passed the created element and returns a boolean result\n             */\n            function assert( fn ) {\n                var el = document.createElement(\"fieldset\");\n\n                try {\n                    return !!fn( el );\n                } catch (e) {\n                    return false;\n                } finally {\n                    // Remove from its parent by default\n                    if ( el.parentNode ) {\n                        el.parentNode.removeChild( el );\n                    }\n                    // release memory in IE\n                    el = null;\n                }\n            }\n\n            /**\n             * Adds the same handler for all of the specified attrs\n             * @param {String} attrs Pipe-separated list of attributes\n             * @param {Function} handler The method that will be applied\n             */\n            function addHandle( attrs, handler ) {\n                var arr = attrs.split(\"|\"),\n                    i = arr.length;\n\n                while ( i-- ) {\n                    Expr.attrHandle[ arr[i] ] = handler;\n                }\n            }\n\n            /**\n             * Checks document order of two siblings\n             * @param {Element} a\n             * @param {Element} b\n             * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n             */\n            function siblingCheck( a, b ) {\n                var cur = b && a,\n                    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n                        a.sourceIndex - b.sourceIndex;\n\n                // Use IE sourceIndex if available on both nodes\n                if ( diff ) {\n                    return diff;\n                }\n\n                // Check if b follows a\n                if ( cur ) {\n                    while ( (cur = cur.nextSibling) ) {\n                        if ( cur === b ) {\n                            return -1;\n                        }\n                    }\n                }\n\n                return a ? 1 : -1;\n            }\n\n            /**\n             * Returns a function to use in pseudos for input types\n             * @param {String} type\n             */\n            function createInputPseudo( type ) {\n                return function( elem ) {\n                    var name = elem.nodeName.toLowerCase();\n                    return name === \"input\" && elem.type === type;\n                };\n            }\n\n            /**\n             * Returns a function to use in pseudos for buttons\n             * @param {String} type\n             */\n            function createButtonPseudo( type ) {\n                return function( elem ) {\n                    var name = elem.nodeName.toLowerCase();\n                    return (name === \"input\" || name === \"button\") && elem.type === type;\n                };\n            }\n\n            /**\n             * Returns a function to use in pseudos for :enabled/:disabled\n             * @param {Boolean} disabled true for :disabled; false for :enabled\n             */\n            function createDisabledPseudo( disabled ) {\n\n                // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n                return function( elem ) {\n\n                    // Only certain elements can match :enabled or :disabled\n                    // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n                    // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n                    if ( \"form\" in elem ) {\n\n                        // Check for inherited disabledness on relevant non-disabled elements:\n                        // * listed form-associated elements in a disabled fieldset\n                        //   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n                        // * option elements in a disabled optgroup\n                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n                        // All such elements have a \"form\" property.\n                        if ( elem.parentNode && elem.disabled === false ) {\n\n                            // Option elements defer to a parent optgroup if present\n                            if ( \"label\" in elem ) {\n                                if ( \"label\" in elem.parentNode ) {\n                                    return elem.parentNode.disabled === disabled;\n                                } else {\n                                    return elem.disabled === disabled;\n                                }\n                            }\n\n                            // Support: IE 6 - 11\n                            // Use the isDisabled shortcut property to check for disabled fieldset ancestors\n                            return elem.isDisabled === disabled ||\n\n                                // Where there is no isDisabled, check manually\n                                /* jshint -W018 */\n                                elem.isDisabled !== !disabled &&\n                                disabledAncestor( elem ) === disabled;\n                        }\n\n                        return elem.disabled === disabled;\n\n                        // Try to winnow out elements that can't be disabled before trusting the disabled property.\n                        // Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n                        // even exist on them, let alone have a boolean value.\n                    } else if ( \"label\" in elem ) {\n                        return elem.disabled === disabled;\n                    }\n\n                    // Remaining elements are neither :enabled nor :disabled\n                    return false;\n                };\n            }\n\n            /**\n             * Returns a function to use in pseudos for positionals\n             * @param {Function} fn\n             */\n            function createPositionalPseudo( fn ) {\n                return markFunction(function( argument ) {\n                    argument = +argument;\n                    return markFunction(function( seed, matches ) {\n                        var j,\n                            matchIndexes = fn( [], seed.length, argument ),\n                            i = matchIndexes.length;\n\n                        // Match elements found at the specified indexes\n                        while ( i-- ) {\n                            if ( seed[ (j = matchIndexes[i]) ] ) {\n                                seed[j] = !(matches[j] = seed[j]);\n                            }\n                        }\n                    });\n                });\n            }\n\n            /**\n             * Checks a node for validity as a Sizzle context\n             * @param {Element|Object=} context\n             * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n             */\n            function testContext( context ) {\n                return context && typeof context.getElementsByTagName !== \"undefined\" && context;\n            }\n\n// Expose support vars for convenience\n            support = Sizzle.support = {};\n\n            /**\n             * Detects XML nodes\n             * @param {Element|Object} elem An element or a document\n             * @returns {Boolean} True iff elem is a non-HTML XML node\n             */\n            isXML = Sizzle.isXML = function( elem ) {\n                // documentElement is verified for cases where it doesn't yet exist\n                // (such as loading iframes in IE - #4833)\n                var documentElement = elem && (elem.ownerDocument || elem).documentElement;\n                return documentElement ? documentElement.nodeName !== \"HTML\" : false;\n            };\n\n            /**\n             * Sets document-related variables once based on the current document\n             * @param {Element|Object} [doc] An element or document object to use to set the document\n             * @returns {Object} Returns the current document\n             */\n            setDocument = Sizzle.setDocument = function( node ) {\n                var hasCompare, subWindow,\n                    doc = node ? node.ownerDocument || node : preferredDoc;\n\n                // Return early if doc is invalid or already selected\n                if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n                    return document;\n                }\n\n                // Update global variables\n                document = doc;\n                docElem = document.documentElement;\n                documentIsHTML = !isXML( document );\n\n                // Support: IE 9-11, Edge\n                // Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n                if ( preferredDoc !== document &&\n                    (subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n                    // Support: IE 11, Edge\n                    if ( subWindow.addEventListener ) {\n                        subWindow.addEventListener( \"unload\", unloadHandler, false );\n\n                        // Support: IE 9 - 10 only\n                    } else if ( subWindow.attachEvent ) {\n                        subWindow.attachEvent( \"onunload\", unloadHandler );\n                    }\n                }\n\n                /* Attributes\n                 ---------------------------------------------------------------------- */\n\n                // Support: IE<8\n                // Verify that getAttribute really returns attributes and not properties\n                // (excepting IE8 booleans)\n                support.attributes = assert(function( el ) {\n                    el.className = \"i\";\n                    return !el.getAttribute(\"className\");\n                });\n\n                /* getElement(s)By*\n                 ---------------------------------------------------------------------- */\n\n                // Check if getElementsByTagName(\"*\") returns only elements\n                support.getElementsByTagName = assert(function( el ) {\n                    el.appendChild( document.createComment(\"\") );\n                    return !el.getElementsByTagName(\"*\").length;\n                });\n\n                // Support: IE<9\n                support.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n                // Support: IE<10\n                // Check if getElementById returns elements by name\n                // The broken getElementById methods don't pick up programmatically-set names,\n                // so use a roundabout getElementsByName test\n                support.getById = assert(function( el ) {\n                    docElem.appendChild( el ).id = expando;\n                    return !document.getElementsByName || !document.getElementsByName( expando ).length;\n                });\n\n                // ID filter and find\n                if ( support.getById ) {\n                    Expr.filter[\"ID\"] = function( id ) {\n                        var attrId = id.replace( runescape, funescape );\n                        return function( elem ) {\n                            return elem.getAttribute(\"id\") === attrId;\n                        };\n                    };\n                    Expr.find[\"ID\"] = function( id, context ) {\n                        if ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n                            var elem = context.getElementById( id );\n                            return elem ? [ elem ] : [];\n                        }\n                    };\n                } else {\n                    Expr.filter[\"ID\"] =  function( id ) {\n                        var attrId = id.replace( runescape, funescape );\n                        return function( elem ) {\n                            var node = typeof elem.getAttributeNode !== \"undefined\" &&\n                                elem.getAttributeNode(\"id\");\n                            return node && node.value === attrId;\n                        };\n                    };\n\n                    // Support: IE 6 - 7 only\n                    // getElementById is not reliable as a find shortcut\n                    Expr.find[\"ID\"] = function( id, context ) {\n                        if ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n                            var node, i, elems,\n                                elem = context.getElementById( id );\n\n                            if ( elem ) {\n\n                                // Verify the id attribute\n                                node = elem.getAttributeNode(\"id\");\n                                if ( node && node.value === id ) {\n                                    return [ elem ];\n                                }\n\n                                // Fall back on getElementsByName\n                                elems = context.getElementsByName( id );\n                                i = 0;\n                                while ( (elem = elems[i++]) ) {\n                                    node = elem.getAttributeNode(\"id\");\n                                    if ( node && node.value === id ) {\n                                        return [ elem ];\n                                    }\n                                }\n                            }\n\n                            return [];\n                        }\n                    };\n                }\n\n                // Tag\n                Expr.find[\"TAG\"] = support.getElementsByTagName ?\n                    function( tag, context ) {\n                        if ( typeof context.getElementsByTagName !== \"undefined\" ) {\n                            return context.getElementsByTagName( tag );\n\n                            // DocumentFragment nodes don't have gEBTN\n                        } else if ( support.qsa ) {\n                            return context.querySelectorAll( tag );\n                        }\n                    } :\n\n                    function( tag, context ) {\n                        var elem,\n                            tmp = [],\n                            i = 0,\n                        // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n                            results = context.getElementsByTagName( tag );\n\n                        // Filter out possible comments\n                        if ( tag === \"*\" ) {\n                            while ( (elem = results[i++]) ) {\n                                if ( elem.nodeType === 1 ) {\n                                    tmp.push( elem );\n                                }\n                            }\n\n                            return tmp;\n                        }\n                        return results;\n                    };\n\n                // Class\n                Expr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n                        if ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n                            return context.getElementsByClassName( className );\n                        }\n                    };\n\n                /* QSA/matchesSelector\n                 ---------------------------------------------------------------------- */\n\n                // QSA and matchesSelector support\n\n                // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n                rbuggyMatches = [];\n\n                // qSa(:focus) reports false when true (Chrome 21)\n                // We allow this because of a bug in IE8/9 that throws an error\n                // whenever `document.activeElement` is accessed on an iframe\n                // So, we allow :focus to pass through QSA all the time to avoid the IE error\n                // See https://bugs.jquery.com/ticket/13378\n                rbuggyQSA = [];\n\n                if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n                    // Build QSA regex\n                    // Regex strategy adopted from Diego Perini\n                    assert(function( el ) {\n                        // Select is set to empty string on purpose\n                        // This is to test IE's treatment of not explicitly\n                        // setting a boolean content attribute,\n                        // since its presence should be enough\n                        // https://bugs.jquery.com/ticket/12359\n                        docElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n                            \"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n                            \"<option selected=''></option></select>\";\n\n                        // Support: IE8, Opera 11-12.16\n                        // Nothing should be selected when empty strings follow ^= or $= or *=\n                        // The test attribute must be unknown in Opera but \"safe\" for WinRT\n                        // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n                        if ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n                            rbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n                        }\n\n                        // Support: IE8\n                        // Boolean attributes and \"value\" are not treated correctly\n                        if ( !el.querySelectorAll(\"[selected]\").length ) {\n                            rbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n                        }\n\n                        // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n                        if ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n                            rbuggyQSA.push(\"~=\");\n                        }\n\n                        // Webkit/Opera - :checked should return selected option elements\n                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n                        // IE8 throws error here and will not see later tests\n                        if ( !el.querySelectorAll(\":checked\").length ) {\n                            rbuggyQSA.push(\":checked\");\n                        }\n\n                        // Support: Safari 8+, iOS 8+\n                        // https://bugs.webkit.org/show_bug.cgi?id=136851\n                        // In-pages `selector#id sibling-combinator selector` fails\n                        if ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n                            rbuggyQSA.push(\".#.+[+~]\");\n                        }\n                    });\n\n                    assert(function( el ) {\n                        el.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n                            \"<select disabled='disabled'><option/></select>\";\n\n                        // Support: Windows 8 Native Apps\n                        // The type and name attributes are restricted during .innerHTML assignment\n                        var input = document.createElement(\"input\");\n                        input.setAttribute( \"type\", \"hidden\" );\n                        el.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n                        // Support: IE8\n                        // Enforce case-sensitivity of name attribute\n                        if ( el.querySelectorAll(\"[name=d]\").length ) {\n                            rbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n                        }\n\n                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n                        // IE8 throws error here and will not see later tests\n                        if ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n                            rbuggyQSA.push( \":enabled\", \":disabled\" );\n                        }\n\n                        // Support: IE9-11+\n                        // IE's :disabled selector does not pick up the children of disabled fieldsets\n                        docElem.appendChild( el ).disabled = true;\n                        if ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n                            rbuggyQSA.push( \":enabled\", \":disabled\" );\n                        }\n\n                        // Opera 10-11 does not throw on post-comma invalid pseudos\n                        el.querySelectorAll(\"*,:x\");\n                        rbuggyQSA.push(\",.*:\");\n                    });\n                }\n\n                if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n                        docElem.webkitMatchesSelector ||\n                        docElem.mozMatchesSelector ||\n                        docElem.oMatchesSelector ||\n                        docElem.msMatchesSelector) )) ) {\n\n                    assert(function( el ) {\n                        // Check to see if it's possible to do matchesSelector\n                        // on a disconnected node (IE 9)\n                        support.disconnectedMatch = matches.call( el, \"*\" );\n\n                        // This should fail with an exception\n                        // Gecko does not error, returns false instead\n                        matches.call( el, \"[s!='']:x\" );\n                        rbuggyMatches.push( \"!=\", pseudos );\n                    });\n                }\n\n                rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n                rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n                /* Contains\n                 ---------------------------------------------------------------------- */\n                hasCompare = rnative.test( docElem.compareDocumentPosition );\n\n                // Element contains another\n                // Purposefully self-exclusive\n                // As in, an element does not contain itself\n                contains = hasCompare || rnative.test( docElem.contains ) ?\n                    function( a, b ) {\n                        var adown = a.nodeType === 9 ? a.documentElement : a,\n                            bup = b && b.parentNode;\n                        return a === bup || !!( bup && bup.nodeType === 1 && (\n                                adown.contains ?\n                                    adown.contains( bup ) :\n                                a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n                            ));\n                    } :\n                    function( a, b ) {\n                        if ( b ) {\n                            while ( (b = b.parentNode) ) {\n                                if ( b === a ) {\n                                    return true;\n                                }\n                            }\n                        }\n                        return false;\n                    };\n\n                /* Sorting\n                 ---------------------------------------------------------------------- */\n\n                // Document order sorting\n                sortOrder = hasCompare ?\n                    function( a, b ) {\n\n                        // Flag for duplicate removal\n                        if ( a === b ) {\n                            hasDuplicate = true;\n                            return 0;\n                        }\n\n                        // Sort on method existence if only one input has compareDocumentPosition\n                        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n                        if ( compare ) {\n                            return compare;\n                        }\n\n                        // Calculate position if both inputs belong to the same document\n                        compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n                            a.compareDocumentPosition( b ) :\n\n                            // Otherwise we know they are disconnected\n                            1;\n\n                        // Disconnected nodes\n                        if ( compare & 1 ||\n                            (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n                            // Choose the first element that is related to our preferred document\n                            if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n                                return -1;\n                            }\n                            if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n                                return 1;\n                            }\n\n                            // Maintain original order\n                            return sortInput ?\n                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n                                0;\n                        }\n\n                        return compare & 4 ? -1 : 1;\n                    } :\n                    function( a, b ) {\n                        // Exit early if the nodes are identical\n                        if ( a === b ) {\n                            hasDuplicate = true;\n                            return 0;\n                        }\n\n                        var cur,\n                            i = 0,\n                            aup = a.parentNode,\n                            bup = b.parentNode,\n                            ap = [ a ],\n                            bp = [ b ];\n\n                        // Parentless nodes are either documents or disconnected\n                        if ( !aup || !bup ) {\n                            return a === document ? -1 :\n                                b === document ? 1 :\n                                    aup ? -1 :\n                                        bup ? 1 :\n                                            sortInput ?\n                                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n                                                0;\n\n                            // If the nodes are siblings, we can do a quick check\n                        } else if ( aup === bup ) {\n                            return siblingCheck( a, b );\n                        }\n\n                        // Otherwise we need full lists of their ancestors for comparison\n                        cur = a;\n                        while ( (cur = cur.parentNode) ) {\n                            ap.unshift( cur );\n                        }\n                        cur = b;\n                        while ( (cur = cur.parentNode) ) {\n                            bp.unshift( cur );\n                        }\n\n                        // Walk down the tree looking for a discrepancy\n                        while ( ap[i] === bp[i] ) {\n                            i++;\n                        }\n\n                        return i ?\n                            // Do a sibling check if the nodes have a common ancestor\n                            siblingCheck( ap[i], bp[i] ) :\n\n                            // Otherwise nodes in our document sort first\n                            ap[i] === preferredDoc ? -1 :\n                                bp[i] === preferredDoc ? 1 :\n                                    0;\n                    };\n\n                return document;\n            };\n\n            Sizzle.matches = function( expr, elements ) {\n                return Sizzle( expr, null, null, elements );\n            };\n\n            Sizzle.matchesSelector = function( elem, expr ) {\n                // Set document vars if needed\n                if ( ( elem.ownerDocument || elem ) !== document ) {\n                    setDocument( elem );\n                }\n\n                // Make sure that attribute selectors are quoted\n                expr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n                if ( support.matchesSelector && documentIsHTML &&\n                    !compilerCache[ expr + \" \" ] &&\n                    ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n                    ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n                    try {\n                        var ret = matches.call( elem, expr );\n\n                        // IE 9's matchesSelector returns false on disconnected nodes\n                        if ( ret || support.disconnectedMatch ||\n                            // As well, disconnected nodes are said to be in a document\n                            // fragment in IE 9\n                            elem.document && elem.document.nodeType !== 11 ) {\n                            return ret;\n                        }\n                    } catch (e) {}\n                }\n\n                return Sizzle( expr, document, null, [ elem ] ).length > 0;\n            };\n\n            Sizzle.contains = function( context, elem ) {\n                // Set document vars if needed\n                if ( ( context.ownerDocument || context ) !== document ) {\n                    setDocument( context );\n                }\n                return contains( context, elem );\n            };\n\n            Sizzle.attr = function( elem, name ) {\n                // Set document vars if needed\n                if ( ( elem.ownerDocument || elem ) !== document ) {\n                    setDocument( elem );\n                }\n\n                var fn = Expr.attrHandle[ name.toLowerCase() ],\n                // Don't get fooled by Object.prototype properties (jQuery #13807)\n                    val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n                        fn( elem, name, !documentIsHTML ) :\n                        undefined;\n\n                return val !== undefined ?\n                    val :\n                    support.attributes || !documentIsHTML ?\n                        elem.getAttribute( name ) :\n                        (val = elem.getAttributeNode(name)) && val.specified ?\n                            val.value :\n                            null;\n            };\n\n            Sizzle.escape = function( sel ) {\n                return (sel + \"\").replace( rcssescape, fcssescape );\n            };\n\n            Sizzle.error = function( msg ) {\n                throw new Error( \"Syntax error, unrecognized expression: \" + msg );\n            };\n\n            /**\n             * Document sorting and removing duplicates\n             * @param {ArrayLike} results\n             */\n            Sizzle.uniqueSort = function( results ) {\n                var elem,\n                    duplicates = [],\n                    j = 0,\n                    i = 0;\n\n                // Unless we *know* we can detect duplicates, assume their presence\n                hasDuplicate = !support.detectDuplicates;\n                sortInput = !support.sortStable && results.slice( 0 );\n                results.sort( sortOrder );\n\n                if ( hasDuplicate ) {\n                    while ( (elem = results[i++]) ) {\n                        if ( elem === results[ i ] ) {\n                            j = duplicates.push( i );\n                        }\n                    }\n                    while ( j-- ) {\n                        results.splice( duplicates[ j ], 1 );\n                    }\n                }\n\n                // Clear input after sorting to release objects\n                // See https://github.com/jquery/sizzle/pull/225\n                sortInput = null;\n\n                return results;\n            };\n\n            /**\n             * Utility function for retrieving the text value of an array of DOM nodes\n             * @param {Array|Element} elem\n             */\n            getText = Sizzle.getText = function( elem ) {\n                var node,\n                    ret = \"\",\n                    i = 0,\n                    nodeType = elem.nodeType;\n\n                if ( !nodeType ) {\n                    // If no nodeType, this is expected to be an array\n                    while ( (node = elem[i++]) ) {\n                        // Do not traverse comment nodes\n                        ret += getText( node );\n                    }\n                } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n                    // Use textContent for elements\n                    // innerText usage removed for consistency of new lines (jQuery #11153)\n                    if ( typeof elem.textContent === \"string\" ) {\n                        return elem.textContent;\n                    } else {\n                        // Traverse its children\n                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n                            ret += getText( elem );\n                        }\n                    }\n                } else if ( nodeType === 3 || nodeType === 4 ) {\n                    return elem.nodeValue;\n                }\n                // Do not include comment or processing instruction nodes\n\n                return ret;\n            };\n\n            Expr = Sizzle.selectors = {\n\n                // Can be adjusted by the user\n                cacheLength: 50,\n\n                createPseudo: markFunction,\n\n                match: matchExpr,\n\n                attrHandle: {},\n\n                find: {},\n\n                relative: {\n                    \">\": { dir: \"parentNode\", first: true },\n                    \" \": { dir: \"parentNode\" },\n                    \"+\": { dir: \"previousSibling\", first: true },\n                    \"~\": { dir: \"previousSibling\" }\n                },\n\n                preFilter: {\n                    \"ATTR\": function( match ) {\n                        match[1] = match[1].replace( runescape, funescape );\n\n                        // Move the given value to match[3] whether quoted or unquoted\n                        match[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n                        if ( match[2] === \"~=\" ) {\n                            match[3] = \" \" + match[3] + \" \";\n                        }\n\n                        return match.slice( 0, 4 );\n                    },\n\n                    \"CHILD\": function( match ) {\n                        /* matches from matchExpr[\"CHILD\"]\n                         1 type (only|nth|...)\n                         2 what (child|of-type)\n                         3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n                         4 xn-component of xn+y argument ([+-]?\\d*n|)\n                         5 sign of xn-component\n                         6 x of xn-component\n                         7 sign of y-component\n                         8 y of y-component\n                         */\n                        match[1] = match[1].toLowerCase();\n\n                        if ( match[1].slice( 0, 3 ) === \"nth\" ) {\n                            // nth-* requires argument\n                            if ( !match[3] ) {\n                                Sizzle.error( match[0] );\n                            }\n\n                            // numeric x and y parameters for Expr.filter.CHILD\n                            // remember that false/true cast respectively to 0/1\n                            match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n                            match[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n                            // other types prohibit arguments\n                        } else if ( match[3] ) {\n                            Sizzle.error( match[0] );\n                        }\n\n                        return match;\n                    },\n\n                    \"PSEUDO\": function( match ) {\n                        var excess,\n                            unquoted = !match[6] && match[2];\n\n                        if ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n                            return null;\n                        }\n\n                        // Accept quoted arguments as-is\n                        if ( match[3] ) {\n                            match[2] = match[4] || match[5] || \"\";\n\n                            // Strip excess characters from unquoted arguments\n                        } else if ( unquoted && rpseudo.test( unquoted ) &&\n                            // Get excess from tokenize (recursively)\n                            (excess = tokenize( unquoted, true )) &&\n                            // advance to the next closing parenthesis\n                            (excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n                            // excess is a negative index\n                            match[0] = match[0].slice( 0, excess );\n                            match[2] = unquoted.slice( 0, excess );\n                        }\n\n                        // Return only captures needed by the pseudo filter method (type and argument)\n                        return match.slice( 0, 3 );\n                    }\n                },\n\n                filter: {\n\n                    \"TAG\": function( nodeNameSelector ) {\n                        var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n                        return nodeNameSelector === \"*\" ?\n                            function() { return true; } :\n                            function( elem ) {\n                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n                            };\n                    },\n\n                    \"CLASS\": function( className ) {\n                        var pattern = classCache[ className + \" \" ];\n\n                        return pattern ||\n                            (pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n                            classCache( className, function( elem ) {\n                                return pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n                            });\n                    },\n\n                    \"ATTR\": function( name, operator, check ) {\n                        return function( elem ) {\n                            var result = Sizzle.attr( elem, name );\n\n                            if ( result == null ) {\n                                return operator === \"!=\";\n                            }\n                            if ( !operator ) {\n                                return true;\n                            }\n\n                            result += \"\";\n\n                            return operator === \"=\" ? result === check :\n                                operator === \"!=\" ? result !== check :\n                                    operator === \"^=\" ? check && result.indexOf( check ) === 0 :\n                                        operator === \"*=\" ? check && result.indexOf( check ) > -1 :\n                                            operator === \"$=\" ? check && result.slice( -check.length ) === check :\n                                                operator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n                                                    operator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n                                                        false;\n                        };\n                    },\n\n                    \"CHILD\": function( type, what, argument, first, last ) {\n                        var simple = type.slice( 0, 3 ) !== \"nth\",\n                            forward = type.slice( -4 ) !== \"last\",\n                            ofType = what === \"of-type\";\n\n                        return first === 1 && last === 0 ?\n\n                            // Shortcut for :nth-*(n)\n                            function( elem ) {\n                                return !!elem.parentNode;\n                            } :\n\n                            function( elem, context, xml ) {\n                                var cache, uniqueCache, outerCache, node, nodeIndex, start,\n                                    dir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n                                    parent = elem.parentNode,\n                                    name = ofType && elem.nodeName.toLowerCase(),\n                                    useCache = !xml && !ofType,\n                                    diff = false;\n\n                                if ( parent ) {\n\n                                    // :(first|last|only)-(child|of-type)\n                                    if ( simple ) {\n                                        while ( dir ) {\n                                            node = elem;\n                                            while ( (node = node[ dir ]) ) {\n                                                if ( ofType ?\n                                                    node.nodeName.toLowerCase() === name :\n                                                    node.nodeType === 1 ) {\n\n                                                    return false;\n                                                }\n                                            }\n                                            // Reverse direction for :only-* (if we haven't yet done so)\n                                            start = dir = type === \"only\" && !start && \"nextSibling\";\n                                        }\n                                        return true;\n                                    }\n\n                                    start = [ forward ? parent.firstChild : parent.lastChild ];\n\n                                    // non-xml :nth-child(...) stores cache data on `parent`\n                                    if ( forward && useCache ) {\n\n                                        // Seek `elem` from a previously-cached index\n\n                                        // ...in a gzip-friendly way\n                                        node = parent;\n                                        outerCache = node[ expando ] || (node[ expando ] = {});\n\n                                        // Support: IE <9 only\n                                        // Defend against cloned attroperties (jQuery gh-1709)\n                                        uniqueCache = outerCache[ node.uniqueID ] ||\n                                            (outerCache[ node.uniqueID ] = {});\n\n                                        cache = uniqueCache[ type ] || [];\n                                        nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n                                        diff = nodeIndex && cache[ 2 ];\n                                        node = nodeIndex && parent.childNodes[ nodeIndex ];\n\n                                        while ( (node = ++nodeIndex && node && node[ dir ] ||\n\n                                            // Fallback to seeking `elem` from the start\n                                            (diff = nodeIndex = 0) || start.pop()) ) {\n\n                                            // When found, cache indexes on `parent` and break\n                                            if ( node.nodeType === 1 && ++diff && node === elem ) {\n                                                uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n                                                break;\n                                            }\n                                        }\n\n                                    } else {\n                                        // Use previously-cached element index if available\n                                        if ( useCache ) {\n                                            // ...in a gzip-friendly way\n                                            node = elem;\n                                            outerCache = node[ expando ] || (node[ expando ] = {});\n\n                                            // Support: IE <9 only\n                                            // Defend against cloned attroperties (jQuery gh-1709)\n                                            uniqueCache = outerCache[ node.uniqueID ] ||\n                                                (outerCache[ node.uniqueID ] = {});\n\n                                            cache = uniqueCache[ type ] || [];\n                                            nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n                                            diff = nodeIndex;\n                                        }\n\n                                        // xml :nth-child(...)\n                                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)\n                                        if ( diff === false ) {\n                                            // Use the same loop as above to seek `elem` from the start\n                                            while ( (node = ++nodeIndex && node && node[ dir ] ||\n                                                (diff = nodeIndex = 0) || start.pop()) ) {\n\n                                                if ( ( ofType ?\n                                                    node.nodeName.toLowerCase() === name :\n                                                    node.nodeType === 1 ) &&\n                                                    ++diff ) {\n\n                                                    // Cache the index of each encountered element\n                                                    if ( useCache ) {\n                                                        outerCache = node[ expando ] || (node[ expando ] = {});\n\n                                                        // Support: IE <9 only\n                                                        // Defend against cloned attroperties (jQuery gh-1709)\n                                                        uniqueCache = outerCache[ node.uniqueID ] ||\n                                                            (outerCache[ node.uniqueID ] = {});\n\n                                                        uniqueCache[ type ] = [ dirruns, diff ];\n                                                    }\n\n                                                    if ( node === elem ) {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n\n                                    // Incorporate the offset, then check against cycle size\n                                    diff -= last;\n                                    return diff === first || ( diff % first === 0 && diff / first >= 0 );\n                                }\n                            };\n                    },\n\n                    \"PSEUDO\": function( pseudo, argument ) {\n                        // pseudo-class names are case-insensitive\n                        // http://www.w3.org/TR/selectors/#pseudo-classes\n                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n                        // Remember that setFilters inherits from pseudos\n                        var args,\n                            fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n                                Sizzle.error( \"unsupported pseudo: \" + pseudo );\n\n                        // The user may use createPseudo to indicate that\n                        // arguments are needed to create the filter function\n                        // just as Sizzle does\n                        if ( fn[ expando ] ) {\n                            return fn( argument );\n                        }\n\n                        // But maintain support for old signatures\n                        if ( fn.length > 1 ) {\n                            args = [ pseudo, pseudo, \"\", argument ];\n                            return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n                                markFunction(function( seed, matches ) {\n                                    var idx,\n                                        matched = fn( seed, argument ),\n                                        i = matched.length;\n                                    while ( i-- ) {\n                                        idx = indexOf( seed, matched[i] );\n                                        seed[ idx ] = !( matches[ idx ] = matched[i] );\n                                    }\n                                }) :\n                                function( elem ) {\n                                    return fn( elem, 0, args );\n                                };\n                        }\n\n                        return fn;\n                    }\n                },\n\n                pseudos: {\n                    // Potentially complex pseudos\n                    \"not\": markFunction(function( selector ) {\n                        // Trim the selector passed to compile\n                        // to avoid treating leading and trailing\n                        // spaces as combinators\n                        var input = [],\n                            results = [],\n                            matcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n                        return matcher[ expando ] ?\n                            markFunction(function( seed, matches, context, xml ) {\n                                var elem,\n                                    unmatched = matcher( seed, null, xml, [] ),\n                                    i = seed.length;\n\n                                // Match elements unmatched by `matcher`\n                                while ( i-- ) {\n                                    if ( (elem = unmatched[i]) ) {\n                                        seed[i] = !(matches[i] = elem);\n                                    }\n                                }\n                            }) :\n                            function( elem, context, xml ) {\n                                input[0] = elem;\n                                matcher( input, null, xml, results );\n                                // Don't keep the element (issue #299)\n                                input[0] = null;\n                                return !results.pop();\n                            };\n                    }),\n\n                    \"has\": markFunction(function( selector ) {\n                        return function( elem ) {\n                            return Sizzle( selector, elem ).length > 0;\n                        };\n                    }),\n\n                    \"contains\": markFunction(function( text ) {\n                        text = text.replace( runescape, funescape );\n                        return function( elem ) {\n                            return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n                        };\n                    }),\n\n                    // \"Whether an element is represented by a :lang() selector\n                    // is based solely on the element's language value\n                    // being equal to the identifier C,\n                    // or beginning with the identifier C immediately followed by \"-\".\n                    // The matching of C against the element's language value is performed case-insensitively.\n                    // The identifier C does not have to be a valid language name.\"\n                    // http://www.w3.org/TR/selectors/#lang-pseudo\n                    \"lang\": markFunction( function( lang ) {\n                        // lang value must be a valid identifier\n                        if ( !ridentifier.test(lang || \"\") ) {\n                            Sizzle.error( \"unsupported lang: \" + lang );\n                        }\n                        lang = lang.replace( runescape, funescape ).toLowerCase();\n                        return function( elem ) {\n                            var elemLang;\n                            do {\n                                if ( (elemLang = documentIsHTML ?\n                                        elem.lang :\n                                    elem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n                                    elemLang = elemLang.toLowerCase();\n                                    return elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n                                }\n                            } while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n                            return false;\n                        };\n                    }),\n\n                    // Miscellaneous\n                    \"target\": function( elem ) {\n                        var hash = window.location && window.location.hash;\n                        return hash && hash.slice( 1 ) === elem.id;\n                    },\n\n                    \"root\": function( elem ) {\n                        return elem === docElem;\n                    },\n\n                    \"focus\": function( elem ) {\n                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n                    },\n\n                    // Boolean properties\n                    \"enabled\": createDisabledPseudo( false ),\n                    \"disabled\": createDisabledPseudo( true ),\n\n                    \"checked\": function( elem ) {\n                        // In CSS3, :checked should return both checked and selected elements\n                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n                        var nodeName = elem.nodeName.toLowerCase();\n                        return (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n                    },\n\n                    \"selected\": function( elem ) {\n                        // Accessing this property makes selected-by-default\n                        // options in Safari work properly\n                        if ( elem.parentNode ) {\n                            elem.parentNode.selectedIndex;\n                        }\n\n                        return elem.selected === true;\n                    },\n\n                    // Contents\n                    \"empty\": function( elem ) {\n                        // http://www.w3.org/TR/selectors/#empty-pseudo\n                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n                        //   but not by others (comment: 8; processing instruction: 7; etc.)\n                        // nodeType < 6 works because attributes (2) do not appear as children\n                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n                            if ( elem.nodeType < 6 ) {\n                                return false;\n                            }\n                        }\n                        return true;\n                    },\n\n                    \"parent\": function( elem ) {\n                        return !Expr.pseudos[\"empty\"]( elem );\n                    },\n\n                    // Element/input types\n                    \"header\": function( elem ) {\n                        return rheader.test( elem.nodeName );\n                    },\n\n                    \"input\": function( elem ) {\n                        return rinputs.test( elem.nodeName );\n                    },\n\n                    \"button\": function( elem ) {\n                        var name = elem.nodeName.toLowerCase();\n                        return name === \"input\" && elem.type === \"button\" || name === \"button\";\n                    },\n\n                    \"text\": function( elem ) {\n                        var attr;\n                        return elem.nodeName.toLowerCase() === \"input\" &&\n                            elem.type === \"text\" &&\n\n                            // Support: IE<8\n                            // New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n                            ( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n                    },\n\n                    // Position-in-collection\n                    \"first\": createPositionalPseudo(function() {\n                        return [ 0 ];\n                    }),\n\n                    \"last\": createPositionalPseudo(function( matchIndexes, length ) {\n                        return [ length - 1 ];\n                    }),\n\n                    \"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n                        return [ argument < 0 ? argument + length : argument ];\n                    }),\n\n                    \"even\": createPositionalPseudo(function( matchIndexes, length ) {\n                        var i = 0;\n                        for ( ; i < length; i += 2 ) {\n                            matchIndexes.push( i );\n                        }\n                        return matchIndexes;\n                    }),\n\n                    \"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n                        var i = 1;\n                        for ( ; i < length; i += 2 ) {\n                            matchIndexes.push( i );\n                        }\n                        return matchIndexes;\n                    }),\n\n                    \"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n                        var i = argument < 0 ? argument + length : argument;\n                        for ( ; --i >= 0; ) {\n                            matchIndexes.push( i );\n                        }\n                        return matchIndexes;\n                    }),\n\n                    \"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n                        var i = argument < 0 ? argument + length : argument;\n                        for ( ; ++i < length; ) {\n                            matchIndexes.push( i );\n                        }\n                        return matchIndexes;\n                    })\n                }\n            };\n\n            Expr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\n            for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n                Expr.pseudos[ i ] = createInputPseudo( i );\n            }\n            for ( i in { submit: true, reset: true } ) {\n                Expr.pseudos[ i ] = createButtonPseudo( i );\n            }\n\n// Easy API for creating new setFilters\n            function setFilters() {}\n            setFilters.prototype = Expr.filters = Expr.pseudos;\n            Expr.setFilters = new setFilters();\n\n            tokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n                var matched, match, tokens, type,\n                    soFar, groups, preFilters,\n                    cached = tokenCache[ selector + \" \" ];\n\n                if ( cached ) {\n                    return parseOnly ? 0 : cached.slice( 0 );\n                }\n\n                soFar = selector;\n                groups = [];\n                preFilters = Expr.preFilter;\n\n                while ( soFar ) {\n\n                    // Comma and first run\n                    if ( !matched || (match = rcomma.exec( soFar )) ) {\n                        if ( match ) {\n                            // Don't consume trailing commas as valid\n                            soFar = soFar.slice( match[0].length ) || soFar;\n                        }\n                        groups.push( (tokens = []) );\n                    }\n\n                    matched = false;\n\n                    // Combinators\n                    if ( (match = rcombinators.exec( soFar )) ) {\n                        matched = match.shift();\n                        tokens.push({\n                            value: matched,\n                            // Cast descendant combinators to space\n                            type: match[0].replace( rtrim, \" \" )\n                        });\n                        soFar = soFar.slice( matched.length );\n                    }\n\n                    // Filters\n                    for ( type in Expr.filter ) {\n                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n                            (match = preFilters[ type ]( match ))) ) {\n                            matched = match.shift();\n                            tokens.push({\n                                value: matched,\n                                type: type,\n                                matches: match\n                            });\n                            soFar = soFar.slice( matched.length );\n                        }\n                    }\n\n                    if ( !matched ) {\n                        break;\n                    }\n                }\n\n                // Return the length of the invalid excess\n                // if we're just parsing\n                // Otherwise, throw an error or return tokens\n                return parseOnly ?\n                    soFar.length :\n                    soFar ?\n                        Sizzle.error( selector ) :\n                        // Cache the tokens\n                        tokenCache( selector, groups ).slice( 0 );\n            };\n\n            function toSelector( tokens ) {\n                var i = 0,\n                    len = tokens.length,\n                    selector = \"\";\n                for ( ; i < len; i++ ) {\n                    selector += tokens[i].value;\n                }\n                return selector;\n            }\n\n            function addCombinator( matcher, combinator, base ) {\n                var dir = combinator.dir,\n                    skip = combinator.next,\n                    key = skip || dir,\n                    checkNonElements = base && key === \"parentNode\",\n                    doneName = done++;\n\n                return combinator.first ?\n                    // Check against closest ancestor/preceding element\n                    function( elem, context, xml ) {\n                        while ( (elem = elem[ dir ]) ) {\n                            if ( elem.nodeType === 1 || checkNonElements ) {\n                                return matcher( elem, context, xml );\n                            }\n                        }\n                        return false;\n                    } :\n\n                    // Check against all ancestor/preceding elements\n                    function( elem, context, xml ) {\n                        var oldCache, uniqueCache, outerCache,\n                            newCache = [ dirruns, doneName ];\n\n                        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n                        if ( xml ) {\n                            while ( (elem = elem[ dir ]) ) {\n                                if ( elem.nodeType === 1 || checkNonElements ) {\n                                    if ( matcher( elem, context, xml ) ) {\n                                        return true;\n                                    }\n                                }\n                            }\n                        } else {\n                            while ( (elem = elem[ dir ]) ) {\n                                if ( elem.nodeType === 1 || checkNonElements ) {\n                                    outerCache = elem[ expando ] || (elem[ expando ] = {});\n\n                                    // Support: IE <9 only\n                                    // Defend against cloned attroperties (jQuery gh-1709)\n                                    uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n                                    if ( skip && skip === elem.nodeName.toLowerCase() ) {\n                                        elem = elem[ dir ] || elem;\n                                    } else if ( (oldCache = uniqueCache[ key ]) &&\n                                        oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n                                        // Assign to newCache so results back-propagate to previous elements\n                                        return (newCache[ 2 ] = oldCache[ 2 ]);\n                                    } else {\n                                        // Reuse newcache so results back-propagate to previous elements\n                                        uniqueCache[ key ] = newCache;\n\n                                        // A match means we're done; a fail means we have to keep checking\n                                        if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n                                            return true;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        return false;\n                    };\n            }\n\n            function elementMatcher( matchers ) {\n                return matchers.length > 1 ?\n                    function( elem, context, xml ) {\n                        var i = matchers.length;\n                        while ( i-- ) {\n                            if ( !matchers[i]( elem, context, xml ) ) {\n                                return false;\n                            }\n                        }\n                        return true;\n                    } :\n                    matchers[0];\n            }\n\n            function multipleContexts( selector, contexts, results ) {\n                var i = 0,\n                    len = contexts.length;\n                for ( ; i < len; i++ ) {\n                    Sizzle( selector, contexts[i], results );\n                }\n                return results;\n            }\n\n            function condense( unmatched, map, filter, context, xml ) {\n                var elem,\n                    newUnmatched = [],\n                    i = 0,\n                    len = unmatched.length,\n                    mapped = map != null;\n\n                for ( ; i < len; i++ ) {\n                    if ( (elem = unmatched[i]) ) {\n                        if ( !filter || filter( elem, context, xml ) ) {\n                            newUnmatched.push( elem );\n                            if ( mapped ) {\n                                map.push( i );\n                            }\n                        }\n                    }\n                }\n\n                return newUnmatched;\n            }\n\n            function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n                if ( postFilter && !postFilter[ expando ] ) {\n                    postFilter = setMatcher( postFilter );\n                }\n                if ( postFinder && !postFinder[ expando ] ) {\n                    postFinder = setMatcher( postFinder, postSelector );\n                }\n                return markFunction(function( seed, results, context, xml ) {\n                    var temp, i, elem,\n                        preMap = [],\n                        postMap = [],\n                        preexisting = results.length,\n\n                    // Get initial elements from seed or context\n                        elems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n                    // Prefilter to get matcher input, preserving a map for seed-results synchronization\n                        matcherIn = preFilter && ( seed || !selector ) ?\n                            condense( elems, preMap, preFilter, context, xml ) :\n                            elems,\n\n                        matcherOut = matcher ?\n                            // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n                            postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n                                // ...intermediate processing is necessary\n                                [] :\n\n                                // ...otherwise use results directly\n                                results :\n                            matcherIn;\n\n                    // Find primary matches\n                    if ( matcher ) {\n                        matcher( matcherIn, matcherOut, context, xml );\n                    }\n\n                    // Apply postFilter\n                    if ( postFilter ) {\n                        temp = condense( matcherOut, postMap );\n                        postFilter( temp, [], context, xml );\n\n                        // Un-match failing elements by moving them back to matcherIn\n                        i = temp.length;\n                        while ( i-- ) {\n                            if ( (elem = temp[i]) ) {\n                                matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n                            }\n                        }\n                    }\n\n                    if ( seed ) {\n                        if ( postFinder || preFilter ) {\n                            if ( postFinder ) {\n                                // Get the final matcherOut by condensing this intermediate into postFinder contexts\n                                temp = [];\n                                i = matcherOut.length;\n                                while ( i-- ) {\n                                    if ( (elem = matcherOut[i]) ) {\n                                        // Restore matcherIn since elem is not yet a final match\n                                        temp.push( (matcherIn[i] = elem) );\n                                    }\n                                }\n                                postFinder( null, (matcherOut = []), temp, xml );\n                            }\n\n                            // Move matched elements from seed to results to keep them synchronized\n                            i = matcherOut.length;\n                            while ( i-- ) {\n                                if ( (elem = matcherOut[i]) &&\n                                    (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n                                    seed[temp] = !(results[temp] = elem);\n                                }\n                            }\n                        }\n\n                        // Add elements to results, through postFinder if defined\n                    } else {\n                        matcherOut = condense(\n                            matcherOut === results ?\n                                matcherOut.splice( preexisting, matcherOut.length ) :\n                                matcherOut\n                        );\n                        if ( postFinder ) {\n                            postFinder( null, results, matcherOut, xml );\n                        } else {\n                            push.apply( results, matcherOut );\n                        }\n                    }\n                });\n            }\n\n            function matcherFromTokens( tokens ) {\n                var checkContext, matcher, j,\n                    len = tokens.length,\n                    leadingRelative = Expr.relative[ tokens[0].type ],\n                    implicitRelative = leadingRelative || Expr.relative[\" \"],\n                    i = leadingRelative ? 1 : 0,\n\n                // The foundational matcher ensures that elements are reachable from top-level context(s)\n                    matchContext = addCombinator( function( elem ) {\n                        return elem === checkContext;\n                    }, implicitRelative, true ),\n                    matchAnyContext = addCombinator( function( elem ) {\n                        return indexOf( checkContext, elem ) > -1;\n                    }, implicitRelative, true ),\n                    matchers = [ function( elem, context, xml ) {\n                        var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n                                (checkContext = context).nodeType ?\n                                    matchContext( elem, context, xml ) :\n                                    matchAnyContext( elem, context, xml ) );\n                        // Avoid hanging onto element (issue #299)\n                        checkContext = null;\n                        return ret;\n                    } ];\n\n                for ( ; i < len; i++ ) {\n                    if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n                        matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n                    } else {\n                        matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n                        // Return special upon seeing a positional matcher\n                        if ( matcher[ expando ] ) {\n                            // Find the next relative operator (if any) for proper handling\n                            j = ++i;\n                            for ( ; j < len; j++ ) {\n                                if ( Expr.relative[ tokens[j].type ] ) {\n                                    break;\n                                }\n                            }\n                            return setMatcher(\n                                i > 1 && elementMatcher( matchers ),\n                                i > 1 && toSelector(\n                                    // If the preceding token was a descendant combinator, insert an implicit any-element `*`\n                                    tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n                                ).replace( rtrim, \"$1\" ),\n                                matcher,\n                                i < j && matcherFromTokens( tokens.slice( i, j ) ),\n                                j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n                                j < len && toSelector( tokens )\n                            );\n                        }\n                        matchers.push( matcher );\n                    }\n                }\n\n                return elementMatcher( matchers );\n            }\n\n            function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n                var bySet = setMatchers.length > 0,\n                    byElement = elementMatchers.length > 0,\n                    superMatcher = function( seed, context, xml, results, outermost ) {\n                        var elem, j, matcher,\n                            matchedCount = 0,\n                            i = \"0\",\n                            unmatched = seed && [],\n                            setMatched = [],\n                            contextBackup = outermostContext,\n                        // We must always have either seed elements or outermost context\n                            elems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n                        // Use integer dirruns iff this is the outermost matcher\n                            dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n                            len = elems.length;\n\n                        if ( outermost ) {\n                            outermostContext = context === document || context || outermost;\n                        }\n\n                        // Add elements passing elementMatchers directly to results\n                        // Support: IE<9, Safari\n                        // Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n                        for ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n                            if ( byElement && elem ) {\n                                j = 0;\n                                if ( !context && elem.ownerDocument !== document ) {\n                                    setDocument( elem );\n                                    xml = !documentIsHTML;\n                                }\n                                while ( (matcher = elementMatchers[j++]) ) {\n                                    if ( matcher( elem, context || document, xml) ) {\n                                        results.push( elem );\n                                        break;\n                                    }\n                                }\n                                if ( outermost ) {\n                                    dirruns = dirrunsUnique;\n                                }\n                            }\n\n                            // Track unmatched elements for set filters\n                            if ( bySet ) {\n                                // They will have gone through all possible matchers\n                                if ( (elem = !matcher && elem) ) {\n                                    matchedCount--;\n                                }\n\n                                // Lengthen the array for every element, matched or not\n                                if ( seed ) {\n                                    unmatched.push( elem );\n                                }\n                            }\n                        }\n\n                        // `i` is now the count of elements visited above, and adding it to `matchedCount`\n                        // makes the latter nonnegative.\n                        matchedCount += i;\n\n                        // Apply set filters to unmatched elements\n                        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n                        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n                        // no element matchers and no seed.\n                        // Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n                        // case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n                        // numerically zero.\n                        if ( bySet && i !== matchedCount ) {\n                            j = 0;\n                            while ( (matcher = setMatchers[j++]) ) {\n                                matcher( unmatched, setMatched, context, xml );\n                            }\n\n                            if ( seed ) {\n                                // Reintegrate element matches to eliminate the need for sorting\n                                if ( matchedCount > 0 ) {\n                                    while ( i-- ) {\n                                        if ( !(unmatched[i] || setMatched[i]) ) {\n                                            setMatched[i] = pop.call( results );\n                                        }\n                                    }\n                                }\n\n                                // Discard index placeholder values to get only actual matches\n                                setMatched = condense( setMatched );\n                            }\n\n                            // Add matches to results\n                            push.apply( results, setMatched );\n\n                            // Seedless set matches succeeding multiple successful matchers stipulate sorting\n                            if ( outermost && !seed && setMatched.length > 0 &&\n                                ( matchedCount + setMatchers.length ) > 1 ) {\n\n                                Sizzle.uniqueSort( results );\n                            }\n                        }\n\n                        // Override manipulation of globals by nested matchers\n                        if ( outermost ) {\n                            dirruns = dirrunsUnique;\n                            outermostContext = contextBackup;\n                        }\n\n                        return unmatched;\n                    };\n\n                return bySet ?\n                    markFunction( superMatcher ) :\n                    superMatcher;\n            }\n\n            compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n                var i,\n                    setMatchers = [],\n                    elementMatchers = [],\n                    cached = compilerCache[ selector + \" \" ];\n\n                if ( !cached ) {\n                    // Generate a function of recursive functions that can be used to check each element\n                    if ( !match ) {\n                        match = tokenize( selector );\n                    }\n                    i = match.length;\n                    while ( i-- ) {\n                        cached = matcherFromTokens( match[i] );\n                        if ( cached[ expando ] ) {\n                            setMatchers.push( cached );\n                        } else {\n                            elementMatchers.push( cached );\n                        }\n                    }\n\n                    // Cache the compiled function\n                    cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n                    // Save selector and tokenization\n                    cached.selector = selector;\n                }\n                return cached;\n            };\n\n            /**\n             * A low-level selection function that works with Sizzle's compiled\n             *  selector functions\n             * @param {String|Function} selector A selector or a pre-compiled\n             *  selector function built with Sizzle.compile\n             * @param {Element} context\n             * @param {Array} [results]\n             * @param {Array} [seed] A set of elements to match against\n             */\n            select = Sizzle.select = function( selector, context, results, seed ) {\n                var i, tokens, token, type, find,\n                    compiled = typeof selector === \"function\" && selector,\n                    match = !seed && tokenize( (selector = compiled.selector || selector) );\n\n                results = results || [];\n\n                // Try to minimize operations if there is only one selector in the list and no seed\n                // (the latter of which guarantees us context)\n                if ( match.length === 1 ) {\n\n                    // Reduce context if the leading compound selector is an ID\n                    tokens = match[0] = match[0].slice( 0 );\n                    if ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n                        context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n                        context = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n                        if ( !context ) {\n                            return results;\n\n                            // Precompiled matchers will still verify ancestry, so step up a level\n                        } else if ( compiled ) {\n                            context = context.parentNode;\n                        }\n\n                        selector = selector.slice( tokens.shift().value.length );\n                    }\n\n                    // Fetch a seed set for right-to-left matching\n                    i = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n                    while ( i-- ) {\n                        token = tokens[i];\n\n                        // Abort if we hit a combinator\n                        if ( Expr.relative[ (type = token.type) ] ) {\n                            break;\n                        }\n                        if ( (find = Expr.find[ type ]) ) {\n                            // Search, expanding context for leading sibling combinators\n                            if ( (seed = find(\n                                    token.matches[0].replace( runescape, funescape ),\n                                    rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n                                )) ) {\n\n                                // If seed is empty or no tokens remain, we can return early\n                                tokens.splice( i, 1 );\n                                selector = seed.length && toSelector( tokens );\n                                if ( !selector ) {\n                                    push.apply( results, seed );\n                                    return results;\n                                }\n\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                // Compile and execute a filtering function if one is not provided\n                // Provide `match` to avoid retokenization if we modified the selector above\n                ( compiled || compile( selector, match ) )(\n                    seed,\n                    context,\n                    !documentIsHTML,\n                    results,\n                    !context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n                );\n                return results;\n            };\n\n// One-time assignments\n\n// Sort stability\n            support.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\n            support.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\n            setDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\n            support.sortDetached = assert(function( el ) {\n                // Should return 1, but returns 4 (following)\n                return el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n            });\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\n            if ( !assert(function( el ) {\n                    el.innerHTML = \"<a href='#'></a>\";\n                    return el.firstChild.getAttribute(\"href\") === \"#\" ;\n                }) ) {\n                addHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n                    if ( !isXML ) {\n                        return elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n                    }\n                });\n            }\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\n            if ( !support.attributes || !assert(function( el ) {\n                    el.innerHTML = \"<input/>\";\n                    el.firstChild.setAttribute( \"value\", \"\" );\n                    return el.firstChild.getAttribute( \"value\" ) === \"\";\n                }) ) {\n                addHandle( \"value\", function( elem, name, isXML ) {\n                    if ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n                        return elem.defaultValue;\n                    }\n                });\n            }\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\n            if ( !assert(function( el ) {\n                    return el.getAttribute(\"disabled\") == null;\n                }) ) {\n                addHandle( booleans, function( elem, name, isXML ) {\n                    var val;\n                    if ( !isXML ) {\n                        return elem[ name ] === true ? name.toLowerCase() :\n                            (val = elem.getAttributeNode( name )) && val.specified ?\n                                val.value :\n                                null;\n                    }\n                });\n            }\n\n            return Sizzle;\n\n        })( window );\n\n\n\n    jQuery.find = Sizzle;\n    jQuery.expr = Sizzle.selectors;\n\n// Deprecated\n    jQuery.expr[ \":\" ] = jQuery.expr.pseudos;\n    jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\n    jQuery.text = Sizzle.getText;\n    jQuery.isXMLDoc = Sizzle.isXML;\n    jQuery.contains = Sizzle.contains;\n    jQuery.escapeSelector = Sizzle.escape;\n\n\n\n\n    var dir = function( elem, dir, until ) {\n        var matched = [],\n            truncate = until !== undefined;\n\n        while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n            if ( elem.nodeType === 1 ) {\n                if ( truncate && jQuery( elem ).is( until ) ) {\n                    break;\n                }\n                matched.push( elem );\n            }\n        }\n        return matched;\n    };\n\n\n    var siblings = function( n, elem ) {\n        var matched = [];\n\n        for ( ; n; n = n.nextSibling ) {\n            if ( n.nodeType === 1 && n !== elem ) {\n                matched.push( n );\n            }\n        }\n\n        return matched;\n    };\n\n\n    var rneedsContext = jQuery.expr.match.needsContext;\n\n\n\n    function nodeName( elem, name ) {\n\n        return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n    };\n    var rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\n    function winnow( elements, qualifier, not ) {\n        if ( isFunction( qualifier ) ) {\n            return jQuery.grep( elements, function( elem, i ) {\n                return !!qualifier.call( elem, i, elem ) !== not;\n            } );\n        }\n\n        // Single element\n        if ( qualifier.nodeType ) {\n            return jQuery.grep( elements, function( elem ) {\n                return ( elem === qualifier ) !== not;\n            } );\n        }\n\n        // Arraylike of elements (jQuery, arguments, Array)\n        if ( typeof qualifier !== \"string\" ) {\n            return jQuery.grep( elements, function( elem ) {\n                return ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n            } );\n        }\n\n        // Filtered directly for both simple and complex selectors\n        return jQuery.filter( qualifier, elements, not );\n    }\n\n    jQuery.filter = function( expr, elems, not ) {\n        var elem = elems[ 0 ];\n\n        if ( not ) {\n            expr = \":not(\" + expr + \")\";\n        }\n\n        if ( elems.length === 1 && elem.nodeType === 1 ) {\n            return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n        }\n\n        return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n            return elem.nodeType === 1;\n        } ) );\n    };\n\n    jQuery.fn.extend( {\n        find: function( selector ) {\n            var i, ret,\n                len = this.length,\n                self = this;\n\n            if ( typeof selector !== \"string\" ) {\n                return this.pushStack( jQuery( selector ).filter( function() {\n                    for ( i = 0; i < len; i++ ) {\n                        if ( jQuery.contains( self[ i ], this ) ) {\n                            return true;\n                        }\n                    }\n                } ) );\n            }\n\n            ret = this.pushStack( [] );\n\n            for ( i = 0; i < len; i++ ) {\n                jQuery.find( selector, self[ i ], ret );\n            }\n\n            return len > 1 ? jQuery.uniqueSort( ret ) : ret;\n        },\n        filter: function( selector ) {\n            return this.pushStack( winnow( this, selector || [], false ) );\n        },\n        not: function( selector ) {\n            return this.pushStack( winnow( this, selector || [], true ) );\n        },\n        is: function( selector ) {\n            return !!winnow(\n                this,\n\n                // If this is a positional/relative selector, check membership in the returned set\n                // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n                typeof selector === \"string\" && rneedsContext.test( selector ) ?\n                    jQuery( selector ) :\n                selector || [],\n                false\n            ).length;\n        }\n    } );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\n    var rootjQuery,\n\n    // A simple way to check for HTML strings\n    // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n    // Strict HTML recognition (#11290: must start with <)\n    // Shortcut simple #id case for speed\n        rquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n        init = jQuery.fn.init = function( selector, context, root ) {\n            var match, elem;\n\n            // HANDLE: $(\"\"), $(null), $(undefined), $(false)\n            if ( !selector ) {\n                return this;\n            }\n\n            // Method init() accepts an alternate rootjQuery\n            // so migrate can support jQuery.sub (gh-2101)\n            root = root || rootjQuery;\n\n            // Handle HTML strings\n            if ( typeof selector === \"string\" ) {\n                if ( selector[ 0 ] === \"<\" &&\n                    selector[ selector.length - 1 ] === \">\" &&\n                    selector.length >= 3 ) {\n\n                    // Assume that strings that start and end with <> are HTML and skip the regex check\n                    match = [ null, selector, null ];\n\n                } else {\n                    match = rquickExpr.exec( selector );\n                }\n\n                // Match html or make sure no context is specified for #id\n                if ( match && ( match[ 1 ] || !context ) ) {\n\n                    // HANDLE: $(html) -> $(array)\n                    if ( match[ 1 ] ) {\n                        context = context instanceof jQuery ? context[ 0 ] : context;\n\n                        // Option to run scripts is true for back-compat\n                        // Intentionally let the error be thrown if parseHTML is not present\n                        jQuery.merge( this, jQuery.parseHTML(\n                            match[ 1 ],\n                            context && context.nodeType ? context.ownerDocument || context : document,\n                            true\n                        ) );\n\n                        // HANDLE: $(html, props)\n                        if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n                            for ( match in context ) {\n\n                                // Properties of context are called as methods if possible\n                                if ( isFunction( this[ match ] ) ) {\n                                    this[ match ]( context[ match ] );\n\n                                    // ...and otherwise set as attributes\n                                } else {\n                                    this.attr( match, context[ match ] );\n                                }\n                            }\n                        }\n\n                        return this;\n\n                        // HANDLE: $(#id)\n                    } else {\n                        elem = document.getElementById( match[ 2 ] );\n\n                        if ( elem ) {\n\n                            // Inject the element directly into the jQuery object\n                            this[ 0 ] = elem;\n                            this.length = 1;\n                        }\n                        return this;\n                    }\n\n                    // HANDLE: $(expr, $(...))\n                } else if ( !context || context.jquery ) {\n                    return ( context || root ).find( selector );\n\n                    // HANDLE: $(expr, context)\n                    // (which is just equivalent to: $(context).find(expr)\n                } else {\n                    return this.constructor( context ).find( selector );\n                }\n\n                // HANDLE: $(DOMElement)\n            } else if ( selector.nodeType ) {\n                this[ 0 ] = selector;\n                this.length = 1;\n                return this;\n\n                // HANDLE: $(function)\n                // Shortcut for document ready\n            } else if ( isFunction( selector ) ) {\n                return root.ready !== undefined ?\n                    root.ready( selector ) :\n\n                    // Execute immediately if ready is not present\n                    selector( jQuery );\n            }\n\n            return jQuery.makeArray( selector, this );\n        };\n\n// Give the init function the jQuery prototype for later instantiation\n    init.prototype = jQuery.fn;\n\n// Initialize central reference\n    rootjQuery = jQuery( document );\n\n\n    var rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n    // Methods guaranteed to produce a unique set when starting from a unique set\n        guaranteedUnique = {\n            children: true,\n            contents: true,\n            next: true,\n            prev: true\n        };\n\n    jQuery.fn.extend( {\n        has: function( target ) {\n            var targets = jQuery( target, this ),\n                l = targets.length;\n\n            return this.filter( function() {\n                var i = 0;\n                for ( ; i < l; i++ ) {\n                    if ( jQuery.contains( this, targets[ i ] ) ) {\n                        return true;\n                    }\n                }\n            } );\n        },\n\n        closest: function( selectors, context ) {\n            var cur,\n                i = 0,\n                l = this.length,\n                matched = [],\n                targets = typeof selectors !== \"string\" && jQuery( selectors );\n\n            // Positional selectors never match, since there's no _selection_ context\n            if ( !rneedsContext.test( selectors ) ) {\n                for ( ; i < l; i++ ) {\n                    for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n                        // Always skip document fragments\n                        if ( cur.nodeType < 11 && ( targets ?\n                            targets.index( cur ) > -1 :\n\n                                // Don't pass non-elements to Sizzle\n                            cur.nodeType === 1 &&\n                            jQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n                            matched.push( cur );\n                            break;\n                        }\n                    }\n                }\n            }\n\n            return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n        },\n\n        // Determine the position of an element within the set\n        index: function( elem ) {\n\n            // No argument, return index in parent\n            if ( !elem ) {\n                return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n            }\n\n            // Index in selector\n            if ( typeof elem === \"string\" ) {\n                return indexOf.call( jQuery( elem ), this[ 0 ] );\n            }\n\n            // Locate the position of the desired element\n            return indexOf.call( this,\n\n                // If it receives a jQuery object, the first element is used\n                elem.jquery ? elem[ 0 ] : elem\n            );\n        },\n\n        add: function( selector, context ) {\n            return this.pushStack(\n                jQuery.uniqueSort(\n                    jQuery.merge( this.get(), jQuery( selector, context ) )\n                )\n            );\n        },\n\n        addBack: function( selector ) {\n            return this.add( selector == null ?\n                this.prevObject : this.prevObject.filter( selector )\n            );\n        }\n    } );\n\n    function sibling( cur, dir ) {\n        while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n        return cur;\n    }\n\n    jQuery.each( {\n        parent: function( elem ) {\n            var parent = elem.parentNode;\n            return parent && parent.nodeType !== 11 ? parent : null;\n        },\n        parents: function( elem ) {\n            return dir( elem, \"parentNode\" );\n        },\n        parentsUntil: function( elem, i, until ) {\n            return dir( elem, \"parentNode\", until );\n        },\n        next: function( elem ) {\n            return sibling( elem, \"nextSibling\" );\n        },\n        prev: function( elem ) {\n            return sibling( elem, \"previousSibling\" );\n        },\n        nextAll: function( elem ) {\n            return dir( elem, \"nextSibling\" );\n        },\n        prevAll: function( elem ) {\n            return dir( elem, \"previousSibling\" );\n        },\n        nextUntil: function( elem, i, until ) {\n            return dir( elem, \"nextSibling\", until );\n        },\n        prevUntil: function( elem, i, until ) {\n            return dir( elem, \"previousSibling\", until );\n        },\n        siblings: function( elem ) {\n            return siblings( ( elem.parentNode || {} ).firstChild, elem );\n        },\n        children: function( elem ) {\n            return siblings( elem.firstChild );\n        },\n        contents: function( elem ) {\n            if ( nodeName( elem, \"iframe\" ) ) {\n                return elem.contentDocument;\n            }\n\n            // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n            // Treat the template.html element as a regular one in browsers that\n            // don't support it.\n            if ( nodeName( elem, \"template\" ) ) {\n                elem = elem.content || elem;\n            }\n\n            return jQuery.merge( [], elem.childNodes );\n        }\n    }, function( name, fn ) {\n        jQuery.fn[ name ] = function( until, selector ) {\n            var matched = jQuery.map( this, fn, until );\n\n            if ( name.slice( -5 ) !== \"Until\" ) {\n                selector = until;\n            }\n\n            if ( selector && typeof selector === \"string\" ) {\n                matched = jQuery.filter( selector, matched );\n            }\n\n            if ( this.length > 1 ) {\n\n                // Remove duplicates\n                if ( !guaranteedUnique[ name ] ) {\n                    jQuery.uniqueSort( matched );\n                }\n\n                // Reverse order for parents* and prev-derivatives\n                if ( rparentsprev.test( name ) ) {\n                    matched.reverse();\n                }\n            }\n\n            return this.pushStack( matched );\n        };\n    } );\n    var rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\n    function createOptions( options ) {\n        var object = {};\n        jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n            object[ flag ] = true;\n        } );\n        return object;\n    }\n\n    /*\n     * Create a callback list using the following parameters:\n     *\n     *\toptions: an optional list of space-separated options that will change how\n     *\t\t\tthe callback list behaves or a more traditional option object\n     *\n     * By default a callback list will act like an event callback list and can be\n     * \"fired\" multiple times.\n     *\n     * Possible options:\n     *\n     *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n     *\n     *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n     *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n     *\t\t\t\t\tvalues (like a Deferred)\n     *\n     *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n     *\n     *\tstopOnFalse:\tinterrupt callings when a callback returns false\n     *\n     */\n    jQuery.Callbacks = function( options ) {\n\n        // Convert options from String-formatted to Object-formatted if needed\n        // (we check in cache first)\n        options = typeof options === \"string\" ?\n            createOptions( options ) :\n            jQuery.extend( {}, options );\n\n        var // Flag to know if list is currently firing\n            firing,\n\n        // Last fire value for non-forgettable lists\n            memory,\n\n        // Flag to know if list was already fired\n            fired,\n\n        // Flag to prevent firing\n            locked,\n\n        // Actual callback list\n            list = [],\n\n        // Queue of execution data for repeatable lists\n            queue = [],\n\n        // Index of currently firing callback (modified by add/remove as needed)\n            firingIndex = -1,\n\n        // Fire callbacks\n            fire = function() {\n\n                // Enforce single-firing\n                locked = locked || options.once;\n\n                // Execute callbacks for all pending executions,\n                // respecting firingIndex overrides and runtime changes\n                fired = firing = true;\n                for ( ; queue.length; firingIndex = -1 ) {\n                    memory = queue.shift();\n                    while ( ++firingIndex < list.length ) {\n\n                        // Run callback and check for early termination\n                        if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n                            options.stopOnFalse ) {\n\n                            // Jump to end and forget the data so .add doesn't re-fire\n                            firingIndex = list.length;\n                            memory = false;\n                        }\n                    }\n                }\n\n                // Forget the data if we're done with it\n                if ( !options.memory ) {\n                    memory = false;\n                }\n\n                firing = false;\n\n                // Clean up if we're done firing for good\n                if ( locked ) {\n\n                    // Keep an empty list if we have data for future add calls\n                    if ( memory ) {\n                        list = [];\n\n                        // Otherwise, this object is spent\n                    } else {\n                        list = \"\";\n                    }\n                }\n            },\n\n        // Actual Callbacks object\n            self = {\n\n                // Add a callback or a collection of callbacks to the list\n                add: function() {\n                    if ( list ) {\n\n                        // If we have memory from a past run, we should fire after adding\n                        if ( memory && !firing ) {\n                            firingIndex = list.length - 1;\n                            queue.push( memory );\n                        }\n\n                        ( function add( args ) {\n                            jQuery.each( args, function( _, arg ) {\n                                if ( isFunction( arg ) ) {\n                                    if ( !options.unique || !self.has( arg ) ) {\n                                        list.push( arg );\n                                    }\n                                } else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n                                    // Inspect recursively\n                                    add( arg );\n                                }\n                            } );\n                        } )( arguments );\n\n                        if ( memory && !firing ) {\n                            fire();\n                        }\n                    }\n                    return this;\n                },\n\n                // Remove a callback from the list\n                remove: function() {\n                    jQuery.each( arguments, function( _, arg ) {\n                        var index;\n                        while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n                            list.splice( index, 1 );\n\n                            // Handle firing indexes\n                            if ( index <= firingIndex ) {\n                                firingIndex--;\n                            }\n                        }\n                    } );\n                    return this;\n                },\n\n                // Check if a given callback is in the list.\n                // If no argument is given, return whether or not list has callbacks attached.\n                has: function( fn ) {\n                    return fn ?\n                    jQuery.inArray( fn, list ) > -1 :\n                    list.length > 0;\n                },\n\n                // Remove all callbacks from the list\n                empty: function() {\n                    if ( list ) {\n                        list = [];\n                    }\n                    return this;\n                },\n\n                // Disable .fire and .add\n                // Abort any current/pending executions\n                // Clear all callbacks and values\n                disable: function() {\n                    locked = queue = [];\n                    list = memory = \"\";\n                    return this;\n                },\n                disabled: function() {\n                    return !list;\n                },\n\n                // Disable .fire\n                // Also disable .add unless we have memory (since it would have no effect)\n                // Abort any pending executions\n                lock: function() {\n                    locked = queue = [];\n                    if ( !memory && !firing ) {\n                        list = memory = \"\";\n                    }\n                    return this;\n                },\n                locked: function() {\n                    return !!locked;\n                },\n\n                // Call all callbacks with the given context and arguments\n                fireWith: function( context, args ) {\n                    if ( !locked ) {\n                        args = args || [];\n                        args = [ context, args.slice ? args.slice() : args ];\n                        queue.push( args );\n                        if ( !firing ) {\n                            fire();\n                        }\n                    }\n                    return this;\n                },\n\n                // Call all the callbacks with the given arguments\n                fire: function() {\n                    self.fireWith( this, arguments );\n                    return this;\n                },\n\n                // To know if the callbacks have already been called at least once\n                fired: function() {\n                    return !!fired;\n                }\n            };\n\n        return self;\n    };\n\n\n    function Identity( v ) {\n        return v;\n    }\n    function Thrower( ex ) {\n        throw ex;\n    }\n\n    function adoptValue( value, resolve, reject, noValue ) {\n        var method;\n\n        try {\n\n            // Check for promise aspect first to privilege synchronous behavior\n            if ( value && isFunction( ( method = value.promise ) ) ) {\n                method.call( value ).done( resolve ).fail( reject );\n\n                // Other thenables\n            } else if ( value && isFunction( ( method = value.then ) ) ) {\n                method.call( value, resolve, reject );\n\n                // Other non-thenables\n            } else {\n\n                // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n                // * false: [ value ].slice( 0 ) => resolve( value )\n                // * true: [ value ].slice( 1 ) => resolve()\n                resolve.apply( undefined, [ value ].slice( noValue ) );\n            }\n\n            // For Promises/A+, convert exceptions into rejections\n            // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n            // Deferred#then to conditionally suppress rejection.\n        } catch ( value ) {\n\n            // Support: Android 4.0 only\n            // Strict mode functions invoked without .call/.apply get global-object context\n            reject.apply( undefined, [ value ] );\n        }\n    }\n\n    jQuery.extend( {\n\n        Deferred: function( func ) {\n            var tuples = [\n\n                    // action, add listener, callbacks,\n                    // ... .then handlers, argument index, [final state]\n                    [ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n                        jQuery.Callbacks( \"memory\" ), 2 ],\n                    [ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n                        jQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n                    [ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n                        jQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n                ],\n                state = \"pending\",\n                promise = {\n                    state: function() {\n                        return state;\n                    },\n                    always: function() {\n                        deferred.done( arguments ).fail( arguments );\n                        return this;\n                    },\n                    \"catch\": function( fn ) {\n                        return promise.then( null, fn );\n                    },\n\n                    // Keep pipe for back-compat\n                    pipe: function( /* fnDone, fnFail, fnProgress */ ) {\n                        var fns = arguments;\n\n                        return jQuery.Deferred( function( newDefer ) {\n                            jQuery.each( tuples, function( i, tuple ) {\n\n                                // Map tuples (progress, done, fail) to arguments (done, fail, progress)\n                                var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n                                // deferred.progress(function() { bind to newDefer or newDefer.notify })\n                                // deferred.done(function() { bind to newDefer or newDefer.resolve })\n                                // deferred.fail(function() { bind to newDefer or newDefer.reject })\n                                deferred[ tuple[ 1 ] ]( function() {\n                                    var returned = fn && fn.apply( this, arguments );\n                                    if ( returned && isFunction( returned.promise ) ) {\n                                        returned.promise()\n                                            .progress( newDefer.notify )\n                                            .done( newDefer.resolve )\n                                            .fail( newDefer.reject );\n                                    } else {\n                                        newDefer[ tuple[ 0 ] + \"With\" ](\n                                            this,\n                                            fn ? [ returned ] : arguments\n                                        );\n                                    }\n                                } );\n                            } );\n                            fns = null;\n                        } ).promise();\n                    },\n                    then: function( onFulfilled, onRejected, onProgress ) {\n                        var maxDepth = 0;\n                        function resolve( depth, deferred, handler, special ) {\n                            return function() {\n                                var that = this,\n                                    args = arguments,\n                                    mightThrow = function() {\n                                        var returned, then;\n\n                                        // Support: Promises/A+ section 2.3.3.3.3\n                                        // https://promisesaplus.com/#point-59\n                                        // Ignore double-resolution attempts\n                                        if ( depth < maxDepth ) {\n                                            return;\n                                        }\n\n                                        returned = handler.apply( that, args );\n\n                                        // Support: Promises/A+ section 2.3.1\n                                        // https://promisesaplus.com/#point-48\n                                        if ( returned === deferred.promise() ) {\n                                            throw new TypeError( \"Thenable self-resolution\" );\n                                        }\n\n                                        // Support: Promises/A+ sections 2.3.3.1, 3.5\n                                        // https://promisesaplus.com/#point-54\n                                        // https://promisesaplus.com/#point-75\n                                        // Retrieve `then` only once\n                                        then = returned &&\n\n                                            // Support: Promises/A+ section 2.3.4\n                                            // https://promisesaplus.com/#point-64\n                                            // Only check objects and functions for thenability\n                                            ( typeof returned === \"object\" ||\n                                            typeof returned === \"function\" ) &&\n                                            returned.then;\n\n                                        // Handle a returned thenable\n                                        if ( isFunction( then ) ) {\n\n                                            // Special processors (notify) just wait for resolution\n                                            if ( special ) {\n                                                then.call(\n                                                    returned,\n                                                    resolve( maxDepth, deferred, Identity, special ),\n                                                    resolve( maxDepth, deferred, Thrower, special )\n                                                );\n\n                                                // Normal processors (resolve) also hook into progress\n                                            } else {\n\n                                                // ...and disregard older resolution values\n                                                maxDepth++;\n\n                                                then.call(\n                                                    returned,\n                                                    resolve( maxDepth, deferred, Identity, special ),\n                                                    resolve( maxDepth, deferred, Thrower, special ),\n                                                    resolve( maxDepth, deferred, Identity,\n                                                        deferred.notifyWith )\n                                                );\n                                            }\n\n                                            // Handle all other returned values\n                                        } else {\n\n                                            // Only substitute handlers pass on context\n                                            // and multiple values (non-spec behavior)\n                                            if ( handler !== Identity ) {\n                                                that = undefined;\n                                                args = [ returned ];\n                                            }\n\n                                            // Process the value(s)\n                                            // Default process is resolve\n                                            ( special || deferred.resolveWith )( that, args );\n                                        }\n                                    },\n\n                                // Only normal processors (resolve) catch and reject exceptions\n                                    process = special ?\n                                        mightThrow :\n                                        function() {\n                                            try {\n                                                mightThrow();\n                                            } catch ( e ) {\n\n                                                if ( jQuery.Deferred.exceptionHook ) {\n                                                    jQuery.Deferred.exceptionHook( e,\n                                                        process.stackTrace );\n                                                }\n\n                                                // Support: Promises/A+ section 2.3.3.3.4.1\n                                                // https://promisesaplus.com/#point-61\n                                                // Ignore post-resolution exceptions\n                                                if ( depth + 1 >= maxDepth ) {\n\n                                                    // Only substitute handlers pass on context\n                                                    // and multiple values (non-spec behavior)\n                                                    if ( handler !== Thrower ) {\n                                                        that = undefined;\n                                                        args = [ e ];\n                                                    }\n\n                                                    deferred.rejectWith( that, args );\n                                                }\n                                            }\n                                        };\n\n                                // Support: Promises/A+ section 2.3.3.3.1\n                                // https://promisesaplus.com/#point-57\n                                // Re-resolve promises immediately to dodge false rejection from\n                                // subsequent errors\n                                if ( depth ) {\n                                    process();\n                                } else {\n\n                                    // Call an optional hook to record the stack, in case of exception\n                                    // since it's otherwise lost when execution goes async\n                                    if ( jQuery.Deferred.getStackHook ) {\n                                        process.stackTrace = jQuery.Deferred.getStackHook();\n                                    }\n                                    window.setTimeout( process );\n                                }\n                            };\n                        }\n\n                        return jQuery.Deferred( function( newDefer ) {\n\n                            // progress_handlers.add( ... )\n                            tuples[ 0 ][ 3 ].add(\n                                resolve(\n                                    0,\n                                    newDefer,\n                                    isFunction( onProgress ) ?\n                                        onProgress :\n                                        Identity,\n                                    newDefer.notifyWith\n                                )\n                            );\n\n                            // fulfilled_handlers.add( ... )\n                            tuples[ 1 ][ 3 ].add(\n                                resolve(\n                                    0,\n                                    newDefer,\n                                    isFunction( onFulfilled ) ?\n                                        onFulfilled :\n                                        Identity\n                                )\n                            );\n\n                            // rejected_handlers.add( ... )\n                            tuples[ 2 ][ 3 ].add(\n                                resolve(\n                                    0,\n                                    newDefer,\n                                    isFunction( onRejected ) ?\n                                        onRejected :\n                                        Thrower\n                                )\n                            );\n                        } ).promise();\n                    },\n\n                    // Get a promise for this deferred\n                    // If obj is provided, the promise aspect is added to the object\n                    promise: function( obj ) {\n                        return obj != null ? jQuery.extend( obj, promise ) : promise;\n                    }\n                },\n                deferred = {};\n\n            // Add list-specific methods\n            jQuery.each( tuples, function( i, tuple ) {\n                var list = tuple[ 2 ],\n                    stateString = tuple[ 5 ];\n\n                // promise.progress = list.add\n                // promise.done = list.add\n                // promise.fail = list.add\n                promise[ tuple[ 1 ] ] = list.add;\n\n                // Handle state\n                if ( stateString ) {\n                    list.add(\n                        function() {\n\n                            // state = \"resolved\" (i.e., fulfilled)\n                            // state = \"rejected\"\n                            state = stateString;\n                        },\n\n                        // rejected_callbacks.disable\n                        // fulfilled_callbacks.disable\n                        tuples[ 3 - i ][ 2 ].disable,\n\n                        // rejected_handlers.disable\n                        // fulfilled_handlers.disable\n                        tuples[ 3 - i ][ 3 ].disable,\n\n                        // progress_callbacks.lock\n                        tuples[ 0 ][ 2 ].lock,\n\n                        // progress_handlers.lock\n                        tuples[ 0 ][ 3 ].lock\n                    );\n                }\n\n                // progress_handlers.fire\n                // fulfilled_handlers.fire\n                // rejected_handlers.fire\n                list.add( tuple[ 3 ].fire );\n\n                // deferred.notify = function() { deferred.notifyWith(...) }\n                // deferred.resolve = function() { deferred.resolveWith(...) }\n                // deferred.reject = function() { deferred.rejectWith(...) }\n                deferred[ tuple[ 0 ] ] = function() {\n                    deferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n                    return this;\n                };\n\n                // deferred.notifyWith = list.fireWith\n                // deferred.resolveWith = list.fireWith\n                // deferred.rejectWith = list.fireWith\n                deferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n            } );\n\n            // Make the deferred a promise\n            promise.promise( deferred );\n\n            // Call given func if any\n            if ( func ) {\n                func.call( deferred, deferred );\n            }\n\n            // All done!\n            return deferred;\n        },\n\n        // Deferred helper\n        when: function( singleValue ) {\n            var\n\n            // count of uncompleted subordinates\n                remaining = arguments.length,\n\n            // count of unprocessed arguments\n                i = remaining,\n\n            // subordinate fulfillment data\n                resolveContexts = Array( i ),\n                resolveValues = slice.call( arguments ),\n\n            // the master Deferred\n                master = jQuery.Deferred(),\n\n            // subordinate callback factory\n                updateFunc = function( i ) {\n                    return function( value ) {\n                        resolveContexts[ i ] = this;\n                        resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n                        if ( !( --remaining ) ) {\n                            master.resolveWith( resolveContexts, resolveValues );\n                        }\n                    };\n                };\n\n            // Single- and empty arguments are adopted like Promise.resolve\n            if ( remaining <= 1 ) {\n                adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n                    !remaining );\n\n                // Use .then() to unwrap secondary thenables (cf. gh-3000)\n                if ( master.state() === \"pending\" ||\n                    isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n                    return master.then();\n                }\n            }\n\n            // Multiple arguments are aggregated like Promise.all array elements\n            while ( i-- ) {\n                adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n            }\n\n            return master.promise();\n        }\n    } );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\n    var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n    jQuery.Deferred.exceptionHook = function( error, stack ) {\n\n        // Support: IE 8 - 9 only\n        // Console exists when dev tools are open, which can happen at any time\n        if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n            window.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n        }\n    };\n\n\n\n\n    jQuery.readyException = function( error ) {\n        window.setTimeout( function() {\n            throw error;\n        } );\n    };\n\n\n\n\n// The deferred used on DOM ready\n    var readyList = jQuery.Deferred();\n\n    jQuery.fn.ready = function( fn ) {\n\n        readyList\n            .then( fn )\n\n            // Wrap jQuery.readyException in a function so that the lookup\n            // happens at the time of error handling instead of callback\n            // registration.\n            .catch( function( error ) {\n                jQuery.readyException( error );\n            } );\n\n        return this;\n    };\n\n    jQuery.extend( {\n\n        // Is the DOM ready to be used? Set to true once it occurs.\n        isReady: false,\n\n        // A counter to track how many items to wait for before\n        // the ready event fires. See #6781\n        readyWait: 1,\n\n        // Handle when the DOM is ready\n        ready: function( wait ) {\n\n            // Abort if there are pending holds or we're already ready\n            if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n                return;\n            }\n\n            // Remember that the DOM is ready\n            jQuery.isReady = true;\n\n            // If a normal DOM Ready event fired, decrement, and wait if need be\n            if ( wait !== true && --jQuery.readyWait > 0 ) {\n                return;\n            }\n\n            // If there are functions bound, to execute\n            readyList.resolveWith( document, [ jQuery ] );\n        }\n    } );\n\n    jQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\n    function completed() {\n        document.removeEventListener( \"DOMContentLoaded\", completed );\n        window.removeEventListener( \"load\", completed );\n        jQuery.ready();\n    }\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\n    if ( document.readyState === \"complete\" ||\n        ( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n        // Handle it asynchronously to allow scripts the opportunity to delay ready\n        window.setTimeout( jQuery.ready );\n\n    } else {\n\n        // Use the handy event callback\n        document.addEventListener( \"DOMContentLoaded\", completed );\n\n        // A fallback to window.onload, that will always work\n        window.addEventListener( \"load\", completed );\n    }\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\n    var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n        var i = 0,\n            len = elems.length,\n            bulk = key == null;\n\n        // Sets many values\n        if ( toType( key ) === \"object\" ) {\n            chainable = true;\n            for ( i in key ) {\n                access( elems, fn, i, key[ i ], true, emptyGet, raw );\n            }\n\n            // Sets one value\n        } else if ( value !== undefined ) {\n            chainable = true;\n\n            if ( !isFunction( value ) ) {\n                raw = true;\n            }\n\n            if ( bulk ) {\n\n                // Bulk operations run against the entire set\n                if ( raw ) {\n                    fn.call( elems, value );\n                    fn = null;\n\n                    // ...except when executing function values\n                } else {\n                    bulk = fn;\n                    fn = function( elem, key, value ) {\n                        return bulk.call( jQuery( elem ), value );\n                    };\n                }\n            }\n\n            if ( fn ) {\n                for ( ; i < len; i++ ) {\n                    fn(\n                        elems[ i ], key, raw ?\n                            value :\n                            value.call( elems[ i ], i, fn( elems[ i ], key ) )\n                    );\n                }\n            }\n        }\n\n        if ( chainable ) {\n            return elems;\n        }\n\n        // Gets\n        if ( bulk ) {\n            return fn.call( elems );\n        }\n\n        return len ? fn( elems[ 0 ], key ) : emptyGet;\n    };\n\n\n// Matches dashed string for camelizing\n    var rmsPrefix = /^-ms-/,\n        rdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\n    function fcamelCase( all, letter ) {\n        return letter.toUpperCase();\n    }\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\n    function camelCase( string ) {\n        return string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n    }\n    var acceptData = function( owner ) {\n\n        // Accepts only:\n        //  - Node\n        //    - Node.ELEMENT_NODE\n        //    - Node.DOCUMENT_NODE\n        //  - Object\n        //    - Any\n        return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n    };\n\n\n\n\n    function Data() {\n        this.expando = jQuery.expando + Data.uid++;\n    }\n\n    Data.uid = 1;\n\n    Data.prototype = {\n\n        cache: function( owner ) {\n\n            // Check if the owner object already has a cache\n            var value = owner[ this.expando ];\n\n            // If not, create one\n            if ( !value ) {\n                value = {};\n\n                // We can accept data for non-element nodes in modern browsers,\n                // but we should not, see #8335.\n                // Always return an empty object.\n                if ( acceptData( owner ) ) {\n\n                    // If it is a node unlikely to be stringify-ed or looped over\n                    // use plain assignment\n                    if ( owner.nodeType ) {\n                        owner[ this.expando ] = value;\n\n                        // Otherwise secure it in a non-enumerable property\n                        // configurable must be true to allow the property to be\n                        // deleted when data is removed\n                    } else {\n                        Object.defineProperty( owner, this.expando, {\n                            value: value,\n                            configurable: true\n                        } );\n                    }\n                }\n            }\n\n            return value;\n        },\n        set: function( owner, data, value ) {\n            var prop,\n                cache = this.cache( owner );\n\n            // Handle: [ owner, key, value ] args\n            // Always use camelCase key (gh-2257)\n            if ( typeof data === \"string\" ) {\n                cache[ camelCase( data ) ] = value;\n\n                // Handle: [ owner, { properties } ] args\n            } else {\n\n                // Copy the properties one-by-one to the cache object\n                for ( prop in data ) {\n                    cache[ camelCase( prop ) ] = data[ prop ];\n                }\n            }\n            return cache;\n        },\n        get: function( owner, key ) {\n            return key === undefined ?\n                this.cache( owner ) :\n\n                // Always use camelCase key (gh-2257)\n            owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n        },\n        access: function( owner, key, value ) {\n\n            // In cases where either:\n            //\n            //   1. No key was specified\n            //   2. A string key was specified, but no value provided\n            //\n            // Take the \"read\" path and allow the get method to determine\n            // which value to return, respectively either:\n            //\n            //   1. The entire cache object\n            //   2. The data stored at the key\n            //\n            if ( key === undefined ||\n                ( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n                return this.get( owner, key );\n            }\n\n            // When the key is not a string, or both a key and value\n            // are specified, set or extend (existing objects) with either:\n            //\n            //   1. An object of properties\n            //   2. A key and value\n            //\n            this.set( owner, key, value );\n\n            // Since the \"set\" path can have two possible entry points\n            // return the expected data based on which path was taken[*]\n            return value !== undefined ? value : key;\n        },\n        remove: function( owner, key ) {\n            var i,\n                cache = owner[ this.expando ];\n\n            if ( cache === undefined ) {\n                return;\n            }\n\n            if ( key !== undefined ) {\n\n                // Support array or space separated string of keys\n                if ( Array.isArray( key ) ) {\n\n                    // If key is an array of keys...\n                    // We always set camelCase keys, so remove that.\n                    key = key.map( camelCase );\n                } else {\n                    key = camelCase( key );\n\n                    // If a key with the spaces exists, use it.\n                    // Otherwise, create an array by matching non-whitespace\n                    key = key in cache ?\n                        [ key ] :\n                        ( key.match( rnothtmlwhite ) || [] );\n                }\n\n                i = key.length;\n\n                while ( i-- ) {\n                    delete cache[ key[ i ] ];\n                }\n            }\n\n            // Remove the expando if there's no more data\n            if ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n                // Support: Chrome <=35 - 45\n                // Webkit & Blink performance suffers when deleting properties\n                // from DOM nodes, so set to undefined instead\n                // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n                if ( owner.nodeType ) {\n                    owner[ this.expando ] = undefined;\n                } else {\n                    delete owner[ this.expando ];\n                }\n            }\n        },\n        hasData: function( owner ) {\n            var cache = owner[ this.expando ];\n            return cache !== undefined && !jQuery.isEmptyObject( cache );\n        }\n    };\n    var dataPriv = new Data();\n\n    var dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\n    var rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n        rmultiDash = /[A-Z]/g;\n\n    function getData( data ) {\n        if ( data === \"true\" ) {\n            return true;\n        }\n\n        if ( data === \"false\" ) {\n            return false;\n        }\n\n        if ( data === \"null\" ) {\n            return null;\n        }\n\n        // Only convert to a number if it doesn't change the string\n        if ( data === +data + \"\" ) {\n            return +data;\n        }\n\n        if ( rbrace.test( data ) ) {\n            return JSON.parse( data );\n        }\n\n        return data;\n    }\n\n    function dataAttr( elem, key, data ) {\n        var name;\n\n        // If nothing was found internally, try to fetch any\n        // data from the HTML5 data-* attribute\n        if ( data === undefined && elem.nodeType === 1 ) {\n            name = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n            data = elem.getAttribute( name );\n\n            if ( typeof data === \"string\" ) {\n                try {\n                    data = getData( data );\n                } catch ( e ) {}\n\n                // Make sure we set the data so it isn't changed later\n                dataUser.set( elem, key, data );\n            } else {\n                data = undefined;\n            }\n        }\n        return data;\n    }\n\n    jQuery.extend( {\n        hasData: function( elem ) {\n            return dataUser.hasData( elem ) || dataPriv.hasData( elem );\n        },\n\n        data: function( elem, name, data ) {\n            return dataUser.access( elem, name, data );\n        },\n\n        removeData: function( elem, name ) {\n            dataUser.remove( elem, name );\n        },\n\n        // TODO: Now that all calls to _data and _removeData have been replaced\n        // with direct calls to dataPriv methods, these can be deprecated.\n        _data: function( elem, name, data ) {\n            return dataPriv.access( elem, name, data );\n        },\n\n        _removeData: function( elem, name ) {\n            dataPriv.remove( elem, name );\n        }\n    } );\n\n    jQuery.fn.extend( {\n        data: function( key, value ) {\n            var i, name, data,\n                elem = this[ 0 ],\n                attrs = elem && elem.attributes;\n\n            // Gets all values\n            if ( key === undefined ) {\n                if ( this.length ) {\n                    data = dataUser.get( elem );\n\n                    if ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n                        i = attrs.length;\n                        while ( i-- ) {\n\n                            // Support: IE 11 only\n                            // The attrs elements can be null (#14894)\n                            if ( attrs[ i ] ) {\n                                name = attrs[ i ].name;\n                                if ( name.indexOf( \"data-\" ) === 0 ) {\n                                    name = camelCase( name.slice( 5 ) );\n                                    dataAttr( elem, name, data[ name ] );\n                                }\n                            }\n                        }\n                        dataPriv.set( elem, \"hasDataAttrs\", true );\n                    }\n                }\n\n                return data;\n            }\n\n            // Sets multiple values\n            if ( typeof key === \"object\" ) {\n                return this.each( function() {\n                    dataUser.set( this, key );\n                } );\n            }\n\n            return access( this, function( value ) {\n                var data;\n\n                // The calling jQuery object (element matches) is not empty\n                // (and therefore has an element appears at this[ 0 ]) and the\n                // `value` parameter was not undefined. An empty jQuery object\n                // will result in `undefined` for elem = this[ 0 ] which will\n                // throw an exception if an attempt to read a data cache is made.\n                if ( elem && value === undefined ) {\n\n                    // Attempt to get data from the cache\n                    // The key will always be camelCased in Data\n                    data = dataUser.get( elem, key );\n                    if ( data !== undefined ) {\n                        return data;\n                    }\n\n                    // Attempt to \"discover\" the data in\n                    // HTML5 custom data-* attrs\n                    data = dataAttr( elem, key );\n                    if ( data !== undefined ) {\n                        return data;\n                    }\n\n                    // We tried really hard, but the data doesn't exist.\n                    return;\n                }\n\n                // Set the data...\n                this.each( function() {\n\n                    // We always store the camelCased key\n                    dataUser.set( this, key, value );\n                } );\n            }, null, value, arguments.length > 1, null, true );\n        },\n\n        removeData: function( key ) {\n            return this.each( function() {\n                dataUser.remove( this, key );\n            } );\n        }\n    } );\n\n\n    jQuery.extend( {\n        queue: function( elem, type, data ) {\n            var queue;\n\n            if ( elem ) {\n                type = ( type || \"fx\" ) + \"queue\";\n                queue = dataPriv.get( elem, type );\n\n                // Speed up dequeue by getting out quickly if this is just a lookup\n                if ( data ) {\n                    if ( !queue || Array.isArray( data ) ) {\n                        queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n                    } else {\n                        queue.push( data );\n                    }\n                }\n                return queue || [];\n            }\n        },\n\n        dequeue: function( elem, type ) {\n            type = type || \"fx\";\n\n            var queue = jQuery.queue( elem, type ),\n                startLength = queue.length,\n                fn = queue.shift(),\n                hooks = jQuery._queueHooks( elem, type ),\n                next = function() {\n                    jQuery.dequeue( elem, type );\n                };\n\n            // If the fx queue is dequeued, always remove the progress sentinel\n            if ( fn === \"inprogress\" ) {\n                fn = queue.shift();\n                startLength--;\n            }\n\n            if ( fn ) {\n\n                // Add a progress sentinel to prevent the fx queue from being\n                // automatically dequeued\n                if ( type === \"fx\" ) {\n                    queue.unshift( \"inprogress\" );\n                }\n\n                // Clear up the last queue stop function\n                delete hooks.stop;\n                fn.call( elem, next, hooks );\n            }\n\n            if ( !startLength && hooks ) {\n                hooks.empty.fire();\n            }\n        },\n\n        // Not public - generate a queueHooks object, or return the current one\n        _queueHooks: function( elem, type ) {\n            var key = type + \"queueHooks\";\n            return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n                    empty: jQuery.Callbacks( \"once memory\" ).add( function() {\n                        dataPriv.remove( elem, [ type + \"queue\", key ] );\n                    } )\n                } );\n        }\n    } );\n\n    jQuery.fn.extend( {\n        queue: function( type, data ) {\n            var setter = 2;\n\n            if ( typeof type !== \"string\" ) {\n                data = type;\n                type = \"fx\";\n                setter--;\n            }\n\n            if ( arguments.length < setter ) {\n                return jQuery.queue( this[ 0 ], type );\n            }\n\n            return data === undefined ?\n                this :\n                this.each( function() {\n                    var queue = jQuery.queue( this, type, data );\n\n                    // Ensure a hooks for this queue\n                    jQuery._queueHooks( this, type );\n\n                    if ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n                        jQuery.dequeue( this, type );\n                    }\n                } );\n        },\n        dequeue: function( type ) {\n            return this.each( function() {\n                jQuery.dequeue( this, type );\n            } );\n        },\n        clearQueue: function( type ) {\n            return this.queue( type || \"fx\", [] );\n        },\n\n        // Get a promise resolved when queues of a certain type\n        // are emptied (fx is the type by default)\n        promise: function( type, obj ) {\n            var tmp,\n                count = 1,\n                defer = jQuery.Deferred(),\n                elements = this,\n                i = this.length,\n                resolve = function() {\n                    if ( !( --count ) ) {\n                        defer.resolveWith( elements, [ elements ] );\n                    }\n                };\n\n            if ( typeof type !== \"string\" ) {\n                obj = type;\n                type = undefined;\n            }\n            type = type || \"fx\";\n\n            while ( i-- ) {\n                tmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n                if ( tmp && tmp.empty ) {\n                    count++;\n                    tmp.empty.add( resolve );\n                }\n            }\n            resolve();\n            return defer.promise( obj );\n        }\n    } );\n    var pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\n    var rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\n    var cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\n    var isHiddenWithinTree = function( elem, el ) {\n\n        // isHiddenWithinTree might be called from jQuery#filter function;\n        // in that case, element will be second argument\n        elem = el || elem;\n\n        // Inline style trumps all\n        return elem.style.display === \"none\" ||\n            elem.style.display === \"\" &&\n\n            // Otherwise, check computed style\n            // Support: Firefox <=43 - 45\n            // Disconnected elements can have computed display: none, so first confirm that elem is\n            // in the document.\n            jQuery.contains( elem.ownerDocument, elem ) &&\n\n            jQuery.css( elem, \"display\" ) === \"none\";\n    };\n\n    var swap = function( elem, options, callback, args ) {\n        var ret, name,\n            old = {};\n\n        // Remember the old values, and insert the new ones\n        for ( name in options ) {\n            old[ name ] = elem.style[ name ];\n            elem.style[ name ] = options[ name ];\n        }\n\n        ret = callback.apply( elem, args || [] );\n\n        // Revert the old values\n        for ( name in options ) {\n            elem.style[ name ] = old[ name ];\n        }\n\n        return ret;\n    };\n\n\n\n\n    function adjustCSS( elem, prop, valueParts, tween ) {\n        var adjusted, scale,\n            maxIterations = 20,\n            currentValue = tween ?\n                function() {\n                    return tween.cur();\n                } :\n                function() {\n                    return jQuery.css( elem, prop, \"\" );\n                },\n            initial = currentValue(),\n            unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n        // Starting value computation is required for potential unit mismatches\n            initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n                rcssNum.exec( jQuery.css( elem, prop ) );\n\n        if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n            // Support: Firefox <=54\n            // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n            initial = initial / 2;\n\n            // Trust units reported by jQuery.css\n            unit = unit || initialInUnit[ 3 ];\n\n            // Iteratively approximate from a nonzero starting point\n            initialInUnit = +initial || 1;\n\n            while ( maxIterations-- ) {\n\n                // Evaluate and update our best guess (doubling guesses that zero out).\n                // Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n                jQuery.style( elem, prop, initialInUnit + unit );\n                if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n                    maxIterations = 0;\n                }\n                initialInUnit = initialInUnit / scale;\n\n            }\n\n            initialInUnit = initialInUnit * 2;\n            jQuery.style( elem, prop, initialInUnit + unit );\n\n            // Make sure we update the tween properties later on\n            valueParts = valueParts || [];\n        }\n\n        if ( valueParts ) {\n            initialInUnit = +initialInUnit || +initial || 0;\n\n            // Apply relative offset (+=/-=) if specified\n            adjusted = valueParts[ 1 ] ?\n            initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n                +valueParts[ 2 ];\n            if ( tween ) {\n                tween.unit = unit;\n                tween.start = initialInUnit;\n                tween.end = adjusted;\n            }\n        }\n        return adjusted;\n    }\n\n\n    var defaultDisplayMap = {};\n\n    function getDefaultDisplay( elem ) {\n        var temp,\n            doc = elem.ownerDocument,\n            nodeName = elem.nodeName,\n            display = defaultDisplayMap[ nodeName ];\n\n        if ( display ) {\n            return display;\n        }\n\n        temp = doc.body.appendChild( doc.createElement( nodeName ) );\n        display = jQuery.css( temp, \"display\" );\n\n        temp.parentNode.removeChild( temp );\n\n        if ( display === \"none\" ) {\n            display = \"block\";\n        }\n        defaultDisplayMap[ nodeName ] = display;\n\n        return display;\n    }\n\n    function showHide( elements, show ) {\n        var display, elem,\n            values = [],\n            index = 0,\n            length = elements.length;\n\n        // Determine new display value for elements that need to change\n        for ( ; index < length; index++ ) {\n            elem = elements[ index ];\n            if ( !elem.style ) {\n                continue;\n            }\n\n            display = elem.style.display;\n            if ( show ) {\n\n                // Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n                // check is required in this first loop unless we have a nonempty display value (either\n                // inline or about-to-be-restored)\n                if ( display === \"none\" ) {\n                    values[ index ] = dataPriv.get( elem, \"display\" ) || null;\n                    if ( !values[ index ] ) {\n                        elem.style.display = \"\";\n                    }\n                }\n                if ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n                    values[ index ] = getDefaultDisplay( elem );\n                }\n            } else {\n                if ( display !== \"none\" ) {\n                    values[ index ] = \"none\";\n\n                    // Remember what we're overwriting\n                    dataPriv.set( elem, \"display\", display );\n                }\n            }\n        }\n\n        // Set the display of the elements in a second loop to avoid constant reflow\n        for ( index = 0; index < length; index++ ) {\n            if ( values[ index ] != null ) {\n                elements[ index ].style.display = values[ index ];\n            }\n        }\n\n        return elements;\n    }\n\n    jQuery.fn.extend( {\n        show: function() {\n            return showHide( this, true );\n        },\n        hide: function() {\n            return showHide( this );\n        },\n        toggle: function( state ) {\n            if ( typeof state === \"boolean\" ) {\n                return state ? this.show() : this.hide();\n            }\n\n            return this.each( function() {\n                if ( isHiddenWithinTree( this ) ) {\n                    jQuery( this ).show();\n                } else {\n                    jQuery( this ).hide();\n                }\n            } );\n        }\n    } );\n    var rcheckableType = ( /^(?:checkbox|radio)$/i );\n\n    var rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\n    var rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\n    var wrapMap = {\n\n        // Support: IE <=9 only\n        option: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n        // XHTML parsers do not magically insert elements in the\n        // same way that tag soup parsers do. So we cannot shorten\n        // this by omitting <tbody> or other required elements.\n        thead: [ 1, \"<table>\", \"</table>\" ],\n        col: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n        tr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n        td: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n        _default: [ 0, \"\", \"\" ]\n    };\n\n// Support: IE <=9 only\n    wrapMap.optgroup = wrapMap.option;\n\n    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n    wrapMap.th = wrapMap.td;\n\n\n    function getAll( context, tag ) {\n\n        // Support: IE <=9 - 11 only\n        // Use typeof to avoid zero-argument method invocation on host objects (#15151)\n        var ret;\n\n        if ( typeof context.getElementsByTagName !== \"undefined\" ) {\n            ret = context.getElementsByTagName( tag || \"*\" );\n\n        } else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n            ret = context.querySelectorAll( tag || \"*\" );\n\n        } else {\n            ret = [];\n        }\n\n        if ( tag === undefined || tag && nodeName( context, tag ) ) {\n            return jQuery.merge( [ context ], ret );\n        }\n\n        return ret;\n    }\n\n\n// Mark scripts as having already been evaluated\n    function setGlobalEval( elems, refElements ) {\n        var i = 0,\n            l = elems.length;\n\n        for ( ; i < l; i++ ) {\n            dataPriv.set(\n                elems[ i ],\n                \"globalEval\",\n                !refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n            );\n        }\n    }\n\n\n    var rhtml = /<|&#?\\w+;/;\n\n    function buildFragment( elems, context, scripts, selection, ignored ) {\n        var elem, tmp, tag, wrap, contains, j,\n            fragment = context.createDocumentFragment(),\n            nodes = [],\n            i = 0,\n            l = elems.length;\n\n        for ( ; i < l; i++ ) {\n            elem = elems[ i ];\n\n            if ( elem || elem === 0 ) {\n\n                // Add nodes directly\n                if ( toType( elem ) === \"object\" ) {\n\n                    // Support: Android <=4.0 only, PhantomJS 1 only\n                    // push.apply(_, arraylike) throws on ancient WebKit\n                    jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n                    // Convert non-html into a text node\n                } else if ( !rhtml.test( elem ) ) {\n                    nodes.push( context.createTextNode( elem ) );\n\n                    // Convert html into DOM nodes\n                } else {\n                    tmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n                    // Deserialize a standard representation\n                    tag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n                    wrap = wrapMap[ tag ] || wrapMap._default;\n                    tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n                    // Descend through wrappers to the right content\n                    j = wrap[ 0 ];\n                    while ( j-- ) {\n                        tmp = tmp.lastChild;\n                    }\n\n                    // Support: Android <=4.0 only, PhantomJS 1 only\n                    // push.apply(_, arraylike) throws on ancient WebKit\n                    jQuery.merge( nodes, tmp.childNodes );\n\n                    // Remember the top-level container\n                    tmp = fragment.firstChild;\n\n                    // Ensure the created nodes are orphaned (#12392)\n                    tmp.textContent = \"\";\n                }\n            }\n        }\n\n        // Remove wrapper from fragment\n        fragment.textContent = \"\";\n\n        i = 0;\n        while ( ( elem = nodes[ i++ ] ) ) {\n\n            // Skip elements already in the context collection (trac-4087)\n            if ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n                if ( ignored ) {\n                    ignored.push( elem );\n                }\n                continue;\n            }\n\n            contains = jQuery.contains( elem.ownerDocument, elem );\n\n            // Append to fragment\n            tmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n            // Preserve script evaluation history\n            if ( contains ) {\n                setGlobalEval( tmp );\n            }\n\n            // Capture executables\n            if ( scripts ) {\n                j = 0;\n                while ( ( elem = tmp[ j++ ] ) ) {\n                    if ( rscriptType.test( elem.type || \"\" ) ) {\n                        scripts.push( elem );\n                    }\n                }\n            }\n        }\n\n        return fragment;\n    }\n\n\n    ( function() {\n        var fragment = document.createDocumentFragment(),\n            div = fragment.appendChild( document.createElement( \"div\" ) ),\n            input = document.createElement( \"input\" );\n\n        // Support: Android 4.0 - 4.3 only\n        // Check state lost if the name is set (#11217)\n        // Support: Windows Web Apps (WWA)\n        // `name` and `type` must use .setAttribute for WWA (#14901)\n        input.setAttribute( \"type\", \"radio\" );\n        input.setAttribute( \"checked\", \"checked\" );\n        input.setAttribute( \"name\", \"t\" );\n\n        div.appendChild( input );\n\n        // Support: Android <=4.1 only\n        // Older WebKit doesn't clone checked state correctly in fragments\n        support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n        // Support: IE <=11 only\n        // Make sure textarea (and checkbox) defaultValue is properly cloned\n        div.innerHTML = \"<textarea>x</textarea>\";\n        support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n    } )();\n    var documentElement = document.documentElement;\n\n\n\n    var\n        rkeyEvent = /^key/,\n        rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n        rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\n    function returnTrue() {\n        return true;\n    }\n\n    function returnFalse() {\n        return false;\n    }\n\n// Support: IE <=9 only\n// See #13393 for more info\n    function safeActiveElement() {\n        try {\n            return document.activeElement;\n        } catch ( err ) { }\n    }\n\n    function on( elem, types, selector, data, fn, one ) {\n        var origFn, type;\n\n        // Types can be a map of types/handlers\n        if ( typeof types === \"object\" ) {\n\n            // ( types-Object, selector, data )\n            if ( typeof selector !== \"string\" ) {\n\n                // ( types-Object, data )\n                data = data || selector;\n                selector = undefined;\n            }\n            for ( type in types ) {\n                on( elem, type, selector, data, types[ type ], one );\n            }\n            return elem;\n        }\n\n        if ( data == null && fn == null ) {\n\n            // ( types, fn )\n            fn = selector;\n            data = selector = undefined;\n        } else if ( fn == null ) {\n            if ( typeof selector === \"string\" ) {\n\n                // ( types, selector, fn )\n                fn = data;\n                data = undefined;\n            } else {\n\n                // ( types, data, fn )\n                fn = data;\n                data = selector;\n                selector = undefined;\n            }\n        }\n        if ( fn === false ) {\n            fn = returnFalse;\n        } else if ( !fn ) {\n            return elem;\n        }\n\n        if ( one === 1 ) {\n            origFn = fn;\n            fn = function( event ) {\n\n                // Can use an empty set, since event contains the info\n                jQuery().off( event );\n                return origFn.apply( this, arguments );\n            };\n\n            // Use same guid so caller can remove using origFn\n            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n        }\n        return elem.each( function() {\n            jQuery.event.add( this, types, fn, data, selector );\n        } );\n    }\n\n    /*\n     * Helper functions for managing events -- not part of the public interface.\n     * Props to Dean Edwards' addEvent library for many of the ideas.\n     */\n    jQuery.event = {\n\n        global: {},\n\n        add: function( elem, types, handler, data, selector ) {\n\n            var handleObjIn, eventHandle, tmp,\n                events, t, handleObj,\n                special, handlers, type, namespaces, origType,\n                elemData = dataPriv.get( elem );\n\n            // Don't attach events to noData or text/comment nodes (but allow plain objects)\n            if ( !elemData ) {\n                return;\n            }\n\n            // Caller can pass in an object of custom data in lieu of the handler\n            if ( handler.handler ) {\n                handleObjIn = handler;\n                handler = handleObjIn.handler;\n                selector = handleObjIn.selector;\n            }\n\n            // Ensure that invalid selectors throw exceptions at attach time\n            // Evaluate against documentElement in case elem is a non-element node (e.g., document)\n            if ( selector ) {\n                jQuery.find.matchesSelector( documentElement, selector );\n            }\n\n            // Make sure that the handler has a unique ID, used to find/remove it later\n            if ( !handler.guid ) {\n                handler.guid = jQuery.guid++;\n            }\n\n            // Init the element's event structure and main handler, if this is the first\n            if ( !( events = elemData.events ) ) {\n                events = elemData.events = {};\n            }\n            if ( !( eventHandle = elemData.handle ) ) {\n                eventHandle = elemData.handle = function( e ) {\n\n                    // Discard the second event of a jQuery.event.trigger() and\n                    // when an event is called after a pages has unloaded\n                    return typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n                        jQuery.event.dispatch.apply( elem, arguments ) : undefined;\n                };\n            }\n\n            // Handle multiple events separated by a space\n            types = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n            t = types.length;\n            while ( t-- ) {\n                tmp = rtypenamespace.exec( types[ t ] ) || [];\n                type = origType = tmp[ 1 ];\n                namespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n                // There *must* be a type, no attaching namespace-only handlers\n                if ( !type ) {\n                    continue;\n                }\n\n                // If event changes its type, use the special event handlers for the changed type\n                special = jQuery.event.special[ type ] || {};\n\n                // If selector defined, determine special event api type, otherwise given type\n                type = ( selector ? special.delegateType : special.bindType ) || type;\n\n                // Update special based on newly reset type\n                special = jQuery.event.special[ type ] || {};\n\n                // handleObj is passed to all event handlers\n                handleObj = jQuery.extend( {\n                    type: type,\n                    origType: origType,\n                    data: data,\n                    handler: handler,\n                    guid: handler.guid,\n                    selector: selector,\n                    needsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n                    namespace: namespaces.join( \".\" )\n                }, handleObjIn );\n\n                // Init the event handler queue if we're the first\n                if ( !( handlers = events[ type ] ) ) {\n                    handlers = events[ type ] = [];\n                    handlers.delegateCount = 0;\n\n                    // Only use addEventListener if the special events handler returns false\n                    if ( !special.setup ||\n                        special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n                        if ( elem.addEventListener ) {\n                            elem.addEventListener( type, eventHandle );\n                        }\n                    }\n                }\n\n                if ( special.add ) {\n                    special.add.call( elem, handleObj );\n\n                    if ( !handleObj.handler.guid ) {\n                        handleObj.handler.guid = handler.guid;\n                    }\n                }\n\n                // Add to the element's handler list, delegates in front\n                if ( selector ) {\n                    handlers.splice( handlers.delegateCount++, 0, handleObj );\n                } else {\n                    handlers.push( handleObj );\n                }\n\n                // Keep track of which events have ever been used, for event optimization\n                jQuery.event.global[ type ] = true;\n            }\n\n        },\n\n        // Detach an event or set of events from an element\n        remove: function( elem, types, handler, selector, mappedTypes ) {\n\n            var j, origCount, tmp,\n                events, t, handleObj,\n                special, handlers, type, namespaces, origType,\n                elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n            if ( !elemData || !( events = elemData.events ) ) {\n                return;\n            }\n\n            // Once for each type.namespace in types; type may be omitted\n            types = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n            t = types.length;\n            while ( t-- ) {\n                tmp = rtypenamespace.exec( types[ t ] ) || [];\n                type = origType = tmp[ 1 ];\n                namespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n                // Unbind all events (on this namespace, if provided) for the element\n                if ( !type ) {\n                    for ( type in events ) {\n                        jQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n                    }\n                    continue;\n                }\n\n                special = jQuery.event.special[ type ] || {};\n                type = ( selector ? special.delegateType : special.bindType ) || type;\n                handlers = events[ type ] || [];\n                tmp = tmp[ 2 ] &&\n                    new RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n                // Remove matching events\n                origCount = j = handlers.length;\n                while ( j-- ) {\n                    handleObj = handlers[ j ];\n\n                    if ( ( mappedTypes || origType === handleObj.origType ) &&\n                        ( !handler || handler.guid === handleObj.guid ) &&\n                        ( !tmp || tmp.test( handleObj.namespace ) ) &&\n                        ( !selector || selector === handleObj.selector ||\n                        selector === \"**\" && handleObj.selector ) ) {\n                        handlers.splice( j, 1 );\n\n                        if ( handleObj.selector ) {\n                            handlers.delegateCount--;\n                        }\n                        if ( special.remove ) {\n                            special.remove.call( elem, handleObj );\n                        }\n                    }\n                }\n\n                // Remove generic event handler if we removed something and no more handlers exist\n                // (avoids potential for endless recursion during removal of special event handlers)\n                if ( origCount && !handlers.length ) {\n                    if ( !special.teardown ||\n                        special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n                        jQuery.removeEvent( elem, type, elemData.handle );\n                    }\n\n                    delete events[ type ];\n                }\n            }\n\n            // Remove data and the expando if it's no longer used\n            if ( jQuery.isEmptyObject( events ) ) {\n                dataPriv.remove( elem, \"handle events\" );\n            }\n        },\n\n        dispatch: function( nativeEvent ) {\n\n            // Make a writable jQuery.Event from the native event object\n            var event = jQuery.event.fix( nativeEvent );\n\n            var i, j, ret, matched, handleObj, handlerQueue,\n                args = new Array( arguments.length ),\n                handlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n                special = jQuery.event.special[ event.type ] || {};\n\n            // Use the fix-ed jQuery.Event rather than the (read-only) native event\n            args[ 0 ] = event;\n\n            for ( i = 1; i < arguments.length; i++ ) {\n                args[ i ] = arguments[ i ];\n            }\n\n            event.delegateTarget = this;\n\n            // Call the preDispatch hook for the mapped type, and let it bail if desired\n            if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n                return;\n            }\n\n            // Determine handlers\n            handlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n            // Run delegates first; they may want to stop propagation beneath us\n            i = 0;\n            while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n                event.currentTarget = matched.elem;\n\n                j = 0;\n                while ( ( handleObj = matched.handlers[ j++ ] ) &&\n                !event.isImmediatePropagationStopped() ) {\n\n                    // Triggered event must either 1) have no namespace, or 2) have namespace(s)\n                    // a subset or equal to those in the bound event (both can have no namespace).\n                    if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n                        event.handleObj = handleObj;\n                        event.data = handleObj.data;\n\n                        ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n                        handleObj.handler ).apply( matched.elem, args );\n\n                        if ( ret !== undefined ) {\n                            if ( ( event.result = ret ) === false ) {\n                                event.preventDefault();\n                                event.stopPropagation();\n                            }\n                        }\n                    }\n                }\n            }\n\n            // Call the postDispatch hook for the mapped type\n            if ( special.postDispatch ) {\n                special.postDispatch.call( this, event );\n            }\n\n            return event.result;\n        },\n\n        handlers: function( event, handlers ) {\n            var i, handleObj, sel, matchedHandlers, matchedSelectors,\n                handlerQueue = [],\n                delegateCount = handlers.delegateCount,\n                cur = event.target;\n\n            // Find delegate handlers\n            if ( delegateCount &&\n\n                // Support: IE <=9\n                // Black-hole SVG <use> instance trees (trac-13180)\n                cur.nodeType &&\n\n                // Support: Firefox <=42\n                // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n                // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n                // Support: IE 11 only\n                // ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n                !( event.type === \"click\" && event.button >= 1 ) ) {\n\n                for ( ; cur !== this; cur = cur.parentNode || this ) {\n\n                    // Don't check non-elements (#13208)\n                    // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n                    if ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n                        matchedHandlers = [];\n                        matchedSelectors = {};\n                        for ( i = 0; i < delegateCount; i++ ) {\n                            handleObj = handlers[ i ];\n\n                            // Don't conflict with Object.prototype properties (#13203)\n                            sel = handleObj.selector + \" \";\n\n                            if ( matchedSelectors[ sel ] === undefined ) {\n                                matchedSelectors[ sel ] = handleObj.needsContext ?\n                                jQuery( sel, this ).index( cur ) > -1 :\n                                    jQuery.find( sel, this, null, [ cur ] ).length;\n                            }\n                            if ( matchedSelectors[ sel ] ) {\n                                matchedHandlers.push( handleObj );\n                            }\n                        }\n                        if ( matchedHandlers.length ) {\n                            handlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n                        }\n                    }\n                }\n            }\n\n            // Add the remaining (directly-bound) handlers\n            cur = this;\n            if ( delegateCount < handlers.length ) {\n                handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n            }\n\n            return handlerQueue;\n        },\n\n        addProp: function( name, hook ) {\n            Object.defineProperty( jQuery.Event.prototype, name, {\n                enumerable: true,\n                configurable: true,\n\n                get: isFunction( hook ) ?\n                    function() {\n                        if ( this.originalEvent ) {\n                            return hook( this.originalEvent );\n                        }\n                    } :\n                    function() {\n                        if ( this.originalEvent ) {\n                            return this.originalEvent[ name ];\n                        }\n                    },\n\n                set: function( value ) {\n                    Object.defineProperty( this, name, {\n                        enumerable: true,\n                        configurable: true,\n                        writable: true,\n                        value: value\n                    } );\n                }\n            } );\n        },\n\n        fix: function( originalEvent ) {\n            return originalEvent[ jQuery.expando ] ?\n                originalEvent :\n                new jQuery.Event( originalEvent );\n        },\n\n        special: {\n            load: {\n\n                // Prevent triggered image.load events from bubbling to window.load\n                noBubble: true\n            },\n            focus: {\n\n                // Fire native event if possible so blur/focus sequence is correct\n                trigger: function() {\n                    if ( this !== safeActiveElement() && this.focus ) {\n                        this.focus();\n                        return false;\n                    }\n                },\n                delegateType: \"focusin\"\n            },\n            blur: {\n                trigger: function() {\n                    if ( this === safeActiveElement() && this.blur ) {\n                        this.blur();\n                        return false;\n                    }\n                },\n                delegateType: \"focusout\"\n            },\n            click: {\n\n                // For checkbox, fire native event so checked state will be right\n                trigger: function() {\n                    if ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n                        this.click();\n                        return false;\n                    }\n                },\n\n                // For cross-browser consistency, don't fire native .click() on links\n                _default: function( event ) {\n                    return nodeName( event.target, \"a\" );\n                }\n            },\n\n            beforeunload: {\n                postDispatch: function( event ) {\n\n                    // Support: Firefox 20+\n                    // Firefox doesn't alert if the returnValue field is not set.\n                    if ( event.result !== undefined && event.originalEvent ) {\n                        event.originalEvent.returnValue = event.result;\n                    }\n                }\n            }\n        }\n    };\n\n    jQuery.removeEvent = function( elem, type, handle ) {\n\n        // This \"if\" is needed for plain objects\n        if ( elem.removeEventListener ) {\n            elem.removeEventListener( type, handle );\n        }\n    };\n\n    jQuery.Event = function( src, props ) {\n\n        // Allow instantiation without the 'new' keyword\n        if ( !( this instanceof jQuery.Event ) ) {\n            return new jQuery.Event( src, props );\n        }\n\n        // Event object\n        if ( src && src.type ) {\n            this.originalEvent = src;\n            this.type = src.type;\n\n            // Events bubbling up the document may have been marked as prevented\n            // by a handler lower down the tree; reflect the correct value.\n            this.isDefaultPrevented = src.defaultPrevented ||\n            src.defaultPrevented === undefined &&\n\n            // Support: Android <=2.3 only\n            src.returnValue === false ?\n                returnTrue :\n                returnFalse;\n\n            // Create target properties\n            // Support: Safari <=6 - 7 only\n            // Target should not be a text node (#504, #13143)\n            this.target = ( src.target && src.target.nodeType === 3 ) ?\n                src.target.parentNode :\n                src.target;\n\n            this.currentTarget = src.currentTarget;\n            this.relatedTarget = src.relatedTarget;\n\n            // Event type\n        } else {\n            this.type = src;\n        }\n\n        // Put explicitly provided properties onto the event object\n        if ( props ) {\n            jQuery.extend( this, props );\n        }\n\n        // Create a timestamp if incoming event doesn't have one\n        this.timeStamp = src && src.timeStamp || Date.now();\n\n        // Mark it as fixed\n        this[ jQuery.expando ] = true;\n    };\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n    jQuery.Event.prototype = {\n        constructor: jQuery.Event,\n        isDefaultPrevented: returnFalse,\n        isPropagationStopped: returnFalse,\n        isImmediatePropagationStopped: returnFalse,\n        isSimulated: false,\n\n        preventDefault: function() {\n            var e = this.originalEvent;\n\n            this.isDefaultPrevented = returnTrue;\n\n            if ( e && !this.isSimulated ) {\n                e.preventDefault();\n            }\n        },\n        stopPropagation: function() {\n            var e = this.originalEvent;\n\n            this.isPropagationStopped = returnTrue;\n\n            if ( e && !this.isSimulated ) {\n                e.stopPropagation();\n            }\n        },\n        stopImmediatePropagation: function() {\n            var e = this.originalEvent;\n\n            this.isImmediatePropagationStopped = returnTrue;\n\n            if ( e && !this.isSimulated ) {\n                e.stopImmediatePropagation();\n            }\n\n            this.stopPropagation();\n        }\n    };\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\n    jQuery.each( {\n        altKey: true,\n        bubbles: true,\n        cancelable: true,\n        changedTouches: true,\n        ctrlKey: true,\n        detail: true,\n        eventPhase: true,\n        metaKey: true,\n        pageX: true,\n        pageY: true,\n        shiftKey: true,\n        view: true,\n        \"char\": true,\n        charCode: true,\n        key: true,\n        keyCode: true,\n        button: true,\n        buttons: true,\n        clientX: true,\n        clientY: true,\n        offsetX: true,\n        offsetY: true,\n        pointerId: true,\n        pointerType: true,\n        screenX: true,\n        screenY: true,\n        targetTouches: true,\n        toElement: true,\n        touches: true,\n\n        which: function( event ) {\n            var button = event.button;\n\n            // Add which for key events\n            if ( event.which == null && rkeyEvent.test( event.type ) ) {\n                return event.charCode != null ? event.charCode : event.keyCode;\n            }\n\n            // Add which for click: 1 === left; 2 === middle; 3 === right\n            if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n                if ( button & 1 ) {\n                    return 1;\n                }\n\n                if ( button & 2 ) {\n                    return 3;\n                }\n\n                if ( button & 4 ) {\n                    return 2;\n                }\n\n                return 0;\n            }\n\n            return event.which;\n        }\n    }, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\n    jQuery.each( {\n        mouseenter: \"mouseover\",\n        mouseleave: \"mouseout\",\n        pointerenter: \"pointerover\",\n        pointerleave: \"pointerout\"\n    }, function( orig, fix ) {\n        jQuery.event.special[ orig ] = {\n            delegateType: fix,\n            bindType: fix,\n\n            handle: function( event ) {\n                var ret,\n                    target = this,\n                    related = event.relatedTarget,\n                    handleObj = event.handleObj;\n\n                // For mouseenter/leave call the handler if related is outside the target.\n                // NB: No relatedTarget if the mouse left/entered the browser window\n                if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n                    event.type = handleObj.origType;\n                    ret = handleObj.handler.apply( this, arguments );\n                    event.type = fix;\n                }\n                return ret;\n            }\n        };\n    } );\n\n    jQuery.fn.extend( {\n\n        on: function( types, selector, data, fn ) {\n            return on( this, types, selector, data, fn );\n        },\n        one: function( types, selector, data, fn ) {\n            return on( this, types, selector, data, fn, 1 );\n        },\n        off: function( types, selector, fn ) {\n            var handleObj, type;\n            if ( types && types.preventDefault && types.handleObj ) {\n\n                // ( event )  dispatched jQuery.Event\n                handleObj = types.handleObj;\n                jQuery( types.delegateTarget ).off(\n                    handleObj.namespace ?\n                    handleObj.origType + \".\" + handleObj.namespace :\n                        handleObj.origType,\n                    handleObj.selector,\n                    handleObj.handler\n                );\n                return this;\n            }\n            if ( typeof types === \"object\" ) {\n\n                // ( types-object [, selector] )\n                for ( type in types ) {\n                    this.off( type, selector, types[ type ] );\n                }\n                return this;\n            }\n            if ( selector === false || typeof selector === \"function\" ) {\n\n                // ( types [, fn] )\n                fn = selector;\n                selector = undefined;\n            }\n            if ( fn === false ) {\n                fn = returnFalse;\n            }\n            return this.each( function() {\n                jQuery.event.remove( this, types, fn, selector );\n            } );\n        }\n    } );\n\n\n    var\n\n    /* eslint-disable max-len */\n\n    // See https://github.com/eslint/eslint/issues/3229\n        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n    /* eslint-enable */\n\n    // Support: IE <=10 - 11, Edge 12 - 13 only\n    // In IE/Edge using regex groups here causes severe slowdowns.\n    // See https://connect.microsoft.com/IE/feedback/details/1736512/\n        rnoInnerhtml = /<script|<style|<link/i,\n\n    // checked=\"checked\" or checked\n        rchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n        rcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\n    function manipulationTarget( elem, content ) {\n        if ( nodeName( elem, \"table\" ) &&\n            nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n            return jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n        }\n\n        return elem;\n    }\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\n    function disableScript( elem ) {\n        elem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n        return elem;\n    }\n    function restoreScript( elem ) {\n        if ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n            elem.type = elem.type.slice( 5 );\n        } else {\n            elem.removeAttribute( \"type\" );\n        }\n\n        return elem;\n    }\n\n    function cloneCopyEvent( src, dest ) {\n        var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n        if ( dest.nodeType !== 1 ) {\n            return;\n        }\n\n        // 1. Copy private data: events, handlers, etc.\n        if ( dataPriv.hasData( src ) ) {\n            pdataOld = dataPriv.access( src );\n            pdataCur = dataPriv.set( dest, pdataOld );\n            events = pdataOld.events;\n\n            if ( events ) {\n                delete pdataCur.handle;\n                pdataCur.events = {};\n\n                for ( type in events ) {\n                    for ( i = 0, l = events[ type ].length; i < l; i++ ) {\n                        jQuery.event.add( dest, type, events[ type ][ i ] );\n                    }\n                }\n            }\n        }\n\n        // 2. Copy user data\n        if ( dataUser.hasData( src ) ) {\n            udataOld = dataUser.access( src );\n            udataCur = jQuery.extend( {}, udataOld );\n\n            dataUser.set( dest, udataCur );\n        }\n    }\n\n// Fix IE bugs, see support tests\n    function fixInput( src, dest ) {\n        var nodeName = dest.nodeName.toLowerCase();\n\n        // Fails to persist the checked state of a cloned checkbox or radio button.\n        if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n            dest.checked = src.checked;\n\n            // Fails to return the selected option to the default selected state when cloning options\n        } else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n            dest.defaultValue = src.defaultValue;\n        }\n    }\n\n    function domManip( collection, args, callback, ignored ) {\n\n        // Flatten any nested arrays\n        args = concat.apply( [], args );\n\n        var fragment, first, scripts, hasScripts, node, doc,\n            i = 0,\n            l = collection.length,\n            iNoClone = l - 1,\n            value = args[ 0 ],\n            valueIsFunction = isFunction( value );\n\n        // We can't cloneNode fragments that contain checked, in WebKit\n        if ( valueIsFunction ||\n            ( l > 1 && typeof value === \"string\" &&\n            !support.checkClone && rchecked.test( value ) ) ) {\n            return collection.each( function( index ) {\n                var self = collection.eq( index );\n                if ( valueIsFunction ) {\n                    args[ 0 ] = value.call( this, index, self.html() );\n                }\n                domManip( self, args, callback, ignored );\n            } );\n        }\n\n        if ( l ) {\n            fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n            first = fragment.firstChild;\n\n            if ( fragment.childNodes.length === 1 ) {\n                fragment = first;\n            }\n\n            // Require either new content or an interest in ignored elements to invoke the callback\n            if ( first || ignored ) {\n                scripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n                hasScripts = scripts.length;\n\n                // Use the original fragment for the last item\n                // instead of the first because it can end up\n                // being emptied incorrectly in certain situations (#8070).\n                for ( ; i < l; i++ ) {\n                    node = fragment;\n\n                    if ( i !== iNoClone ) {\n                        node = jQuery.clone( node, true, true );\n\n                        // Keep references to cloned scripts for later restoration\n                        if ( hasScripts ) {\n\n                            // Support: Android <=4.0 only, PhantomJS 1 only\n                            // push.apply(_, arraylike) throws on ancient WebKit\n                            jQuery.merge( scripts, getAll( node, \"script\" ) );\n                        }\n                    }\n\n                    callback.call( collection[ i ], node, i );\n                }\n\n                if ( hasScripts ) {\n                    doc = scripts[ scripts.length - 1 ].ownerDocument;\n\n                    // Reenable scripts\n                    jQuery.map( scripts, restoreScript );\n\n                    // Evaluate executable scripts on first document insertion\n                    for ( i = 0; i < hasScripts; i++ ) {\n                        node = scripts[ i ];\n                        if ( rscriptType.test( node.type || \"\" ) &&\n                            !dataPriv.access( node, \"globalEval\" ) &&\n                            jQuery.contains( doc, node ) ) {\n\n                            if ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n                                // Optional AJAX dependency, but won't run scripts if not present\n                                if ( jQuery._evalUrl ) {\n                                    jQuery._evalUrl( node.src );\n                                }\n                            } else {\n                                DOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        return collection;\n    }\n\n    function remove( elem, selector, keepData ) {\n        var node,\n            nodes = selector ? jQuery.filter( selector, elem ) : elem,\n            i = 0;\n\n        for ( ; ( node = nodes[ i ] ) != null; i++ ) {\n            if ( !keepData && node.nodeType === 1 ) {\n                jQuery.cleanData( getAll( node ) );\n            }\n\n            if ( node.parentNode ) {\n                if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n                    setGlobalEval( getAll( node, \"script\" ) );\n                }\n                node.parentNode.removeChild( node );\n            }\n        }\n\n        return elem;\n    }\n\n    jQuery.extend( {\n        htmlPrefilter: function( html ) {\n            return html.replace( rxhtmlTag, \"<$1></$2>\" );\n        },\n\n        clone: function( elem, dataAndEvents, deepDataAndEvents ) {\n            var i, l, srcElements, destElements,\n                clone = elem.cloneNode( true ),\n                inPage = jQuery.contains( elem.ownerDocument, elem );\n\n            // Fix IE cloning issues\n            if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n                !jQuery.isXMLDoc( elem ) ) {\n\n                // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n                destElements = getAll( clone );\n                srcElements = getAll( elem );\n\n                for ( i = 0, l = srcElements.length; i < l; i++ ) {\n                    fixInput( srcElements[ i ], destElements[ i ] );\n                }\n            }\n\n            // Copy the events from the original to the clone\n            if ( dataAndEvents ) {\n                if ( deepDataAndEvents ) {\n                    srcElements = srcElements || getAll( elem );\n                    destElements = destElements || getAll( clone );\n\n                    for ( i = 0, l = srcElements.length; i < l; i++ ) {\n                        cloneCopyEvent( srcElements[ i ], destElements[ i ] );\n                    }\n                } else {\n                    cloneCopyEvent( elem, clone );\n                }\n            }\n\n            // Preserve script evaluation history\n            destElements = getAll( clone, \"script\" );\n            if ( destElements.length > 0 ) {\n                setGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n            }\n\n            // Return the cloned set\n            return clone;\n        },\n\n        cleanData: function( elems ) {\n            var data, elem, type,\n                special = jQuery.event.special,\n                i = 0;\n\n            for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n                if ( acceptData( elem ) ) {\n                    if ( ( data = elem[ dataPriv.expando ] ) ) {\n                        if ( data.events ) {\n                            for ( type in data.events ) {\n                                if ( special[ type ] ) {\n                                    jQuery.event.remove( elem, type );\n\n                                    // This is a shortcut to avoid jQuery.event.remove's overhead\n                                } else {\n                                    jQuery.removeEvent( elem, type, data.handle );\n                                }\n                            }\n                        }\n\n                        // Support: Chrome <=35 - 45+\n                        // Assign undefined instead of using delete, see Data#remove\n                        elem[ dataPriv.expando ] = undefined;\n                    }\n                    if ( elem[ dataUser.expando ] ) {\n\n                        // Support: Chrome <=35 - 45+\n                        // Assign undefined instead of using delete, see Data#remove\n                        elem[ dataUser.expando ] = undefined;\n                    }\n                }\n            }\n        }\n    } );\n\n    jQuery.fn.extend( {\n        detach: function( selector ) {\n            return remove( this, selector, true );\n        },\n\n        remove: function( selector ) {\n            return remove( this, selector );\n        },\n\n        text: function( value ) {\n            return access( this, function( value ) {\n                return value === undefined ?\n                    jQuery.text( this ) :\n                    this.empty().each( function() {\n                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n                            this.textContent = value;\n                        }\n                    } );\n            }, null, value, arguments.length );\n        },\n\n        append: function() {\n            return domManip( this, arguments, function( elem ) {\n                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n                    var target = manipulationTarget( this, elem );\n                    target.appendChild( elem );\n                }\n            } );\n        },\n\n        prepend: function() {\n            return domManip( this, arguments, function( elem ) {\n                if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n                    var target = manipulationTarget( this, elem );\n                    target.insertBefore( elem, target.firstChild );\n                }\n            } );\n        },\n\n        before: function() {\n            return domManip( this, arguments, function( elem ) {\n                if ( this.parentNode ) {\n                    this.parentNode.insertBefore( elem, this );\n                }\n            } );\n        },\n\n        after: function() {\n            return domManip( this, arguments, function( elem ) {\n                if ( this.parentNode ) {\n                    this.parentNode.insertBefore( elem, this.nextSibling );\n                }\n            } );\n        },\n\n        empty: function() {\n            var elem,\n                i = 0;\n\n            for ( ; ( elem = this[ i ] ) != null; i++ ) {\n                if ( elem.nodeType === 1 ) {\n\n                    // Prevent memory leaks\n                    jQuery.cleanData( getAll( elem, false ) );\n\n                    // Remove any remaining nodes\n                    elem.textContent = \"\";\n                }\n            }\n\n            return this;\n        },\n\n        clone: function( dataAndEvents, deepDataAndEvents ) {\n            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n            return this.map( function() {\n                return jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n            } );\n        },\n\n        html: function( value ) {\n            return access( this, function( value ) {\n                var elem = this[ 0 ] || {},\n                    i = 0,\n                    l = this.length;\n\n                if ( value === undefined && elem.nodeType === 1 ) {\n                    return elem.innerHTML;\n                }\n\n                // See if we can take a shortcut and just use innerHTML\n                if ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n                    !wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n                    value = jQuery.htmlPrefilter( value );\n\n                    try {\n                        for ( ; i < l; i++ ) {\n                            elem = this[ i ] || {};\n\n                            // Remove element nodes and prevent memory leaks\n                            if ( elem.nodeType === 1 ) {\n                                jQuery.cleanData( getAll( elem, false ) );\n                                elem.innerHTML = value;\n                            }\n                        }\n\n                        elem = 0;\n\n                        // If using innerHTML throws an exception, use the fallback method\n                    } catch ( e ) {}\n                }\n\n                if ( elem ) {\n                    this.empty().append( value );\n                }\n            }, null, value, arguments.length );\n        },\n\n        replaceWith: function() {\n            var ignored = [];\n\n            // Make the changes, replacing each non-ignored context element with the new content\n            return domManip( this, arguments, function( elem ) {\n                var parent = this.parentNode;\n\n                if ( jQuery.inArray( this, ignored ) < 0 ) {\n                    jQuery.cleanData( getAll( this ) );\n                    if ( parent ) {\n                        parent.replaceChild( elem, this );\n                    }\n                }\n\n                // Force callback invocation\n            }, ignored );\n        }\n    } );\n\n    jQuery.each( {\n        appendTo: \"append\",\n        prependTo: \"prepend\",\n        insertBefore: \"before\",\n        insertAfter: \"after\",\n        replaceAll: \"replaceWith\"\n    }, function( name, original ) {\n        jQuery.fn[ name ] = function( selector ) {\n            var elems,\n                ret = [],\n                insert = jQuery( selector ),\n                last = insert.length - 1,\n                i = 0;\n\n            for ( ; i <= last; i++ ) {\n                elems = i === last ? this : this.clone( true );\n                jQuery( insert[ i ] )[ original ]( elems );\n\n                // Support: Android <=4.0 only, PhantomJS 1 only\n                // .get() because push.apply(_, arraylike) throws on ancient WebKit\n                push.apply( ret, elems.get() );\n            }\n\n            return this.pushStack( ret );\n        };\n    } );\n    var rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\n    var getStyles = function( elem ) {\n\n        // Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n        // IE throws on elements created in popups\n        // FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n        var view = elem.ownerDocument.defaultView;\n\n        if ( !view || !view.opener ) {\n            view = window;\n        }\n\n        return view.getComputedStyle( elem );\n    };\n\n    var rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n    ( function() {\n\n        // Executing both pixelPosition & boxSizingReliable tests require only one layout\n        // so they're executed at the same time to save the second computation.\n        function computeStyleTests() {\n\n            // This is a singleton, we need to execute it only once\n            if ( !div ) {\n                return;\n            }\n\n            container.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n                \"margin-top:1px;padding:0;border:0\";\n            div.style.cssText =\n                \"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n                \"margin:auto;border:1px;padding:1px;\" +\n                \"width:60%;top:1%\";\n            documentElement.appendChild( container ).appendChild( div );\n\n            var divStyle = window.getComputedStyle( div );\n            pixelPositionVal = divStyle.top !== \"1%\";\n\n            // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n            reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n            // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n            // Some styles come back with percentage values, even though they shouldn't\n            div.style.right = \"60%\";\n            pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n            // Support: IE 9 - 11 only\n            // Detect misreporting of content dimensions for box-sizing:border-box elements\n            boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n            // Support: IE 9 only\n            // Detect overflow:scroll screwiness (gh-3699)\n            div.style.position = \"absolute\";\n            scrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n            documentElement.removeChild( container );\n\n            // Nullify the div so it wouldn't be stored in the memory and\n            // it will also be a sign that checks already performed\n            div = null;\n        }\n\n        function roundPixelMeasures( measure ) {\n            return Math.round( parseFloat( measure ) );\n        }\n\n        var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n            reliableMarginLeftVal,\n            container = document.createElement( \"div\" ),\n            div = document.createElement( \"div\" );\n\n        // Finish early in limited (non-browser) environments\n        if ( !div.style ) {\n            return;\n        }\n\n        // Support: IE <=9 - 11 only\n        // Style of cloned element affects source element cloned (#8908)\n        div.style.backgroundClip = \"content-box\";\n        div.cloneNode( true ).style.backgroundClip = \"\";\n        support.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n        jQuery.extend( support, {\n            boxSizingReliable: function() {\n                computeStyleTests();\n                return boxSizingReliableVal;\n            },\n            pixelBoxStyles: function() {\n                computeStyleTests();\n                return pixelBoxStylesVal;\n            },\n            pixelPosition: function() {\n                computeStyleTests();\n                return pixelPositionVal;\n            },\n            reliableMarginLeft: function() {\n                computeStyleTests();\n                return reliableMarginLeftVal;\n            },\n            scrollboxSize: function() {\n                computeStyleTests();\n                return scrollboxSizeVal;\n            }\n        } );\n    } )();\n\n\n    function curCSS( elem, name, computed ) {\n        var width, minWidth, maxWidth, ret,\n\n        // Support: Firefox 51+\n        // Retrieving style before computed somehow\n        // fixes an issue with getting wrong values\n        // on detached elements\n            style = elem.style;\n\n        computed = computed || getStyles( elem );\n\n        // getPropertyValue is needed for:\n        //   .css('filter') (IE 9 only, #12537)\n        //   .css('--customProperty) (#3144)\n        if ( computed ) {\n            ret = computed.getPropertyValue( name ) || computed[ name ];\n\n            if ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n                ret = jQuery.style( elem, name );\n            }\n\n            // A tribute to the \"awesome hack by Dean Edwards\"\n            // Android Browser returns percentage for some values,\n            // but width seems to be reliably pixels.\n            // This is against the CSSOM draft spec:\n            // https://drafts.csswg.org/cssom/#resolved-values\n            if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n                // Remember the original values\n                width = style.width;\n                minWidth = style.minWidth;\n                maxWidth = style.maxWidth;\n\n                // Put in the new values to get a computed value out\n                style.minWidth = style.maxWidth = style.width = ret;\n                ret = computed.width;\n\n                // Revert the changed values\n                style.width = width;\n                style.minWidth = minWidth;\n                style.maxWidth = maxWidth;\n            }\n        }\n\n        return ret !== undefined ?\n\n            // Support: IE <=9 - 11 only\n            // IE returns zIndex value as an integer.\n        ret + \"\" :\n            ret;\n    }\n\n\n    function addGetHookIf( conditionFn, hookFn ) {\n\n        // Define the hook, we'll check on the first run if it's really needed.\n        return {\n            get: function() {\n                if ( conditionFn() ) {\n\n                    // Hook not needed (or it's not possible to use it due\n                    // to missing dependency), remove it.\n                    delete this.get;\n                    return;\n                }\n\n                // Hook needed; redefine it so that the support test is not executed again.\n                return ( this.get = hookFn ).apply( this, arguments );\n            }\n        };\n    }\n\n\n    var\n\n    // Swappable if display is none or starts with table\n    // except \"table\", \"table-cell\", or \"table-caption\"\n    // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n        rdisplayswap = /^(none|table(?!-c[ea]).+)/,\n        rcustomProp = /^--/,\n        cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n        cssNormalTransform = {\n            letterSpacing: \"0\",\n            fontWeight: \"400\"\n        },\n\n        cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n        emptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\n    function vendorPropName( name ) {\n\n        // Shortcut for names that are not vendor prefixed\n        if ( name in emptyStyle ) {\n            return name;\n        }\n\n        // Check for vendor prefixed names\n        var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n            i = cssPrefixes.length;\n\n        while ( i-- ) {\n            name = cssPrefixes[ i ] + capName;\n            if ( name in emptyStyle ) {\n                return name;\n            }\n        }\n    }\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\n    function finalPropName( name ) {\n        var ret = jQuery.cssProps[ name ];\n        if ( !ret ) {\n            ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n        }\n        return ret;\n    }\n\n    function setPositiveNumber( elem, value, subtract ) {\n\n        // Any relative (+/-) values have already been\n        // normalized at this point\n        var matches = rcssNum.exec( value );\n        return matches ?\n\n            // Guard against undefined \"subtract\", e.g., when used as in cssHooks\n        Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n            value;\n    }\n\n    function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n        var i = dimension === \"width\" ? 1 : 0,\n            extra = 0,\n            delta = 0;\n\n        // Adjustment may not be necessary\n        if ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n            return 0;\n        }\n\n        for ( ; i < 4; i += 2 ) {\n\n            // Both box models exclude margin\n            if ( box === \"margin\" ) {\n                delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n            }\n\n            // If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n            if ( !isBorderBox ) {\n\n                // Add padding\n                delta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n                // For \"border\" or \"margin\", add border\n                if ( box !== \"padding\" ) {\n                    delta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n                    // But still keep track of it otherwise\n                } else {\n                    extra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n                }\n\n                // If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n                // \"padding\" or \"margin\"\n            } else {\n\n                // For \"content\", subtract padding\n                if ( box === \"content\" ) {\n                    delta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n                }\n\n                // For \"content\" or \"padding\", subtract border\n                if ( box !== \"margin\" ) {\n                    delta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n                }\n            }\n        }\n\n        // Account for positive content-box scroll gutter when requested by providing computedVal\n        if ( !isBorderBox && computedVal >= 0 ) {\n\n            // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n            // Assuming integer scroll gutter, subtract the rest and round down\n            delta += Math.max( 0, Math.ceil(\n                elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n                computedVal -\n                delta -\n                extra -\n                0.5\n            ) );\n        }\n\n        return delta;\n    }\n\n    function getWidthOrHeight( elem, dimension, extra ) {\n\n        // Start with computed style\n        var styles = getStyles( elem ),\n            val = curCSS( elem, dimension, styles ),\n            isBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n            valueIsBorderBox = isBorderBox;\n\n        // Support: Firefox <=54\n        // Return a confounding non-pixel value or feign ignorance, as appropriate.\n        if ( rnumnonpx.test( val ) ) {\n            if ( !extra ) {\n                return val;\n            }\n            val = \"auto\";\n        }\n\n        // Check for style in case a browser which returns unreliable values\n        // for getComputedStyle silently falls back to the reliable elem.style\n        valueIsBorderBox = valueIsBorderBox &&\n            ( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n        // Fall back to offsetWidth/offsetHeight when value is \"auto\"\n        // This happens for inline elements with no explicit setting (gh-3571)\n        // Support: Android <=4.1 - 4.3 only\n        // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n        if ( val === \"auto\" ||\n            !parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n            val = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n            // offsetWidth/offsetHeight provide border-box values\n            valueIsBorderBox = true;\n        }\n\n        // Normalize \"\" and auto\n        val = parseFloat( val ) || 0;\n\n        // Adjust for the element's box model\n        return ( val +\n                boxModelAdjustment(\n                    elem,\n                    dimension,\n                    extra || ( isBorderBox ? \"border\" : \"content\" ),\n                    valueIsBorderBox,\n                    styles,\n\n                    // Provide the current computed size to request scroll gutter calculation (gh-3589)\n                    val\n                )\n            ) + \"px\";\n    }\n\n    jQuery.extend( {\n\n        // Add in style property hooks for overriding the default\n        // behavior of getting and setting a style property\n        cssHooks: {\n            opacity: {\n                get: function( elem, computed ) {\n                    if ( computed ) {\n\n                        // We should always get a number back from opacity\n                        var ret = curCSS( elem, \"opacity\" );\n                        return ret === \"\" ? \"1\" : ret;\n                    }\n                }\n            }\n        },\n\n        // Don't automatically add \"px\" to these possibly-unitless properties\n        cssNumber: {\n            \"animationIterationCount\": true,\n            \"columnCount\": true,\n            \"fillOpacity\": true,\n            \"flexGrow\": true,\n            \"flexShrink\": true,\n            \"fontWeight\": true,\n            \"lineHeight\": true,\n            \"opacity\": true,\n            \"order\": true,\n            \"orphans\": true,\n            \"widows\": true,\n            \"zIndex\": true,\n            \"zoom\": true\n        },\n\n        // Add in properties whose names you wish to fix before\n        // setting or getting the value\n        cssProps: {},\n\n        // Get and set the style property on a DOM Node\n        style: function( elem, name, value, extra ) {\n\n            // Don't set styles on text and comment nodes\n            if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n                return;\n            }\n\n            // Make sure that we're working with the right name\n            var ret, type, hooks,\n                origName = camelCase( name ),\n                isCustomProp = rcustomProp.test( name ),\n                style = elem.style;\n\n            // Make sure that we're working with the right name. We don't\n            // want to query the value if it is a CSS custom property\n            // since they are user-defined.\n            if ( !isCustomProp ) {\n                name = finalPropName( origName );\n            }\n\n            // Gets hook for the prefixed version, then unprefixed version\n            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n            // Check if we're setting a value\n            if ( value !== undefined ) {\n                type = typeof value;\n\n                // Convert \"+=\" or \"-=\" to relative numbers (#7345)\n                if ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n                    value = adjustCSS( elem, name, ret );\n\n                    // Fixes bug #9237\n                    type = \"number\";\n                }\n\n                // Make sure that null and NaN values aren't set (#7116)\n                if ( value == null || value !== value ) {\n                    return;\n                }\n\n                // If a number was passed in, add the unit (except for certain CSS properties)\n                if ( type === \"number\" ) {\n                    value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n                }\n\n                // background-* props affect original clone's values\n                if ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n                    style[ name ] = \"inherit\";\n                }\n\n                // If a hook was provided, use that value, otherwise just set the specified value\n                if ( !hooks || !( \"set\" in hooks ) ||\n                    ( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n                    if ( isCustomProp ) {\n                        style.setProperty( name, value );\n                    } else {\n                        style[ name ] = value;\n                    }\n                }\n\n            } else {\n\n                // If a hook was provided get the non-computed value from there\n                if ( hooks && \"get\" in hooks &&\n                    ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n                    return ret;\n                }\n\n                // Otherwise just get the value from the style object\n                return style[ name ];\n            }\n        },\n\n        css: function( elem, name, extra, styles ) {\n            var val, num, hooks,\n                origName = camelCase( name ),\n                isCustomProp = rcustomProp.test( name );\n\n            // Make sure that we're working with the right name. We don't\n            // want to modify the value if it is a CSS custom property\n            // since they are user-defined.\n            if ( !isCustomProp ) {\n                name = finalPropName( origName );\n            }\n\n            // Try prefixed name followed by the unprefixed name\n            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n            // If a hook was provided get the computed value from there\n            if ( hooks && \"get\" in hooks ) {\n                val = hooks.get( elem, true, extra );\n            }\n\n            // Otherwise, if a way to get the computed value exists, use that\n            if ( val === undefined ) {\n                val = curCSS( elem, name, styles );\n            }\n\n            // Convert \"normal\" to computed value\n            if ( val === \"normal\" && name in cssNormalTransform ) {\n                val = cssNormalTransform[ name ];\n            }\n\n            // Make numeric if forced or a qualifier was provided and val looks numeric\n            if ( extra === \"\" || extra ) {\n                num = parseFloat( val );\n                return extra === true || isFinite( num ) ? num || 0 : val;\n            }\n\n            return val;\n        }\n    } );\n\n    jQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n        jQuery.cssHooks[ dimension ] = {\n            get: function( elem, computed, extra ) {\n                if ( computed ) {\n\n                    // Certain elements can have dimension info if we invisibly show them\n                    // but it must have a current display style that would benefit\n                    return rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n                    // Support: Safari 8+\n                    // Table columns in Safari have non-zero offsetWidth & zero\n                    // getBoundingClientRect().width unless display is changed.\n                    // Support: IE <=11 only\n                    // Running getBoundingClientRect on a disconnected node\n                    // in IE throws an error.\n                    ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n                        swap( elem, cssShow, function() {\n                            return getWidthOrHeight( elem, dimension, extra );\n                        } ) :\n                        getWidthOrHeight( elem, dimension, extra );\n                }\n            },\n\n            set: function( elem, value, extra ) {\n                var matches,\n                    styles = getStyles( elem ),\n                    isBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n                    subtract = extra && boxModelAdjustment(\n                            elem,\n                            dimension,\n                            extra,\n                            isBorderBox,\n                            styles\n                        );\n\n                // Account for unreliable border-box dimensions by comparing offset* to computed and\n                // faking a content-box to get border and padding (gh-3699)\n                if ( isBorderBox && support.scrollboxSize() === styles.position ) {\n                    subtract -= Math.ceil(\n                        elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n                        parseFloat( styles[ dimension ] ) -\n                        boxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n                        0.5\n                    );\n                }\n\n                // Convert to pixels if value adjustment is needed\n                if ( subtract && ( matches = rcssNum.exec( value ) ) &&\n                    ( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n                    elem.style[ dimension ] = value;\n                    value = jQuery.css( elem, dimension );\n                }\n\n                return setPositiveNumber( elem, value, subtract );\n            }\n        };\n    } );\n\n    jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n        function( elem, computed ) {\n            if ( computed ) {\n                return ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n                        elem.getBoundingClientRect().left -\n                        swap( elem, { marginLeft: 0 }, function() {\n                            return elem.getBoundingClientRect().left;\n                        } )\n                    ) + \"px\";\n            }\n        }\n    );\n\n// These hooks are used by animate to expand properties\n    jQuery.each( {\n        margin: \"\",\n        padding: \"\",\n        border: \"Width\"\n    }, function( prefix, suffix ) {\n        jQuery.cssHooks[ prefix + suffix ] = {\n            expand: function( value ) {\n                var i = 0,\n                    expanded = {},\n\n                // Assumes a single number if not a string\n                    parts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n                for ( ; i < 4; i++ ) {\n                    expanded[ prefix + cssExpand[ i ] + suffix ] =\n                        parts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n                }\n\n                return expanded;\n            }\n        };\n\n        if ( prefix !== \"margin\" ) {\n            jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n        }\n    } );\n\n    jQuery.fn.extend( {\n        css: function( name, value ) {\n            return access( this, function( elem, name, value ) {\n                var styles, len,\n                    map = {},\n                    i = 0;\n\n                if ( Array.isArray( name ) ) {\n                    styles = getStyles( elem );\n                    len = name.length;\n\n                    for ( ; i < len; i++ ) {\n                        map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n                    }\n\n                    return map;\n                }\n\n                return value !== undefined ?\n                    jQuery.style( elem, name, value ) :\n                    jQuery.css( elem, name );\n            }, name, value, arguments.length > 1 );\n        }\n    } );\n\n\n    function Tween( elem, options, prop, end, easing ) {\n        return new Tween.prototype.init( elem, options, prop, end, easing );\n    }\n    jQuery.Tween = Tween;\n\n    Tween.prototype = {\n        constructor: Tween,\n        init: function( elem, options, prop, end, easing, unit ) {\n            this.elem = elem;\n            this.prop = prop;\n            this.easing = easing || jQuery.easing._default;\n            this.options = options;\n            this.start = this.now = this.cur();\n            this.end = end;\n            this.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n        },\n        cur: function() {\n            var hooks = Tween.propHooks[ this.prop ];\n\n            return hooks && hooks.get ?\n                hooks.get( this ) :\n                Tween.propHooks._default.get( this );\n        },\n        run: function( percent ) {\n            var eased,\n                hooks = Tween.propHooks[ this.prop ];\n\n            if ( this.options.duration ) {\n                this.pos = eased = jQuery.easing[ this.easing ](\n                    percent, this.options.duration * percent, 0, 1, this.options.duration\n                );\n            } else {\n                this.pos = eased = percent;\n            }\n            this.now = ( this.end - this.start ) * eased + this.start;\n\n            if ( this.options.step ) {\n                this.options.step.call( this.elem, this.now, this );\n            }\n\n            if ( hooks && hooks.set ) {\n                hooks.set( this );\n            } else {\n                Tween.propHooks._default.set( this );\n            }\n            return this;\n        }\n    };\n\n    Tween.prototype.init.prototype = Tween.prototype;\n\n    Tween.propHooks = {\n        _default: {\n            get: function( tween ) {\n                var result;\n\n                // Use a property on the element directly when it is not a DOM element,\n                // or when there is no matching style property that exists.\n                if ( tween.elem.nodeType !== 1 ||\n                    tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n                    return tween.elem[ tween.prop ];\n                }\n\n                // Passing an empty string as a 3rd parameter to .css will automatically\n                // attempt a parseFloat and fallback to a string if the parse fails.\n                // Simple values such as \"10px\" are parsed to Float;\n                // complex values such as \"rotate(1rad)\" are returned as-is.\n                result = jQuery.css( tween.elem, tween.prop, \"\" );\n\n                // Empty strings, null, undefined and \"auto\" are converted to 0.\n                return !result || result === \"auto\" ? 0 : result;\n            },\n            set: function( tween ) {\n\n                // Use step hook for back compat.\n                // Use cssHook if its there.\n                // Use .style if available and use plain properties where available.\n                if ( jQuery.fx.step[ tween.prop ] ) {\n                    jQuery.fx.step[ tween.prop ]( tween );\n                } else if ( tween.elem.nodeType === 1 &&\n                    ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n                    jQuery.cssHooks[ tween.prop ] ) ) {\n                    jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n                } else {\n                    tween.elem[ tween.prop ] = tween.now;\n                }\n            }\n        }\n    };\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\n    Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n        set: function( tween ) {\n            if ( tween.elem.nodeType && tween.elem.parentNode ) {\n                tween.elem[ tween.prop ] = tween.now;\n            }\n        }\n    };\n\n    jQuery.easing = {\n        linear: function( p ) {\n            return p;\n        },\n        swing: function( p ) {\n            return 0.5 - Math.cos( p * Math.PI ) / 2;\n        },\n        _default: \"swing\"\n    };\n\n    jQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\n    jQuery.fx.step = {};\n\n\n\n\n    var\n        fxNow, inProgress,\n        rfxtypes = /^(?:toggle|show|hide)$/,\n        rrun = /queueHooks$/;\n\n    function schedule() {\n        if ( inProgress ) {\n            if ( document.hidden === false && window.requestAnimationFrame ) {\n                window.requestAnimationFrame( schedule );\n            } else {\n                window.setTimeout( schedule, jQuery.fx.interval );\n            }\n\n            jQuery.fx.tick();\n        }\n    }\n\n// Animations created synchronously will run synchronously\n    function createFxNow() {\n        window.setTimeout( function() {\n            fxNow = undefined;\n        } );\n        return ( fxNow = Date.now() );\n    }\n\n// Generate parameters to create a standard animation\n    function genFx( type, includeWidth ) {\n        var which,\n            i = 0,\n            attrs = { height: type };\n\n        // If we include width, step value is 1 to do all cssExpand values,\n        // otherwise step value is 2 to skip over Left and Right\n        includeWidth = includeWidth ? 1 : 0;\n        for ( ; i < 4; i += 2 - includeWidth ) {\n            which = cssExpand[ i ];\n            attrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n        }\n\n        if ( includeWidth ) {\n            attrs.opacity = attrs.width = type;\n        }\n\n        return attrs;\n    }\n\n    function createTween( value, prop, animation ) {\n        var tween,\n            collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n            index = 0,\n            length = collection.length;\n        for ( ; index < length; index++ ) {\n            if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n                // We're done with this property\n                return tween;\n            }\n        }\n    }\n\n    function defaultPrefilter( elem, props, opts ) {\n        var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n            isBox = \"width\" in props || \"height\" in props,\n            anim = this,\n            orig = {},\n            style = elem.style,\n            hidden = elem.nodeType && isHiddenWithinTree( elem ),\n            dataShow = dataPriv.get( elem, \"fxshow\" );\n\n        // Queue-skipping animations hijack the fx hooks\n        if ( !opts.queue ) {\n            hooks = jQuery._queueHooks( elem, \"fx\" );\n            if ( hooks.unqueued == null ) {\n                hooks.unqueued = 0;\n                oldfire = hooks.empty.fire;\n                hooks.empty.fire = function() {\n                    if ( !hooks.unqueued ) {\n                        oldfire();\n                    }\n                };\n            }\n            hooks.unqueued++;\n\n            anim.always( function() {\n\n                // Ensure the complete handler is called before this completes\n                anim.always( function() {\n                    hooks.unqueued--;\n                    if ( !jQuery.queue( elem, \"fx\" ).length ) {\n                        hooks.empty.fire();\n                    }\n                } );\n            } );\n        }\n\n        // Detect show/hide animations\n        for ( prop in props ) {\n            value = props[ prop ];\n            if ( rfxtypes.test( value ) ) {\n                delete props[ prop ];\n                toggle = toggle || value === \"toggle\";\n                if ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n                    // Pretend to be hidden if this is a \"show\" and\n                    // there is still data from a stopped show/hide\n                    if ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n                        hidden = true;\n\n                        // Ignore all other no-op show/hide data\n                    } else {\n                        continue;\n                    }\n                }\n                orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n            }\n        }\n\n        // Bail out if this is a no-op like .hide().hide()\n        propTween = !jQuery.isEmptyObject( props );\n        if ( !propTween && jQuery.isEmptyObject( orig ) ) {\n            return;\n        }\n\n        // Restrict \"overflow\" and \"display\" styles during box animations\n        if ( isBox && elem.nodeType === 1 ) {\n\n            // Support: IE <=9 - 11, Edge 12 - 15\n            // Record all 3 overflow attributes because IE does not infer the shorthand\n            // from identically-valued overflowX and overflowY and Edge just mirrors\n            // the overflowX value there.\n            opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n            // Identify a display type, preferring old show/hide data over the CSS cascade\n            restoreDisplay = dataShow && dataShow.display;\n            if ( restoreDisplay == null ) {\n                restoreDisplay = dataPriv.get( elem, \"display\" );\n            }\n            display = jQuery.css( elem, \"display\" );\n            if ( display === \"none\" ) {\n                if ( restoreDisplay ) {\n                    display = restoreDisplay;\n                } else {\n\n                    // Get nonempty value(s) by temporarily forcing visibility\n                    showHide( [ elem ], true );\n                    restoreDisplay = elem.style.display || restoreDisplay;\n                    display = jQuery.css( elem, \"display\" );\n                    showHide( [ elem ] );\n                }\n            }\n\n            // Animate inline elements as inline-block\n            if ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n                if ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n                    // Restore the original display value at the end of pure show/hide animations\n                    if ( !propTween ) {\n                        anim.done( function() {\n                            style.display = restoreDisplay;\n                        } );\n                        if ( restoreDisplay == null ) {\n                            display = style.display;\n                            restoreDisplay = display === \"none\" ? \"\" : display;\n                        }\n                    }\n                    style.display = \"inline-block\";\n                }\n            }\n        }\n\n        if ( opts.overflow ) {\n            style.overflow = \"hidden\";\n            anim.always( function() {\n                style.overflow = opts.overflow[ 0 ];\n                style.overflowX = opts.overflow[ 1 ];\n                style.overflowY = opts.overflow[ 2 ];\n            } );\n        }\n\n        // Implement show/hide animations\n        propTween = false;\n        for ( prop in orig ) {\n\n            // General show/hide setup for this element animation\n            if ( !propTween ) {\n                if ( dataShow ) {\n                    if ( \"hidden\" in dataShow ) {\n                        hidden = dataShow.hidden;\n                    }\n                } else {\n                    dataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n                }\n\n                // Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n                if ( toggle ) {\n                    dataShow.hidden = !hidden;\n                }\n\n                // Show elements before animating them\n                if ( hidden ) {\n                    showHide( [ elem ], true );\n                }\n\n                /* eslint-disable no-loop-func */\n\n                anim.done( function() {\n\n                    /* eslint-enable no-loop-func */\n\n                    // The final step of a \"hide\" animation is actually hiding the element\n                    if ( !hidden ) {\n                        showHide( [ elem ] );\n                    }\n                    dataPriv.remove( elem, \"fxshow\" );\n                    for ( prop in orig ) {\n                        jQuery.style( elem, prop, orig[ prop ] );\n                    }\n                } );\n            }\n\n            // Per-property setup\n            propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n            if ( !( prop in dataShow ) ) {\n                dataShow[ prop ] = propTween.start;\n                if ( hidden ) {\n                    propTween.end = propTween.start;\n                    propTween.start = 0;\n                }\n            }\n        }\n    }\n\n    function propFilter( props, specialEasing ) {\n        var index, name, easing, value, hooks;\n\n        // camelCase, specialEasing and expand cssHook pass\n        for ( index in props ) {\n            name = camelCase( index );\n            easing = specialEasing[ name ];\n            value = props[ index ];\n            if ( Array.isArray( value ) ) {\n                easing = value[ 1 ];\n                value = props[ index ] = value[ 0 ];\n            }\n\n            if ( index !== name ) {\n                props[ name ] = value;\n                delete props[ index ];\n            }\n\n            hooks = jQuery.cssHooks[ name ];\n            if ( hooks && \"expand\" in hooks ) {\n                value = hooks.expand( value );\n                delete props[ name ];\n\n                // Not quite $.extend, this won't overwrite existing keys.\n                // Reusing 'index' because we have the correct \"name\"\n                for ( index in value ) {\n                    if ( !( index in props ) ) {\n                        props[ index ] = value[ index ];\n                        specialEasing[ index ] = easing;\n                    }\n                }\n            } else {\n                specialEasing[ name ] = easing;\n            }\n        }\n    }\n\n    function Animation( elem, properties, options ) {\n        var result,\n            stopped,\n            index = 0,\n            length = Animation.prefilters.length,\n            deferred = jQuery.Deferred().always( function() {\n\n                // Don't match elem in the :animated selector\n                delete tick.elem;\n            } ),\n            tick = function() {\n                if ( stopped ) {\n                    return false;\n                }\n                var currentTime = fxNow || createFxNow(),\n                    remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n                // Support: Android 2.3 only\n                // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n                    temp = remaining / animation.duration || 0,\n                    percent = 1 - temp,\n                    index = 0,\n                    length = animation.tweens.length;\n\n                for ( ; index < length; index++ ) {\n                    animation.tweens[ index ].run( percent );\n                }\n\n                deferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n                // If there's more to do, yield\n                if ( percent < 1 && length ) {\n                    return remaining;\n                }\n\n                // If this was an empty animation, synthesize a final progress notification\n                if ( !length ) {\n                    deferred.notifyWith( elem, [ animation, 1, 0 ] );\n                }\n\n                // Resolve the animation and report its conclusion\n                deferred.resolveWith( elem, [ animation ] );\n                return false;\n            },\n            animation = deferred.promise( {\n                elem: elem,\n                props: jQuery.extend( {}, properties ),\n                opts: jQuery.extend( true, {\n                    specialEasing: {},\n                    easing: jQuery.easing._default\n                }, options ),\n                originalProperties: properties,\n                originalOptions: options,\n                startTime: fxNow || createFxNow(),\n                duration: options.duration,\n                tweens: [],\n                createTween: function( prop, end ) {\n                    var tween = jQuery.Tween( elem, animation.opts, prop, end,\n                        animation.opts.specialEasing[ prop ] || animation.opts.easing );\n                    animation.tweens.push( tween );\n                    return tween;\n                },\n                stop: function( gotoEnd ) {\n                    var index = 0,\n\n                    // If we are going to the end, we want to run all the tweens\n                    // otherwise we skip this part\n                        length = gotoEnd ? animation.tweens.length : 0;\n                    if ( stopped ) {\n                        return this;\n                    }\n                    stopped = true;\n                    for ( ; index < length; index++ ) {\n                        animation.tweens[ index ].run( 1 );\n                    }\n\n                    // Resolve when we played the last frame; otherwise, reject\n                    if ( gotoEnd ) {\n                        deferred.notifyWith( elem, [ animation, 1, 0 ] );\n                        deferred.resolveWith( elem, [ animation, gotoEnd ] );\n                    } else {\n                        deferred.rejectWith( elem, [ animation, gotoEnd ] );\n                    }\n                    return this;\n                }\n            } ),\n            props = animation.props;\n\n        propFilter( props, animation.opts.specialEasing );\n\n        for ( ; index < length; index++ ) {\n            result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n            if ( result ) {\n                if ( isFunction( result.stop ) ) {\n                    jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n                        result.stop.bind( result );\n                }\n                return result;\n            }\n        }\n\n        jQuery.map( props, createTween, animation );\n\n        if ( isFunction( animation.opts.start ) ) {\n            animation.opts.start.call( elem, animation );\n        }\n\n        // Attach callbacks from options\n        animation\n            .progress( animation.opts.progress )\n            .done( animation.opts.done, animation.opts.complete )\n            .fail( animation.opts.fail )\n            .always( animation.opts.always );\n\n        jQuery.fx.timer(\n            jQuery.extend( tick, {\n                elem: elem,\n                anim: animation,\n                queue: animation.opts.queue\n            } )\n        );\n\n        return animation;\n    }\n\n    jQuery.Animation = jQuery.extend( Animation, {\n\n        tweeners: {\n            \"*\": [ function( prop, value ) {\n                var tween = this.createTween( prop, value );\n                adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n                return tween;\n            } ]\n        },\n\n        tweener: function( props, callback ) {\n            if ( isFunction( props ) ) {\n                callback = props;\n                props = [ \"*\" ];\n            } else {\n                props = props.match( rnothtmlwhite );\n            }\n\n            var prop,\n                index = 0,\n                length = props.length;\n\n            for ( ; index < length; index++ ) {\n                prop = props[ index ];\n                Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n                Animation.tweeners[ prop ].unshift( callback );\n            }\n        },\n\n        prefilters: [ defaultPrefilter ],\n\n        prefilter: function( callback, prepend ) {\n            if ( prepend ) {\n                Animation.prefilters.unshift( callback );\n            } else {\n                Animation.prefilters.push( callback );\n            }\n        }\n    } );\n\n    jQuery.speed = function( speed, easing, fn ) {\n        var opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n            complete: fn || !fn && easing ||\n            isFunction( speed ) && speed,\n            duration: speed,\n            easing: fn && easing || easing && !isFunction( easing ) && easing\n        };\n\n        // Go to the end state if fx are off\n        if ( jQuery.fx.off ) {\n            opt.duration = 0;\n\n        } else {\n            if ( typeof opt.duration !== \"number\" ) {\n                if ( opt.duration in jQuery.fx.speeds ) {\n                    opt.duration = jQuery.fx.speeds[ opt.duration ];\n\n                } else {\n                    opt.duration = jQuery.fx.speeds._default;\n                }\n            }\n        }\n\n        // Normalize opt.queue - true/undefined/null -> \"fx\"\n        if ( opt.queue == null || opt.queue === true ) {\n            opt.queue = \"fx\";\n        }\n\n        // Queueing\n        opt.old = opt.complete;\n\n        opt.complete = function() {\n            if ( isFunction( opt.old ) ) {\n                opt.old.call( this );\n            }\n\n            if ( opt.queue ) {\n                jQuery.dequeue( this, opt.queue );\n            }\n        };\n\n        return opt;\n    };\n\n    jQuery.fn.extend( {\n        fadeTo: function( speed, to, easing, callback ) {\n\n            // Show any hidden elements after setting opacity to 0\n            return this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n                // Animate to the value specified\n                .end().animate( { opacity: to }, speed, easing, callback );\n        },\n        animate: function( prop, speed, easing, callback ) {\n            var empty = jQuery.isEmptyObject( prop ),\n                optall = jQuery.speed( speed, easing, callback ),\n                doAnimation = function() {\n\n                    // Operate on a copy of prop so per-property easing won't be lost\n                    var anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n                    // Empty animations, or finishing resolves immediately\n                    if ( empty || dataPriv.get( this, \"finish\" ) ) {\n                        anim.stop( true );\n                    }\n                };\n            doAnimation.finish = doAnimation;\n\n            return empty || optall.queue === false ?\n                this.each( doAnimation ) :\n                this.queue( optall.queue, doAnimation );\n        },\n        stop: function( type, clearQueue, gotoEnd ) {\n            var stopQueue = function( hooks ) {\n                var stop = hooks.stop;\n                delete hooks.stop;\n                stop( gotoEnd );\n            };\n\n            if ( typeof type !== \"string\" ) {\n                gotoEnd = clearQueue;\n                clearQueue = type;\n                type = undefined;\n            }\n            if ( clearQueue && type !== false ) {\n                this.queue( type || \"fx\", [] );\n            }\n\n            return this.each( function() {\n                var dequeue = true,\n                    index = type != null && type + \"queueHooks\",\n                    timers = jQuery.timers,\n                    data = dataPriv.get( this );\n\n                if ( index ) {\n                    if ( data[ index ] && data[ index ].stop ) {\n                        stopQueue( data[ index ] );\n                    }\n                } else {\n                    for ( index in data ) {\n                        if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n                            stopQueue( data[ index ] );\n                        }\n                    }\n                }\n\n                for ( index = timers.length; index--; ) {\n                    if ( timers[ index ].elem === this &&\n                        ( type == null || timers[ index ].queue === type ) ) {\n\n                        timers[ index ].anim.stop( gotoEnd );\n                        dequeue = false;\n                        timers.splice( index, 1 );\n                    }\n                }\n\n                // Start the next in the queue if the last step wasn't forced.\n                // Timers currently will call their complete callbacks, which\n                // will dequeue but only if they were gotoEnd.\n                if ( dequeue || !gotoEnd ) {\n                    jQuery.dequeue( this, type );\n                }\n            } );\n        },\n        finish: function( type ) {\n            if ( type !== false ) {\n                type = type || \"fx\";\n            }\n            return this.each( function() {\n                var index,\n                    data = dataPriv.get( this ),\n                    queue = data[ type + \"queue\" ],\n                    hooks = data[ type + \"queueHooks\" ],\n                    timers = jQuery.timers,\n                    length = queue ? queue.length : 0;\n\n                // Enable finishing flag on private data\n                data.finish = true;\n\n                // Empty the queue first\n                jQuery.queue( this, type, [] );\n\n                if ( hooks && hooks.stop ) {\n                    hooks.stop.call( this, true );\n                }\n\n                // Look for any active animations, and finish them\n                for ( index = timers.length; index--; ) {\n                    if ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n                        timers[ index ].anim.stop( true );\n                        timers.splice( index, 1 );\n                    }\n                }\n\n                // Look for any animations in the old queue and finish them\n                for ( index = 0; index < length; index++ ) {\n                    if ( queue[ index ] && queue[ index ].finish ) {\n                        queue[ index ].finish.call( this );\n                    }\n                }\n\n                // Turn off finishing flag\n                delete data.finish;\n            } );\n        }\n    } );\n\n    jQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n        var cssFn = jQuery.fn[ name ];\n        jQuery.fn[ name ] = function( speed, easing, callback ) {\n            return speed == null || typeof speed === \"boolean\" ?\n                cssFn.apply( this, arguments ) :\n                this.animate( genFx( name, true ), speed, easing, callback );\n        };\n    } );\n\n// Generate shortcuts for custom animations\n    jQuery.each( {\n        slideDown: genFx( \"show\" ),\n        slideUp: genFx( \"hide\" ),\n        slideToggle: genFx( \"toggle\" ),\n        fadeIn: { opacity: \"show\" },\n        fadeOut: { opacity: \"hide\" },\n        fadeToggle: { opacity: \"toggle\" }\n    }, function( name, props ) {\n        jQuery.fn[ name ] = function( speed, easing, callback ) {\n            return this.animate( props, speed, easing, callback );\n        };\n    } );\n\n    jQuery.timers = [];\n    jQuery.fx.tick = function() {\n        var timer,\n            i = 0,\n            timers = jQuery.timers;\n\n        fxNow = Date.now();\n\n        for ( ; i < timers.length; i++ ) {\n            timer = timers[ i ];\n\n            // Run the timer and safely remove it when done (allowing for external removal)\n            if ( !timer() && timers[ i ] === timer ) {\n                timers.splice( i--, 1 );\n            }\n        }\n\n        if ( !timers.length ) {\n            jQuery.fx.stop();\n        }\n        fxNow = undefined;\n    };\n\n    jQuery.fx.timer = function( timer ) {\n        jQuery.timers.push( timer );\n        jQuery.fx.start();\n    };\n\n    jQuery.fx.interval = 13;\n    jQuery.fx.start = function() {\n        if ( inProgress ) {\n            return;\n        }\n\n        inProgress = true;\n        schedule();\n    };\n\n    jQuery.fx.stop = function() {\n        inProgress = null;\n    };\n\n    jQuery.fx.speeds = {\n        slow: 600,\n        fast: 200,\n\n        // Default speed\n        _default: 400\n    };\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\n    jQuery.fn.delay = function( time, type ) {\n        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n        type = type || \"fx\";\n\n        return this.queue( type, function( next, hooks ) {\n            var timeout = window.setTimeout( next, time );\n            hooks.stop = function() {\n                window.clearTimeout( timeout );\n            };\n        } );\n    };\n\n\n    ( function() {\n        var input = document.createElement( \"input\" ),\n            select = document.createElement( \"select\" ),\n            opt = select.appendChild( document.createElement( \"option\" ) );\n\n        input.type = \"checkbox\";\n\n        // Support: Android <=4.3 only\n        // Default value for a checkbox should be \"on\"\n        support.checkOn = input.value !== \"\";\n\n        // Support: IE <=11 only\n        // Must access selectedIndex to make default options select\n        support.optSelected = opt.selected;\n\n        // Support: IE <=11 only\n        // An input loses its value after becoming a radio\n        input = document.createElement( \"input\" );\n        input.value = \"t\";\n        input.type = \"radio\";\n        support.radioValue = input.value === \"t\";\n    } )();\n\n\n    var boolHook,\n        attrHandle = jQuery.expr.attrHandle;\n\n    jQuery.fn.extend( {\n        attr: function( name, value ) {\n            return access( this, jQuery.attr, name, value, arguments.length > 1 );\n        },\n\n        removeAttr: function( name ) {\n            return this.each( function() {\n                jQuery.removeAttr( this, name );\n            } );\n        }\n    } );\n\n    jQuery.extend( {\n        attr: function( elem, name, value ) {\n            var ret, hooks,\n                nType = elem.nodeType;\n\n            // Don't get/set attributes on text, comment and attribute nodes\n            if ( nType === 3 || nType === 8 || nType === 2 ) {\n                return;\n            }\n\n            // Fallback to prop when attributes are not supported\n            if ( typeof elem.getAttribute === \"undefined\" ) {\n                return jQuery.prop( elem, name, value );\n            }\n\n            // Attribute hooks are determined by the lowercase version\n            // Grab necessary hook if one is defined\n            if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n                hooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n                    ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n            }\n\n            if ( value !== undefined ) {\n                if ( value === null ) {\n                    jQuery.removeAttr( elem, name );\n                    return;\n                }\n\n                if ( hooks && \"set\" in hooks &&\n                    ( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n                    return ret;\n                }\n\n                elem.setAttribute( name, value + \"\" );\n                return value;\n            }\n\n            if ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n                return ret;\n            }\n\n            ret = jQuery.find.attr( elem, name );\n\n            // Non-existent attributes return null, we normalize to undefined\n            return ret == null ? undefined : ret;\n        },\n\n        attrHooks: {\n            type: {\n                set: function( elem, value ) {\n                    if ( !support.radioValue && value === \"radio\" &&\n                        nodeName( elem, \"input\" ) ) {\n                        var val = elem.value;\n                        elem.setAttribute( \"type\", value );\n                        if ( val ) {\n                            elem.value = val;\n                        }\n                        return value;\n                    }\n                }\n            }\n        },\n\n        removeAttr: function( elem, value ) {\n            var name,\n                i = 0,\n\n            // Attribute names can contain non-HTML whitespace characters\n            // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n                attrNames = value && value.match( rnothtmlwhite );\n\n            if ( attrNames && elem.nodeType === 1 ) {\n                while ( ( name = attrNames[ i++ ] ) ) {\n                    elem.removeAttribute( name );\n                }\n            }\n        }\n    } );\n\n// Hooks for boolean attributes\n    boolHook = {\n        set: function( elem, value, name ) {\n            if ( value === false ) {\n\n                // Remove boolean attributes when set to false\n                jQuery.removeAttr( elem, name );\n            } else {\n                elem.setAttribute( name, name );\n            }\n            return name;\n        }\n    };\n\n    jQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n        var getter = attrHandle[ name ] || jQuery.find.attr;\n\n        attrHandle[ name ] = function( elem, name, isXML ) {\n            var ret, handle,\n                lowercaseName = name.toLowerCase();\n\n            if ( !isXML ) {\n\n                // Avoid an infinite loop by temporarily removing this function from the getter\n                handle = attrHandle[ lowercaseName ];\n                attrHandle[ lowercaseName ] = ret;\n                ret = getter( elem, name, isXML ) != null ?\n                    lowercaseName :\n                    null;\n                attrHandle[ lowercaseName ] = handle;\n            }\n            return ret;\n        };\n    } );\n\n\n\n\n    var rfocusable = /^(?:input|select|textarea|button)$/i,\n        rclickable = /^(?:a|area)$/i;\n\n    jQuery.fn.extend( {\n        prop: function( name, value ) {\n            return access( this, jQuery.prop, name, value, arguments.length > 1 );\n        },\n\n        removeProp: function( name ) {\n            return this.each( function() {\n                delete this[ jQuery.propFix[ name ] || name ];\n            } );\n        }\n    } );\n\n    jQuery.extend( {\n        prop: function( elem, name, value ) {\n            var ret, hooks,\n                nType = elem.nodeType;\n\n            // Don't get/set properties on text, comment and attribute nodes\n            if ( nType === 3 || nType === 8 || nType === 2 ) {\n                return;\n            }\n\n            if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n                // Fix name and attach hooks\n                name = jQuery.propFix[ name ] || name;\n                hooks = jQuery.propHooks[ name ];\n            }\n\n            if ( value !== undefined ) {\n                if ( hooks && \"set\" in hooks &&\n                    ( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n                    return ret;\n                }\n\n                return ( elem[ name ] = value );\n            }\n\n            if ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n                return ret;\n            }\n\n            return elem[ name ];\n        },\n\n        propHooks: {\n            tabIndex: {\n                get: function( elem ) {\n\n                    // Support: IE <=9 - 11 only\n                    // elem.tabIndex doesn't always return the\n                    // correct value when it hasn't been explicitly set\n                    // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n                    // Use proper attribute retrieval(#12072)\n                    var tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n                    if ( tabindex ) {\n                        return parseInt( tabindex, 10 );\n                    }\n\n                    if (\n                        rfocusable.test( elem.nodeName ) ||\n                        rclickable.test( elem.nodeName ) &&\n                        elem.href\n                    ) {\n                        return 0;\n                    }\n\n                    return -1;\n                }\n            }\n        },\n\n        propFix: {\n            \"for\": \"htmlFor\",\n            \"class\": \"className\"\n        }\n    } );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\n    if ( !support.optSelected ) {\n        jQuery.propHooks.selected = {\n            get: function( elem ) {\n\n                /* eslint no-unused-expressions: \"off\" */\n\n                var parent = elem.parentNode;\n                if ( parent && parent.parentNode ) {\n                    parent.parentNode.selectedIndex;\n                }\n                return null;\n            },\n            set: function( elem ) {\n\n                /* eslint no-unused-expressions: \"off\" */\n\n                var parent = elem.parentNode;\n                if ( parent ) {\n                    parent.selectedIndex;\n\n                    if ( parent.parentNode ) {\n                        parent.parentNode.selectedIndex;\n                    }\n                }\n            }\n        };\n    }\n\n    jQuery.each( [\n        \"tabIndex\",\n        \"readOnly\",\n        \"maxLength\",\n        \"cellSpacing\",\n        \"cellPadding\",\n        \"rowSpan\",\n        \"colSpan\",\n        \"useMap\",\n        \"frameBorder\",\n        \"contentEditable\"\n    ], function() {\n        jQuery.propFix[ this.toLowerCase() ] = this;\n    } );\n\n\n\n\n    // Strip and collapse whitespace according to HTML spec\n    // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n    function stripAndCollapse( value ) {\n        var tokens = value.match( rnothtmlwhite ) || [];\n        return tokens.join( \" \" );\n    }\n\n\n    function getClass( elem ) {\n        return elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n    }\n\n    function classesToArray( value ) {\n        if ( Array.isArray( value ) ) {\n            return value;\n        }\n        if ( typeof value === \"string\" ) {\n            return value.match( rnothtmlwhite ) || [];\n        }\n        return [];\n    }\n\n    jQuery.fn.extend( {\n        addClass: function( value ) {\n            var classes, elem, cur, curValue, clazz, j, finalValue,\n                i = 0;\n\n            if ( isFunction( value ) ) {\n                return this.each( function( j ) {\n                    jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n                } );\n            }\n\n            classes = classesToArray( value );\n\n            if ( classes.length ) {\n                while ( ( elem = this[ i++ ] ) ) {\n                    curValue = getClass( elem );\n                    cur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n                    if ( cur ) {\n                        j = 0;\n                        while ( ( clazz = classes[ j++ ] ) ) {\n                            if ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n                                cur += clazz + \" \";\n                            }\n                        }\n\n                        // Only assign if different to avoid unneeded rendering.\n                        finalValue = stripAndCollapse( cur );\n                        if ( curValue !== finalValue ) {\n                            elem.setAttribute( \"class\", finalValue );\n                        }\n                    }\n                }\n            }\n\n            return this;\n        },\n\n        removeClass: function( value ) {\n            var classes, elem, cur, curValue, clazz, j, finalValue,\n                i = 0;\n\n            if ( isFunction( value ) ) {\n                return this.each( function( j ) {\n                    jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n                } );\n            }\n\n            if ( !arguments.length ) {\n                return this.attr( \"class\", \"\" );\n            }\n\n            classes = classesToArray( value );\n\n            if ( classes.length ) {\n                while ( ( elem = this[ i++ ] ) ) {\n                    curValue = getClass( elem );\n\n                    // This expression is here for better compressibility (see addClass)\n                    cur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n                    if ( cur ) {\n                        j = 0;\n                        while ( ( clazz = classes[ j++ ] ) ) {\n\n                            // Remove *all* instances\n                            while ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n                                cur = cur.replace( \" \" + clazz + \" \", \" \" );\n                            }\n                        }\n\n                        // Only assign if different to avoid unneeded rendering.\n                        finalValue = stripAndCollapse( cur );\n                        if ( curValue !== finalValue ) {\n                            elem.setAttribute( \"class\", finalValue );\n                        }\n                    }\n                }\n            }\n\n            return this;\n        },\n\n        toggleClass: function( value, stateVal ) {\n            var type = typeof value,\n                isValidValue = type === \"string\" || Array.isArray( value );\n\n            if ( typeof stateVal === \"boolean\" && isValidValue ) {\n                return stateVal ? this.addClass( value ) : this.removeClass( value );\n            }\n\n            if ( isFunction( value ) ) {\n                return this.each( function( i ) {\n                    jQuery( this ).toggleClass(\n                        value.call( this, i, getClass( this ), stateVal ),\n                        stateVal\n                    );\n                } );\n            }\n\n            return this.each( function() {\n                var className, i, self, classNames;\n\n                if ( isValidValue ) {\n\n                    // Toggle individual class names\n                    i = 0;\n                    self = jQuery( this );\n                    classNames = classesToArray( value );\n\n                    while ( ( className = classNames[ i++ ] ) ) {\n\n                        // Check each className given, space separated list\n                        if ( self.hasClass( className ) ) {\n                            self.removeClass( className );\n                        } else {\n                            self.addClass( className );\n                        }\n                    }\n\n                    // Toggle whole class name\n                } else if ( value === undefined || type === \"boolean\" ) {\n                    className = getClass( this );\n                    if ( className ) {\n\n                        // Store className if set\n                        dataPriv.set( this, \"__className__\", className );\n                    }\n\n                    // If the element has a class name or if we're passed `false`,\n                    // then remove the whole classname (if there was one, the above saved it).\n                    // Otherwise bring back whatever was previously saved (if anything),\n                    // falling back to the empty string if nothing was stored.\n                    if ( this.setAttribute ) {\n                        this.setAttribute( \"class\",\n                            className || value === false ?\n                                \"\" :\n                            dataPriv.get( this, \"__className__\" ) || \"\"\n                        );\n                    }\n                }\n            } );\n        },\n\n        hasClass: function( selector ) {\n            var className, elem,\n                i = 0;\n\n            className = \" \" + selector + \" \";\n            while ( ( elem = this[ i++ ] ) ) {\n                if ( elem.nodeType === 1 &&\n                    ( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    } );\n\n\n\n\n    var rreturn = /\\r/g;\n\n    jQuery.fn.extend( {\n        val: function( value ) {\n            var hooks, ret, valueIsFunction,\n                elem = this[ 0 ];\n\n            if ( !arguments.length ) {\n                if ( elem ) {\n                    hooks = jQuery.valHooks[ elem.type ] ||\n                        jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n                    if ( hooks &&\n                        \"get\" in hooks &&\n                        ( ret = hooks.get( elem, \"value\" ) ) !== undefined\n                    ) {\n                        return ret;\n                    }\n\n                    ret = elem.value;\n\n                    // Handle most common string cases\n                    if ( typeof ret === \"string\" ) {\n                        return ret.replace( rreturn, \"\" );\n                    }\n\n                    // Handle cases where value is null/undef or number\n                    return ret == null ? \"\" : ret;\n                }\n\n                return;\n            }\n\n            valueIsFunction = isFunction( value );\n\n            return this.each( function( i ) {\n                var val;\n\n                if ( this.nodeType !== 1 ) {\n                    return;\n                }\n\n                if ( valueIsFunction ) {\n                    val = value.call( this, i, jQuery( this ).val() );\n                } else {\n                    val = value;\n                }\n\n                // Treat null/undefined as \"\"; convert numbers to string\n                if ( val == null ) {\n                    val = \"\";\n\n                } else if ( typeof val === \"number\" ) {\n                    val += \"\";\n\n                } else if ( Array.isArray( val ) ) {\n                    val = jQuery.map( val, function( value ) {\n                        return value == null ? \"\" : value + \"\";\n                    } );\n                }\n\n                hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n                // If set returns undefined, fall back to normal setting\n                if ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n                    this.value = val;\n                }\n            } );\n        }\n    } );\n\n    jQuery.extend( {\n        valHooks: {\n            option: {\n                get: function( elem ) {\n\n                    var val = jQuery.find.attr( elem, \"value\" );\n                    return val != null ?\n                        val :\n\n                        // Support: IE <=10 - 11 only\n                        // option.text throws exceptions (#14686, #14858)\n                        // Strip and collapse whitespace\n                        // https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n                        stripAndCollapse( jQuery.text( elem ) );\n                }\n            },\n            select: {\n                get: function( elem ) {\n                    var value, option, i,\n                        options = elem.options,\n                        index = elem.selectedIndex,\n                        one = elem.type === \"select-one\",\n                        values = one ? null : [],\n                        max = one ? index + 1 : options.length;\n\n                    if ( index < 0 ) {\n                        i = max;\n\n                    } else {\n                        i = one ? index : 0;\n                    }\n\n                    // Loop through all the selected options\n                    for ( ; i < max; i++ ) {\n                        option = options[ i ];\n\n                        // Support: IE <=9 only\n                        // IE8-9 doesn't update selected after form reset (#2551)\n                        if ( ( option.selected || i === index ) &&\n\n                            // Don't return options that are disabled or in a disabled optgroup\n                            !option.disabled &&\n                            ( !option.parentNode.disabled ||\n                            !nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n                            // Get the specific value for the option\n                            value = jQuery( option ).val();\n\n                            // We don't need an array for one selects\n                            if ( one ) {\n                                return value;\n                            }\n\n                            // Multi-Selects return an array\n                            values.push( value );\n                        }\n                    }\n\n                    return values;\n                },\n\n                set: function( elem, value ) {\n                    var optionSet, option,\n                        options = elem.options,\n                        values = jQuery.makeArray( value ),\n                        i = options.length;\n\n                    while ( i-- ) {\n                        option = options[ i ];\n\n                        /* eslint-disable no-cond-assign */\n\n                        if ( option.selected =\n                                jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n                        ) {\n                            optionSet = true;\n                        }\n\n                        /* eslint-enable no-cond-assign */\n                    }\n\n                    // Force browsers to behave consistently when non-matching value is set\n                    if ( !optionSet ) {\n                        elem.selectedIndex = -1;\n                    }\n                    return values;\n                }\n            }\n        }\n    } );\n\n// Radios and checkboxes getter/setter\n    jQuery.each( [ \"radio\", \"checkbox\" ], function() {\n        jQuery.valHooks[ this ] = {\n            set: function( elem, value ) {\n                if ( Array.isArray( value ) ) {\n                    return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n                }\n            }\n        };\n        if ( !support.checkOn ) {\n            jQuery.valHooks[ this ].get = function( elem ) {\n                return elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n            };\n        }\n    } );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\n    support.focusin = \"onfocusin\" in window;\n\n\n    var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n        stopPropagationCallback = function( e ) {\n            e.stopPropagation();\n        };\n\n    jQuery.extend( jQuery.event, {\n\n        trigger: function( event, data, elem, onlyHandlers ) {\n\n            var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n                eventPath = [ elem || document ],\n                type = hasOwn.call( event, \"type\" ) ? event.type : event,\n                namespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n            cur = lastElement = tmp = elem = elem || document;\n\n            // Don't do events on text and comment nodes\n            if ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n                return;\n            }\n\n            // focus/blur morphs to focusin/out; ensure we're not firing them right now\n            if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n                return;\n            }\n\n            if ( type.indexOf( \".\" ) > -1 ) {\n\n                // Namespaced trigger; create a regexp to match event type in handle()\n                namespaces = type.split( \".\" );\n                type = namespaces.shift();\n                namespaces.sort();\n            }\n            ontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n            // Caller can pass in a jQuery.Event object, Object, or just an event type string\n            event = event[ jQuery.expando ] ?\n                event :\n                new jQuery.Event( type, typeof event === \"object\" && event );\n\n            // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n            event.isTrigger = onlyHandlers ? 2 : 3;\n            event.namespace = namespaces.join( \".\" );\n            event.rnamespace = event.namespace ?\n                new RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n                null;\n\n            // Clean up the event in case it is being reused\n            event.result = undefined;\n            if ( !event.target ) {\n                event.target = elem;\n            }\n\n            // Clone any incoming data and prepend the event, creating the handler arg list\n            data = data == null ?\n                [ event ] :\n                jQuery.makeArray( data, [ event ] );\n\n            // Allow special events to draw outside the lines\n            special = jQuery.event.special[ type ] || {};\n            if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n                return;\n            }\n\n            // Determine event propagation path in advance, per W3C events spec (#9951)\n            // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n            if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n                bubbleType = special.delegateType || type;\n                if ( !rfocusMorph.test( bubbleType + type ) ) {\n                    cur = cur.parentNode;\n                }\n                for ( ; cur; cur = cur.parentNode ) {\n                    eventPath.push( cur );\n                    tmp = cur;\n                }\n\n                // Only add window if we got to document (e.g., not plain obj or detached DOM)\n                if ( tmp === ( elem.ownerDocument || document ) ) {\n                    eventPath.push( tmp.defaultView || tmp.parentWindow || window );\n                }\n            }\n\n            // Fire handlers on the event path\n            i = 0;\n            while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n                lastElement = cur;\n                event.type = i > 1 ?\n                    bubbleType :\n                special.bindType || type;\n\n                // jQuery handler\n                handle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n                    dataPriv.get( cur, \"handle\" );\n                if ( handle ) {\n                    handle.apply( cur, data );\n                }\n\n                // Native handler\n                handle = ontype && cur[ ontype ];\n                if ( handle && handle.apply && acceptData( cur ) ) {\n                    event.result = handle.apply( cur, data );\n                    if ( event.result === false ) {\n                        event.preventDefault();\n                    }\n                }\n            }\n            event.type = type;\n\n            // If nobody prevented the default action, do it now\n            if ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n                if ( ( !special._default ||\n                    special._default.apply( eventPath.pop(), data ) === false ) &&\n                    acceptData( elem ) ) {\n\n                    // Call a native DOM method on the target with the same name as the event.\n                    // Don't do default actions on window, that's where global variables be (#6170)\n                    if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n                        // Don't re-trigger an onFOO event when we call its FOO() method\n                        tmp = elem[ ontype ];\n\n                        if ( tmp ) {\n                            elem[ ontype ] = null;\n                        }\n\n                        // Prevent re-triggering of the same event, since we already bubbled it above\n                        jQuery.event.triggered = type;\n\n                        if ( event.isPropagationStopped() ) {\n                            lastElement.addEventListener( type, stopPropagationCallback );\n                        }\n\n                        elem[ type ]();\n\n                        if ( event.isPropagationStopped() ) {\n                            lastElement.removeEventListener( type, stopPropagationCallback );\n                        }\n\n                        jQuery.event.triggered = undefined;\n\n                        if ( tmp ) {\n                            elem[ ontype ] = tmp;\n                        }\n                    }\n                }\n            }\n\n            return event.result;\n        },\n\n        // Piggyback on a donor event to simulate a different one\n        // Used only for `focus(in | out)` events\n        simulate: function( type, elem, event ) {\n            var e = jQuery.extend(\n                new jQuery.Event(),\n                event,\n                {\n                    type: type,\n                    isSimulated: true\n                }\n            );\n\n            jQuery.event.trigger( e, null, elem );\n        }\n\n    } );\n\n    jQuery.fn.extend( {\n\n        trigger: function( type, data ) {\n            return this.each( function() {\n                jQuery.event.trigger( type, data, this );\n            } );\n        },\n        triggerHandler: function( type, data ) {\n            var elem = this[ 0 ];\n            if ( elem ) {\n                return jQuery.event.trigger( type, data, elem, true );\n            }\n        }\n    } );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n    if ( !support.focusin ) {\n        jQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n            // Attach a single capturing handler on the document while someone wants focusin/focusout\n            var handler = function( event ) {\n                jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n            };\n\n            jQuery.event.special[ fix ] = {\n                setup: function() {\n                    var doc = this.ownerDocument || this,\n                        attaches = dataPriv.access( doc, fix );\n\n                    if ( !attaches ) {\n                        doc.addEventListener( orig, handler, true );\n                    }\n                    dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n                },\n                teardown: function() {\n                    var doc = this.ownerDocument || this,\n                        attaches = dataPriv.access( doc, fix ) - 1;\n\n                    if ( !attaches ) {\n                        doc.removeEventListener( orig, handler, true );\n                        dataPriv.remove( doc, fix );\n\n                    } else {\n                        dataPriv.access( doc, fix, attaches );\n                    }\n                }\n            };\n        } );\n    }\n    var location = window.location;\n\n    var nonce = Date.now();\n\n    var rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\n    jQuery.parseXML = function( data ) {\n        var xml;\n        if ( !data || typeof data !== \"string\" ) {\n            return null;\n        }\n\n        // Support: IE 9 - 11 only\n        // IE throws on parseFromString with invalid input.\n        try {\n            xml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n        } catch ( e ) {\n            xml = undefined;\n        }\n\n        if ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n            jQuery.error( \"Invalid XML: \" + data );\n        }\n        return xml;\n    };\n\n\n    var\n        rbracket = /\\[\\]$/,\n        rCRLF = /\\r?\\n/g,\n        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n        rsubmittable = /^(?:input|select|textarea|keygen)/i;\n\n    function buildParams( prefix, obj, traditional, add ) {\n        var name;\n\n        if ( Array.isArray( obj ) ) {\n\n            // Serialize array item.\n            jQuery.each( obj, function( i, v ) {\n                if ( traditional || rbracket.test( prefix ) ) {\n\n                    // Treat each array item as a scalar.\n                    add( prefix, v );\n\n                } else {\n\n                    // Item is non-scalar (array or object), encode its numeric index.\n                    buildParams(\n                        prefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n                        v,\n                        traditional,\n                        add\n                    );\n                }\n            } );\n\n        } else if ( !traditional && toType( obj ) === \"object\" ) {\n\n            // Serialize object item.\n            for ( name in obj ) {\n                buildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n            }\n\n        } else {\n\n            // Serialize scalar item.\n            add( prefix, obj );\n        }\n    }\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\n    jQuery.param = function( a, traditional ) {\n        var prefix,\n            s = [],\n            add = function( key, valueOrFunction ) {\n\n                // If value is a function, invoke it and use its return value\n                var value = isFunction( valueOrFunction ) ?\n                    valueOrFunction() :\n                    valueOrFunction;\n\n                s[ s.length ] = encodeURIComponent( key ) + \"=\" +\n                    encodeURIComponent( value == null ? \"\" : value );\n            };\n\n        // If an array was passed in, assume that it is an array of form elements.\n        if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n            // Serialize the form elements\n            jQuery.each( a, function() {\n                add( this.name, this.value );\n            } );\n\n        } else {\n\n            // If traditional, encode the \"old\" way (the way 1.3.2 or older\n            // did it), otherwise encode params recursively.\n            for ( prefix in a ) {\n                buildParams( prefix, a[ prefix ], traditional, add );\n            }\n        }\n\n        // Return the resulting serialization\n        return s.join( \"&\" );\n    };\n\n    jQuery.fn.extend( {\n        serialize: function() {\n            return jQuery.param( this.serializeArray() );\n        },\n        serializeArray: function() {\n            return this.map( function() {\n\n                    // Can add propHook for \"elements\" to filter or add form elements\n                    var elements = jQuery.prop( this, \"elements\" );\n                    return elements ? jQuery.makeArray( elements ) : this;\n                } )\n                .filter( function() {\n                    var type = this.type;\n\n                    // Use .is( \":disabled\" ) so that fieldset[disabled] works\n                    return this.name && !jQuery( this ).is( \":disabled\" ) &&\n                        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n                        ( this.checked || !rcheckableType.test( type ) );\n                } )\n                .map( function( i, elem ) {\n                    var val = jQuery( this ).val();\n\n                    if ( val == null ) {\n                        return null;\n                    }\n\n                    if ( Array.isArray( val ) ) {\n                        return jQuery.map( val, function( val ) {\n                            return { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n                        } );\n                    }\n\n                    return { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n                } ).get();\n        }\n    } );\n\n\n    var\n        r20 = /%20/g,\n        rhash = /#.*$/,\n        rantiCache = /([?&])_=[^&]*/,\n        rheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n    // #7653, #8125, #8152: local protocol detection\n        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n        rnoContent = /^(?:GET|HEAD)$/,\n        rprotocol = /^\\/\\//,\n\n    /* Prefilters\n     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n     * 2) These are called:\n     *    - BEFORE asking for a transport\n     *    - AFTER param serialization (s.data is a string if s.processData is true)\n     * 3) key is the dataType\n     * 4) the catchall symbol \"*\" can be used\n     * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n     */\n        prefilters = {},\n\n    /* Transports bindings\n     * 1) key is the dataType\n     * 2) the catchall symbol \"*\" can be used\n     * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n     */\n        transports = {},\n\n    // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n        allTypes = \"*/\".concat( \"*\" ),\n\n    // Anchor tag for parsing the document origin\n        originAnchor = document.createElement( \"a\" );\n    originAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\n    function addToPrefiltersOrTransports( structure ) {\n\n        // dataTypeExpression is optional and defaults to \"*\"\n        return function( dataTypeExpression, func ) {\n\n            if ( typeof dataTypeExpression !== \"string\" ) {\n                func = dataTypeExpression;\n                dataTypeExpression = \"*\";\n            }\n\n            var dataType,\n                i = 0,\n                dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n            if ( isFunction( func ) ) {\n\n                // For each dataType in the dataTypeExpression\n                while ( ( dataType = dataTypes[ i++ ] ) ) {\n\n                    // Prepend if requested\n                    if ( dataType[ 0 ] === \"+\" ) {\n                        dataType = dataType.slice( 1 ) || \"*\";\n                        ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n                        // Otherwise append\n                    } else {\n                        ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n                    }\n                }\n            }\n        };\n    }\n\n// Base inspection function for prefilters and transports\n    function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n        var inspected = {},\n            seekingTransport = ( structure === transports );\n\n        function inspect( dataType ) {\n            var selected;\n            inspected[ dataType ] = true;\n            jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n                var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n                if ( typeof dataTypeOrTransport === \"string\" &&\n                    !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n                    options.dataTypes.unshift( dataTypeOrTransport );\n                    inspect( dataTypeOrTransport );\n                    return false;\n                } else if ( seekingTransport ) {\n                    return !( selected = dataTypeOrTransport );\n                }\n            } );\n            return selected;\n        }\n\n        return inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n    }\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\n    function ajaxExtend( target, src ) {\n        var key, deep,\n            flatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n        for ( key in src ) {\n            if ( src[ key ] !== undefined ) {\n                ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n            }\n        }\n        if ( deep ) {\n            jQuery.extend( true, target, deep );\n        }\n\n        return target;\n    }\n\n    /* Handles responses to an ajax request:\n     * - finds the right dataType (mediates between content-type and expected dataType)\n     * - returns the corresponding response\n     */\n    function ajaxHandleResponses( s, jqXHR, responses ) {\n\n        var ct, type, finalDataType, firstDataType,\n            contents = s.contents,\n            dataTypes = s.dataTypes;\n\n        // Remove auto dataType and get content-type in the process\n        while ( dataTypes[ 0 ] === \"*\" ) {\n            dataTypes.shift();\n            if ( ct === undefined ) {\n                ct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n            }\n        }\n\n        // Check if we're dealing with a known content-type\n        if ( ct ) {\n            for ( type in contents ) {\n                if ( contents[ type ] && contents[ type ].test( ct ) ) {\n                    dataTypes.unshift( type );\n                    break;\n                }\n            }\n        }\n\n        // Check to see if we have a response for the expected dataType\n        if ( dataTypes[ 0 ] in responses ) {\n            finalDataType = dataTypes[ 0 ];\n        } else {\n\n            // Try convertible dataTypes\n            for ( type in responses ) {\n                if ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n                    finalDataType = type;\n                    break;\n                }\n                if ( !firstDataType ) {\n                    firstDataType = type;\n                }\n            }\n\n            // Or just use first one\n            finalDataType = finalDataType || firstDataType;\n        }\n\n        // If we found a dataType\n        // We add the dataType to the list if needed\n        // and return the corresponding response\n        if ( finalDataType ) {\n            if ( finalDataType !== dataTypes[ 0 ] ) {\n                dataTypes.unshift( finalDataType );\n            }\n            return responses[ finalDataType ];\n        }\n    }\n\n    /* Chain conversions given the request and the original response\n     * Also sets the responseXXX fields on the jqXHR instance\n     */\n    function ajaxConvert( s, response, jqXHR, isSuccess ) {\n        var conv2, current, conv, tmp, prev,\n            converters = {},\n\n        // Work with a copy of dataTypes in case we need to modify it for conversion\n            dataTypes = s.dataTypes.slice();\n\n        // Create converters map with lowercased keys\n        if ( dataTypes[ 1 ] ) {\n            for ( conv in s.converters ) {\n                converters[ conv.toLowerCase() ] = s.converters[ conv ];\n            }\n        }\n\n        current = dataTypes.shift();\n\n        // Convert to each sequential dataType\n        while ( current ) {\n\n            if ( s.responseFields[ current ] ) {\n                jqXHR[ s.responseFields[ current ] ] = response;\n            }\n\n            // Apply the dataFilter if provided\n            if ( !prev && isSuccess && s.dataFilter ) {\n                response = s.dataFilter( response, s.dataType );\n            }\n\n            prev = current;\n            current = dataTypes.shift();\n\n            if ( current ) {\n\n                // There's only work to do if current dataType is non-auto\n                if ( current === \"*\" ) {\n\n                    current = prev;\n\n                    // Convert response if prev dataType is non-auto and differs from current\n                } else if ( prev !== \"*\" && prev !== current ) {\n\n                    // Seek a direct converter\n                    conv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n                    // If none found, seek a pair\n                    if ( !conv ) {\n                        for ( conv2 in converters ) {\n\n                            // If conv2 outputs current\n                            tmp = conv2.split( \" \" );\n                            if ( tmp[ 1 ] === current ) {\n\n                                // If prev can be converted to accepted input\n                                conv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n                                    converters[ \"* \" + tmp[ 0 ] ];\n                                if ( conv ) {\n\n                                    // Condense equivalence converters\n                                    if ( conv === true ) {\n                                        conv = converters[ conv2 ];\n\n                                        // Otherwise, insert the intermediate dataType\n                                    } else if ( converters[ conv2 ] !== true ) {\n                                        current = tmp[ 0 ];\n                                        dataTypes.unshift( tmp[ 1 ] );\n                                    }\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    // Apply converter (if not an equivalence)\n                    if ( conv !== true ) {\n\n                        // Unless errors are allowed to bubble, catch and return them\n                        if ( conv && s.throws ) {\n                            response = conv( response );\n                        } else {\n                            try {\n                                response = conv( response );\n                            } catch ( e ) {\n                                return {\n                                    state: \"parsererror\",\n                                    error: conv ? e : \"No conversion from \" + prev + \" to \" + current\n                                };\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        return { state: \"success\", data: response };\n    }\n\n    jQuery.extend( {\n\n        // Counter for holding the number of active queries\n        active: 0,\n\n        // Last-Modified header cache for next request\n        lastModified: {},\n        etag: {},\n\n        ajaxSettings: {\n            url: location.href,\n            type: \"GET\",\n            isLocal: rlocalProtocol.test( location.protocol ),\n            global: true,\n            processData: true,\n            async: true,\n            contentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n            /*\n             timeout: 0,\n             data: null,\n             dataType: null,\n             username: null,\n             password: null,\n             cache: null,\n             throws: false,\n             traditional: false,\n             headers: {},\n             */\n\n            accepts: {\n                \"*\": allTypes,\n                text: \"text/plain\",\n                html: \"text/html\",\n                xml: \"application/xml, text/xml\",\n                json: \"application/json, text/javascript\"\n            },\n\n            contents: {\n                xml: /\\bxml\\b/,\n                html: /\\bhtml/,\n                json: /\\bjson\\b/\n            },\n\n            responseFields: {\n                xml: \"responseXML\",\n                text: \"responseText\",\n                json: \"responseJSON\"\n            },\n\n            // Data converters\n            // Keys separate source (or catchall \"*\") and destination types with a single space\n            converters: {\n\n                // Convert anything to text\n                \"* text\": String,\n\n                // Text to html (true = no transformation)\n                \"text html\": true,\n\n                // Evaluate text as a json expression\n                \"text json\": JSON.parse,\n\n                // Parse text as xml\n                \"text xml\": jQuery.parseXML\n            },\n\n            // For options that shouldn't be deep extended:\n            // you can add your own custom options here if\n            // and when you create one that shouldn't be\n            // deep extended (see ajaxExtend)\n            flatOptions: {\n                url: true,\n                context: true\n            }\n        },\n\n        // Creates a full fledged settings object into target\n        // with both ajaxSettings and settings fields.\n        // If target is omitted, writes into ajaxSettings.\n        ajaxSetup: function( target, settings ) {\n            return settings ?\n\n                // Building a settings object\n                ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n                // Extending ajaxSettings\n                ajaxExtend( jQuery.ajaxSettings, target );\n        },\n\n        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n        ajaxTransport: addToPrefiltersOrTransports( transports ),\n\n        // Main method\n        ajax: function( url, options ) {\n\n            // If url is an object, simulate pre-1.5 signature\n            if ( typeof url === \"object\" ) {\n                options = url;\n                url = undefined;\n            }\n\n            // Force options to be an object\n            options = options || {};\n\n            var transport,\n\n            // URL without anti-cache param\n                cacheURL,\n\n            // Response headers\n                responseHeadersString,\n                responseHeaders,\n\n            // timeout handle\n                timeoutTimer,\n\n            // Url cleanup var\n                urlAnchor,\n\n            // Request state (becomes false upon send and true upon completion)\n                completed,\n\n            // To know if global events are to be dispatched\n                fireGlobals,\n\n            // Loop variable\n                i,\n\n            // uncached part of the url\n                uncached,\n\n            // Create the final options object\n                s = jQuery.ajaxSetup( {}, options ),\n\n            // Callbacks context\n                callbackContext = s.context || s,\n\n            // Context for global events is callbackContext if it is a DOM node or jQuery collection\n                globalEventContext = s.context &&\n                ( callbackContext.nodeType || callbackContext.jquery ) ?\n                    jQuery( callbackContext ) :\n                    jQuery.event,\n\n            // Deferreds\n                deferred = jQuery.Deferred(),\n                completeDeferred = jQuery.Callbacks( \"once memory\" ),\n\n            // Status-dependent callbacks\n                statusCode = s.statusCode || {},\n\n            // Headers (they are sent all at once)\n                requestHeaders = {},\n                requestHeadersNames = {},\n\n            // Default abort message\n                strAbort = \"canceled\",\n\n            // Fake xhr\n                jqXHR = {\n                    readyState: 0,\n\n                    // Builds headers hashtable if needed\n                    getResponseHeader: function( key ) {\n                        var match;\n                        if ( completed ) {\n                            if ( !responseHeaders ) {\n                                responseHeaders = {};\n                                while ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n                                    responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n                                }\n                            }\n                            match = responseHeaders[ key.toLowerCase() ];\n                        }\n                        return match == null ? null : match;\n                    },\n\n                    // Raw string\n                    getAllResponseHeaders: function() {\n                        return completed ? responseHeadersString : null;\n                    },\n\n                    // Caches the header\n                    setRequestHeader: function( name, value ) {\n                        if ( completed == null ) {\n                            name = requestHeadersNames[ name.toLowerCase() ] =\n                                requestHeadersNames[ name.toLowerCase() ] || name;\n                            requestHeaders[ name ] = value;\n                        }\n                        return this;\n                    },\n\n                    // Overrides response content-type header\n                    overrideMimeType: function( type ) {\n                        if ( completed == null ) {\n                            s.mimeType = type;\n                        }\n                        return this;\n                    },\n\n                    // Status-dependent callbacks\n                    statusCode: function( map ) {\n                        var code;\n                        if ( map ) {\n                            if ( completed ) {\n\n                                // Execute the appropriate callbacks\n                                jqXHR.always( map[ jqXHR.status ] );\n                            } else {\n\n                                // Lazy-add the new callbacks in a way that preserves old ones\n                                for ( code in map ) {\n                                    statusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n                                }\n                            }\n                        }\n                        return this;\n                    },\n\n                    // Cancel the request\n                    abort: function( statusText ) {\n                        var finalText = statusText || strAbort;\n                        if ( transport ) {\n                            transport.abort( finalText );\n                        }\n                        done( 0, finalText );\n                        return this;\n                    }\n                };\n\n            // Attach deferreds\n            deferred.promise( jqXHR );\n\n            // Add protocol if not provided (prefilters might expect it)\n            // Handle falsy url in the settings object (#10093: consistency with old signature)\n            // We also use the url parameter if available\n            s.url = ( ( url || s.url || location.href ) + \"\" )\n                .replace( rprotocol, location.protocol + \"//\" );\n\n            // Alias method option to type as per ticket #12004\n            s.type = options.method || options.type || s.method || s.type;\n\n            // Extract dataTypes list\n            s.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n            // A cross-domain request is in order when the origin doesn't match the current origin.\n            if ( s.crossDomain == null ) {\n                urlAnchor = document.createElement( \"a\" );\n\n                // Support: IE <=8 - 11, Edge 12 - 15\n                // IE throws exception on accessing the href property if url is malformed,\n                // e.g. http://example.com:80x/\n                try {\n                    urlAnchor.href = s.url;\n\n                    // Support: IE <=8 - 11 only\n                    // Anchor's host property isn't correctly set when s.url is relative\n                    urlAnchor.href = urlAnchor.href;\n                    s.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n                        urlAnchor.protocol + \"//\" + urlAnchor.host;\n                } catch ( e ) {\n\n                    // If there is an error parsing the URL, assume it is crossDomain,\n                    // it can be rejected by the transport if it is invalid\n                    s.crossDomain = true;\n                }\n            }\n\n            // Convert data if not already a string\n            if ( s.data && s.processData && typeof s.data !== \"string\" ) {\n                s.data = jQuery.param( s.data, s.traditional );\n            }\n\n            // Apply prefilters\n            inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n            // If request was aborted inside a prefilter, stop there\n            if ( completed ) {\n                return jqXHR;\n            }\n\n            // We can fire global events as of now if asked to\n            // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n            fireGlobals = jQuery.event && s.global;\n\n            // Watch for a new set of requests\n            if ( fireGlobals && jQuery.active++ === 0 ) {\n                jQuery.event.trigger( \"ajaxStart\" );\n            }\n\n            // Uppercase the type\n            s.type = s.type.toUpperCase();\n\n            // Determine if request has content\n            s.hasContent = !rnoContent.test( s.type );\n\n            // Save the URL in case we're toying with the If-Modified-Since\n            // and/or If-None-Match header later on\n            // Remove hash to simplify url manipulation\n            cacheURL = s.url.replace( rhash, \"\" );\n\n            // More options handling for requests with no content\n            if ( !s.hasContent ) {\n\n                // Remember the hash so we can put it back\n                uncached = s.url.slice( cacheURL.length );\n\n                // If data is available and should be processed, append data to url\n                if ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n                    cacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n                    // #9682: remove data so that it's not used in an eventual retry\n                    delete s.data;\n                }\n\n                // Add or update anti-cache param if needed\n                if ( s.cache === false ) {\n                    cacheURL = cacheURL.replace( rantiCache, \"$1\" );\n                    uncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n                }\n\n                // Put hash and anti-cache on the URL that will be requested (gh-1732)\n                s.url = cacheURL + uncached;\n\n                // Change '%20' to '+' if this is encoded form body content (gh-2658)\n            } else if ( s.data && s.processData &&\n                ( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n                s.data = s.data.replace( r20, \"+\" );\n            }\n\n            // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n            if ( s.ifModified ) {\n                if ( jQuery.lastModified[ cacheURL ] ) {\n                    jqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n                }\n                if ( jQuery.etag[ cacheURL ] ) {\n                    jqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n                }\n            }\n\n            // Set the correct header, if data is being sent\n            if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n                jqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n            }\n\n            // Set the Accepts header for the server, depending on the dataType\n            jqXHR.setRequestHeader(\n                \"Accept\",\n                s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n                s.accepts[ s.dataTypes[ 0 ] ] +\n                ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n                    s.accepts[ \"*\" ]\n            );\n\n            // Check for headers option\n            for ( i in s.headers ) {\n                jqXHR.setRequestHeader( i, s.headers[ i ] );\n            }\n\n            // Allow custom headers/mimetypes and early abort\n            if ( s.beforeSend &&\n                ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n                // Abort if not done already and return\n                return jqXHR.abort();\n            }\n\n            // Aborting is no longer a cancellation\n            strAbort = \"abort\";\n\n            // Install callbacks on deferreds\n            completeDeferred.add( s.complete );\n            jqXHR.done( s.success );\n            jqXHR.fail( s.error );\n\n            // Get transport\n            transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n            // If no transport, we auto-abort\n            if ( !transport ) {\n                done( -1, \"No Transport\" );\n            } else {\n                jqXHR.readyState = 1;\n\n                // Send global event\n                if ( fireGlobals ) {\n                    globalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n                }\n\n                // If request was aborted inside ajaxSend, stop there\n                if ( completed ) {\n                    return jqXHR;\n                }\n\n                // Timeout\n                if ( s.async && s.timeout > 0 ) {\n                    timeoutTimer = window.setTimeout( function() {\n                        jqXHR.abort( \"timeout\" );\n                    }, s.timeout );\n                }\n\n                try {\n                    completed = false;\n                    transport.send( requestHeaders, done );\n                } catch ( e ) {\n\n                    // Rethrow post-completion exceptions\n                    if ( completed ) {\n                        throw e;\n                    }\n\n                    // Propagate others as results\n                    done( -1, e );\n                }\n            }\n\n            // Callback for when everything is done\n            function done( status, nativeStatusText, responses, headers ) {\n                var isSuccess, success, error, response, modified,\n                    statusText = nativeStatusText;\n\n                // Ignore repeat invocations\n                if ( completed ) {\n                    return;\n                }\n\n                completed = true;\n\n                // Clear timeout if it exists\n                if ( timeoutTimer ) {\n                    window.clearTimeout( timeoutTimer );\n                }\n\n                // Dereference transport for early garbage collection\n                // (no matter how long the jqXHR object will be used)\n                transport = undefined;\n\n                // Cache response headers\n                responseHeadersString = headers || \"\";\n\n                // Set readyState\n                jqXHR.readyState = status > 0 ? 4 : 0;\n\n                // Determine if successful\n                isSuccess = status >= 200 && status < 300 || status === 304;\n\n                // Get response data\n                if ( responses ) {\n                    response = ajaxHandleResponses( s, jqXHR, responses );\n                }\n\n                // Convert no matter what (that way responseXXX fields are always set)\n                response = ajaxConvert( s, response, jqXHR, isSuccess );\n\n                // If successful, handle type chaining\n                if ( isSuccess ) {\n\n                    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n                    if ( s.ifModified ) {\n                        modified = jqXHR.getResponseHeader( \"Last-Modified\" );\n                        if ( modified ) {\n                            jQuery.lastModified[ cacheURL ] = modified;\n                        }\n                        modified = jqXHR.getResponseHeader( \"etag\" );\n                        if ( modified ) {\n                            jQuery.etag[ cacheURL ] = modified;\n                        }\n                    }\n\n                    // if no content\n                    if ( status === 204 || s.type === \"HEAD\" ) {\n                        statusText = \"nocontent\";\n\n                        // if not modified\n                    } else if ( status === 304 ) {\n                        statusText = \"notmodified\";\n\n                        // If we have data, let's convert it\n                    } else {\n                        statusText = response.state;\n                        success = response.data;\n                        error = response.error;\n                        isSuccess = !error;\n                    }\n                } else {\n\n                    // Extract error from statusText and normalize for non-aborts\n                    error = statusText;\n                    if ( status || !statusText ) {\n                        statusText = \"error\";\n                        if ( status < 0 ) {\n                            status = 0;\n                        }\n                    }\n                }\n\n                // Set data for the fake xhr object\n                jqXHR.status = status;\n                jqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n                // Success/Error\n                if ( isSuccess ) {\n                    deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n                } else {\n                    deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n                }\n\n                // Status-dependent callbacks\n                jqXHR.statusCode( statusCode );\n                statusCode = undefined;\n\n                if ( fireGlobals ) {\n                    globalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n                        [ jqXHR, s, isSuccess ? success : error ] );\n                }\n\n                // Complete\n                completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n                if ( fireGlobals ) {\n                    globalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n                    // Handle the global AJAX counter\n                    if ( !( --jQuery.active ) ) {\n                        jQuery.event.trigger( \"ajaxStop\" );\n                    }\n                }\n            }\n\n            return jqXHR;\n        },\n\n        getJSON: function( url, data, callback ) {\n            return jQuery.get( url, data, callback, \"json\" );\n        },\n\n        getScript: function( url, callback ) {\n            return jQuery.get( url, undefined, callback, \"script\" );\n        }\n    } );\n\n    jQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n        jQuery[ method ] = function( url, data, callback, type ) {\n\n            // Shift arguments if data argument was omitted\n            if ( isFunction( data ) ) {\n                type = type || callback;\n                callback = data;\n                data = undefined;\n            }\n\n            // The url can be an options object (which then must have .url)\n            return jQuery.ajax( jQuery.extend( {\n                url: url,\n                type: method,\n                dataType: type,\n                data: data,\n                success: callback\n            }, jQuery.isPlainObject( url ) && url ) );\n        };\n    } );\n\n\n    jQuery._evalUrl = function( url ) {\n        return jQuery.ajax( {\n            url: url,\n\n            // Make this explicit, since user can override this through ajaxSetup (#11264)\n            type: \"GET\",\n            dataType: \"script\",\n            cache: true,\n            async: false,\n            global: false,\n            \"throws\": true\n        } );\n    };\n\n\n    jQuery.fn.extend( {\n        wrapAll: function( html ) {\n            var wrap;\n\n            if ( this[ 0 ] ) {\n                if ( isFunction( html ) ) {\n                    html = html.call( this[ 0 ] );\n                }\n\n                // The elements to wrap the target around\n                wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n                if ( this[ 0 ].parentNode ) {\n                    wrap.insertBefore( this[ 0 ] );\n                }\n\n                wrap.map( function() {\n                    var elem = this;\n\n                    while ( elem.firstElementChild ) {\n                        elem = elem.firstElementChild;\n                    }\n\n                    return elem;\n                } ).append( this );\n            }\n\n            return this;\n        },\n\n        wrapInner: function( html ) {\n            if ( isFunction( html ) ) {\n                return this.each( function( i ) {\n                    jQuery( this ).wrapInner( html.call( this, i ) );\n                } );\n            }\n\n            return this.each( function() {\n                var self = jQuery( this ),\n                    contents = self.contents();\n\n                if ( contents.length ) {\n                    contents.wrapAll( html );\n\n                } else {\n                    self.append( html );\n                }\n            } );\n        },\n\n        wrap: function( html ) {\n            var htmlIsFunction = isFunction( html );\n\n            return this.each( function( i ) {\n                jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n            } );\n        },\n\n        unwrap: function( selector ) {\n            this.parent( selector ).not( \"body\" ).each( function() {\n                jQuery( this ).replaceWith( this.childNodes );\n            } );\n            return this;\n        }\n    } );\n\n\n    jQuery.expr.pseudos.hidden = function( elem ) {\n        return !jQuery.expr.pseudos.visible( elem );\n    };\n    jQuery.expr.pseudos.visible = function( elem ) {\n        return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n    };\n\n\n\n\n    jQuery.ajaxSettings.xhr = function() {\n        try {\n            return new window.XMLHttpRequest();\n        } catch ( e ) {}\n    };\n\n    var xhrSuccessStatus = {\n\n            // File protocol always yields status code 0, assume 200\n            0: 200,\n\n            // Support: IE <=9 only\n            // #1450: sometimes IE returns 1223 when it should be 204\n            1223: 204\n        },\n        xhrSupported = jQuery.ajaxSettings.xhr();\n\n    support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\n    support.ajax = xhrSupported = !!xhrSupported;\n\n    jQuery.ajaxTransport( function( options ) {\n        var callback, errorCallback;\n\n        // Cross domain only allowed if supported through XMLHttpRequest\n        if ( support.cors || xhrSupported && !options.crossDomain ) {\n            return {\n                send: function( headers, complete ) {\n                    var i,\n                        xhr = options.xhr();\n\n                    xhr.open(\n                        options.type,\n                        options.url,\n                        options.async,\n                        options.username,\n                        options.password\n                    );\n\n                    // Apply custom fields if provided\n                    if ( options.xhrFields ) {\n                        for ( i in options.xhrFields ) {\n                            xhr[ i ] = options.xhrFields[ i ];\n                        }\n                    }\n\n                    // Override mime type if needed\n                    if ( options.mimeType && xhr.overrideMimeType ) {\n                        xhr.overrideMimeType( options.mimeType );\n                    }\n\n                    // X-Requested-With header\n                    // For cross-domain requests, seeing as conditions for a preflight are\n                    // akin to a jigsaw puzzle, we simply never set it to be sure.\n                    // (it can always be set on a per-request basis or even using ajaxSetup)\n                    // For same-domain requests, won't change header if already provided.\n                    if ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n                        headers[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n                    }\n\n                    // Set headers\n                    for ( i in headers ) {\n                        xhr.setRequestHeader( i, headers[ i ] );\n                    }\n\n                    // Callback\n                    callback = function( type ) {\n                        return function() {\n                            if ( callback ) {\n                                callback = errorCallback = xhr.onload =\n                                    xhr.onerror = xhr.onabort = xhr.ontimeout =\n                                        xhr.onreadystatechange = null;\n\n                                if ( type === \"abort\" ) {\n                                    xhr.abort();\n                                } else if ( type === \"error\" ) {\n\n                                    // Support: IE <=9 only\n                                    // On a manual native abort, IE9 throws\n                                    // errors on any property access that is not readyState\n                                    if ( typeof xhr.status !== \"number\" ) {\n                                        complete( 0, \"error\" );\n                                    } else {\n                                        complete(\n\n                                            // File: protocol always yields status 0; see #8605, #14207\n                                            xhr.status,\n                                            xhr.statusText\n                                        );\n                                    }\n                                } else {\n                                    complete(\n                                        xhrSuccessStatus[ xhr.status ] || xhr.status,\n                                        xhr.statusText,\n\n                                        // Support: IE <=9 only\n                                        // IE9 has no XHR2 but throws on binary (trac-11426)\n                                        // For XHR2 non-text, let the caller handle it (gh-2498)\n                                        ( xhr.responseType || \"text\" ) !== \"text\"  ||\n                                        typeof xhr.responseText !== \"string\" ?\n                                        { binary: xhr.response } :\n                                        { text: xhr.responseText },\n                                        xhr.getAllResponseHeaders()\n                                    );\n                                }\n                            }\n                        };\n                    };\n\n                    // Listen to events\n                    xhr.onload = callback();\n                    errorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n                    // Support: IE 9 only\n                    // Use onreadystatechange to replace onabort\n                    // to handle uncaught aborts\n                    if ( xhr.onabort !== undefined ) {\n                        xhr.onabort = errorCallback;\n                    } else {\n                        xhr.onreadystatechange = function() {\n\n                            // Check readyState before timeout as it changes\n                            if ( xhr.readyState === 4 ) {\n\n                                // Allow onerror to be called first,\n                                // but that will not handle a native abort\n                                // Also, save errorCallback to a variable\n                                // as xhr.onerror cannot be accessed\n                                window.setTimeout( function() {\n                                    if ( callback ) {\n                                        errorCallback();\n                                    }\n                                } );\n                            }\n                        };\n                    }\n\n                    // Create the abort callback\n                    callback = callback( \"abort\" );\n\n                    try {\n\n                        // Do send the request (this may raise an exception)\n                        xhr.send( options.hasContent && options.data || null );\n                    } catch ( e ) {\n\n                        // #14683: Only rethrow if this hasn't been notified as an error yet\n                        if ( callback ) {\n                            throw e;\n                        }\n                    }\n                },\n\n                abort: function() {\n                    if ( callback ) {\n                        callback();\n                    }\n                }\n            };\n        }\n    } );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\n    jQuery.ajaxPrefilter( function( s ) {\n        if ( s.crossDomain ) {\n            s.contents.script = false;\n        }\n    } );\n\n// Install script dataType\n    jQuery.ajaxSetup( {\n        accepts: {\n            script: \"text/javascript, application/javascript, \" +\n            \"application/ecmascript, application/x-ecmascript\"\n        },\n        contents: {\n            script: /\\b(?:java|ecma)script\\b/\n        },\n        converters: {\n            \"text script\": function( text ) {\n                jQuery.globalEval( text );\n                return text;\n            }\n        }\n    } );\n\n// Handle cache's special case and crossDomain\n    jQuery.ajaxPrefilter( \"script\", function( s ) {\n        if ( s.cache === undefined ) {\n            s.cache = false;\n        }\n        if ( s.crossDomain ) {\n            s.type = \"GET\";\n        }\n    } );\n\n// Bind script tag hack transport\n    jQuery.ajaxTransport( \"script\", function( s ) {\n\n        // This transport only deals with cross domain requests\n        if ( s.crossDomain ) {\n            var script, callback;\n            return {\n                send: function( _, complete ) {\n                    script = jQuery( \"<script>\" ).prop( {\n                        charset: s.scriptCharset,\n                        src: s.url\n                    } ).on(\n                        \"load error\",\n                        callback = function( evt ) {\n                            script.remove();\n                            callback = null;\n                            if ( evt ) {\n                                complete( evt.type === \"error\" ? 404 : 200, evt.type );\n                            }\n                        }\n                    );\n\n                    // Use native DOM manipulation to avoid our domManip AJAX trickery\n                    document.head.appendChild( script[ 0 ] );\n                },\n                abort: function() {\n                    if ( callback ) {\n                        callback();\n                    }\n                }\n            };\n        }\n    } );\n\n\n\n\n    var oldCallbacks = [],\n        rjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\n    jQuery.ajaxSetup( {\n        jsonp: \"callback\",\n        jsonpCallback: function() {\n            var callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n            this[ callback ] = true;\n            return callback;\n        }\n    } );\n\n// Detect, normalize options and install callbacks for jsonp requests\n    jQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n        var callbackName, overwritten, responseContainer,\n            jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n                        \"url\" :\n                    typeof s.data === \"string\" &&\n                    ( s.contentType || \"\" )\n                        .indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n                    rjsonp.test( s.data ) && \"data\"\n                );\n\n        // Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n        if ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n            // Get callback name, remembering preexisting value associated with it\n            callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n                s.jsonpCallback() :\n                s.jsonpCallback;\n\n            // Insert callback into url or form data\n            if ( jsonProp ) {\n                s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n            } else if ( s.jsonp !== false ) {\n                s.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n            }\n\n            // Use data converter to retrieve json after script execution\n            s.converters[ \"script json\" ] = function() {\n                if ( !responseContainer ) {\n                    jQuery.error( callbackName + \" was not called\" );\n                }\n                return responseContainer[ 0 ];\n            };\n\n            // Force json dataType\n            s.dataTypes[ 0 ] = \"json\";\n\n            // Install callback\n            overwritten = window[ callbackName ];\n            window[ callbackName ] = function() {\n                responseContainer = arguments;\n            };\n\n            // Clean-up function (fires after converters)\n            jqXHR.always( function() {\n\n                // If previous value didn't exist - remove it\n                if ( overwritten === undefined ) {\n                    jQuery( window ).removeProp( callbackName );\n\n                    // Otherwise restore preexisting value\n                } else {\n                    window[ callbackName ] = overwritten;\n                }\n\n                // Save back as free\n                if ( s[ callbackName ] ) {\n\n                    // Make sure that re-using the options doesn't screw things around\n                    s.jsonpCallback = originalSettings.jsonpCallback;\n\n                    // Save the callback name for future use\n                    oldCallbacks.push( callbackName );\n                }\n\n                // Call if it was a function and we have a response\n                if ( responseContainer && isFunction( overwritten ) ) {\n                    overwritten( responseContainer[ 0 ] );\n                }\n\n                responseContainer = overwritten = undefined;\n            } );\n\n            // Delegate to script\n            return \"script\";\n        }\n    } );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\n    support.createHTMLDocument = ( function() {\n        var body = document.implementation.createHTMLDocument( \"\" ).body;\n        body.innerHTML = \"<form></form><form></form>\";\n        return body.childNodes.length === 2;\n    } )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\n    jQuery.parseHTML = function( data, context, keepScripts ) {\n        if ( typeof data !== \"string\" ) {\n            return [];\n        }\n        if ( typeof context === \"boolean\" ) {\n            keepScripts = context;\n            context = false;\n        }\n\n        var base, parsed, scripts;\n\n        if ( !context ) {\n\n            // Stop scripts or inline event handlers from being executed immediately\n            // by using document.implementation\n            if ( support.createHTMLDocument ) {\n                context = document.implementation.createHTMLDocument( \"\" );\n\n                // Set the base href for the created document\n                // so any parsed elements with URLs\n                // are based on the document's URL (gh-2965)\n                base = context.createElement( \"base\" );\n                base.href = document.location.href;\n                context.head.appendChild( base );\n            } else {\n                context = document;\n            }\n        }\n\n        parsed = rsingleTag.exec( data );\n        scripts = !keepScripts && [];\n\n        // Single tag\n        if ( parsed ) {\n            return [ context.createElement( parsed[ 1 ] ) ];\n        }\n\n        parsed = buildFragment( [ data ], context, scripts );\n\n        if ( scripts && scripts.length ) {\n            jQuery( scripts ).remove();\n        }\n\n        return jQuery.merge( [], parsed.childNodes );\n    };\n\n\n    /**\n     * Load a url into a pages\n     */\n    jQuery.fn.load = function( url, params, callback ) {\n        var selector, type, response,\n            self = this,\n            off = url.indexOf( \" \" );\n\n        if ( off > -1 ) {\n            selector = stripAndCollapse( url.slice( off ) );\n            url = url.slice( 0, off );\n        }\n\n        // If it's a function\n        if ( isFunction( params ) ) {\n\n            // We assume that it's the callback\n            callback = params;\n            params = undefined;\n\n            // Otherwise, build a param string\n        } else if ( params && typeof params === \"object\" ) {\n            type = \"POST\";\n        }\n\n        // If we have elements to modify, make the request\n        if ( self.length > 0 ) {\n            jQuery.ajax( {\n                url: url,\n\n                // If \"type\" variable is undefined, then \"GET\" method will be used.\n                // Make value of this field explicit since\n                // user can override it through ajaxSetup method\n                type: type || \"GET\",\n                dataType: \"html\",\n                data: params\n            } ).done( function( responseText ) {\n\n                // Save response for use in complete callback\n                response = arguments;\n\n                self.html( selector ?\n\n                    // If a selector was specified, locate the right elements in a dummy div\n                    // Exclude scripts to avoid IE 'Permission Denied' errors\n                    jQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n                    // Otherwise use the full result\n                    responseText );\n\n                // If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n                // but they are ignored because response was set above.\n                // If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n            } ).always( callback && function( jqXHR, status ) {\n                    self.each( function() {\n                        callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n                    } );\n                } );\n        }\n\n        return this;\n    };\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\n    jQuery.each( [\n        \"ajaxStart\",\n        \"ajaxStop\",\n        \"ajaxComplete\",\n        \"ajaxError\",\n        \"ajaxSuccess\",\n        \"ajaxSend\"\n    ], function( i, type ) {\n        jQuery.fn[ type ] = function( fn ) {\n            return this.on( type, fn );\n        };\n    } );\n\n\n\n\n    jQuery.expr.pseudos.animated = function( elem ) {\n        return jQuery.grep( jQuery.timers, function( fn ) {\n            return elem === fn.elem;\n        } ).length;\n    };\n\n\n\n\n    jQuery.offset = {\n        setOffset: function( elem, options, i ) {\n            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n                position = jQuery.css( elem, \"position\" ),\n                curElem = jQuery( elem ),\n                props = {};\n\n            // Set position first, in-case top/left are set even on static elem\n            if ( position === \"static\" ) {\n                elem.style.position = \"relative\";\n            }\n\n            curOffset = curElem.offset();\n            curCSSTop = jQuery.css( elem, \"top\" );\n            curCSSLeft = jQuery.css( elem, \"left\" );\n            calculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n                ( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n            // Need to be able to calculate position if either\n            // top or left is auto and position is either absolute or fixed\n            if ( calculatePosition ) {\n                curPosition = curElem.position();\n                curTop = curPosition.top;\n                curLeft = curPosition.left;\n\n            } else {\n                curTop = parseFloat( curCSSTop ) || 0;\n                curLeft = parseFloat( curCSSLeft ) || 0;\n            }\n\n            if ( isFunction( options ) ) {\n\n                // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n                options = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n            }\n\n            if ( options.top != null ) {\n                props.top = ( options.top - curOffset.top ) + curTop;\n            }\n            if ( options.left != null ) {\n                props.left = ( options.left - curOffset.left ) + curLeft;\n            }\n\n            if ( \"using\" in options ) {\n                options.using.call( elem, props );\n\n            } else {\n                curElem.css( props );\n            }\n        }\n    };\n\n    jQuery.fn.extend( {\n\n        // offset() relates an element's border box to the document origin\n        offset: function( options ) {\n\n            // Preserve chaining for setter\n            if ( arguments.length ) {\n                return options === undefined ?\n                    this :\n                    this.each( function( i ) {\n                        jQuery.offset.setOffset( this, options, i );\n                    } );\n            }\n\n            var rect, win,\n                elem = this[ 0 ];\n\n            if ( !elem ) {\n                return;\n            }\n\n            // Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n            // Support: IE <=11 only\n            // Running getBoundingClientRect on a\n            // disconnected node in IE throws an error\n            if ( !elem.getClientRects().length ) {\n                return { top: 0, left: 0 };\n            }\n\n            // Get document-relative position by adding viewport scroll to viewport-relative gBCR\n            rect = elem.getBoundingClientRect();\n            win = elem.ownerDocument.defaultView;\n            return {\n                top: rect.top + win.pageYOffset,\n                left: rect.left + win.pageXOffset\n            };\n        },\n\n        // position() relates an element's margin box to its offset parent's padding box\n        // This corresponds to the behavior of CSS absolute positioning\n        position: function() {\n            if ( !this[ 0 ] ) {\n                return;\n            }\n\n            var offsetParent, offset, doc,\n                elem = this[ 0 ],\n                parentOffset = { top: 0, left: 0 };\n\n            // position:fixed elements are offset from the viewport, which itself always has zero offset\n            if ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n                // Assume position:fixed implies availability of getBoundingClientRect\n                offset = elem.getBoundingClientRect();\n\n            } else {\n                offset = this.offset();\n\n                // Account for the *real* offset parent, which can be the document or its root element\n                // when a statically positioned element is identified\n                doc = elem.ownerDocument;\n                offsetParent = elem.offsetParent || doc.documentElement;\n                while ( offsetParent &&\n                ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n                jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n                    offsetParent = offsetParent.parentNode;\n                }\n                if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n                    // Incorporate borders into its offset, since they are outside its content origin\n                    parentOffset = jQuery( offsetParent ).offset();\n                    parentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n                    parentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n                }\n            }\n\n            // Subtract parent offsets and element margins\n            return {\n                top: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n                left: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n            };\n        },\n\n        // This method will return documentElement in the following cases:\n        // 1) For the element inside the iframe without offsetParent, this method will return\n        //    documentElement of the parent window\n        // 2) For the hidden or detached element\n        // 3) For body or html element, i.e. in case of the html node - it will return itself\n        //\n        // but those exceptions were never presented as a real life use-cases\n        // and might be considered as more preferable results.\n        //\n        // This logic, however, is not guaranteed and can change at any point in the future\n        offsetParent: function() {\n            return this.map( function() {\n                var offsetParent = this.offsetParent;\n\n                while ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n                    offsetParent = offsetParent.offsetParent;\n                }\n\n                return offsetParent || documentElement;\n            } );\n        }\n    } );\n\n// Create scrollLeft and scrollTop methods\n    jQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n        var top = \"pageYOffset\" === prop;\n\n        jQuery.fn[ method ] = function( val ) {\n            return access( this, function( elem, method, val ) {\n\n                // Coalesce documents and windows\n                var win;\n                if ( isWindow( elem ) ) {\n                    win = elem;\n                } else if ( elem.nodeType === 9 ) {\n                    win = elem.defaultView;\n                }\n\n                if ( val === undefined ) {\n                    return win ? win[ prop ] : elem[ method ];\n                }\n\n                if ( win ) {\n                    win.scrollTo(\n                        !top ? val : win.pageXOffset,\n                        top ? val : win.pageYOffset\n                    );\n\n                } else {\n                    elem[ method ] = val;\n                }\n            }, method, val, arguments.length );\n        };\n    } );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\n    jQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n            function( elem, computed ) {\n                if ( computed ) {\n                    computed = curCSS( elem, prop );\n\n                    // If curCSS returns percentage, fallback to offset\n                    return rnumnonpx.test( computed ) ?\n                    jQuery( elem ).position()[ prop ] + \"px\" :\n                        computed;\n                }\n            }\n        );\n    } );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\n    jQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n        jQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n            function( defaultExtra, funcName ) {\n\n                // Margin is only for outerHeight, outerWidth\n                jQuery.fn[ funcName ] = function( margin, value ) {\n                    var chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n                        extra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n                    return access( this, function( elem, type, value ) {\n                        var doc;\n\n                        if ( isWindow( elem ) ) {\n\n                            // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n                            return funcName.indexOf( \"outer\" ) === 0 ?\n                                elem[ \"inner\" + name ] :\n                                elem.document.documentElement[ \"client\" + name ];\n                        }\n\n                        // Get document width or height\n                        if ( elem.nodeType === 9 ) {\n                            doc = elem.documentElement;\n\n                            // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n                            // whichever is greatest\n                            return Math.max(\n                                elem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n                                elem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n                                doc[ \"client\" + name ]\n                            );\n                        }\n\n                        return value === undefined ?\n\n                            // Get width or height on the element, requesting but not forcing parseFloat\n                            jQuery.css( elem, type, extra ) :\n\n                            // Set width or height on the element\n                            jQuery.style( elem, type, value, extra );\n                    }, type, chainable ? margin : undefined, chainable );\n                };\n            } );\n    } );\n\n\n    jQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n        \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n        \"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n        function( i, name ) {\n\n            // Handle event binding\n            jQuery.fn[ name ] = function( data, fn ) {\n                return arguments.length > 0 ?\n                    this.on( name, null, data, fn ) :\n                    this.trigger( name );\n            };\n        } );\n\n    jQuery.fn.extend( {\n        hover: function( fnOver, fnOut ) {\n            return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n        }\n    } );\n\n\n\n\n    jQuery.fn.extend( {\n\n        bind: function( types, data, fn ) {\n            return this.on( types, null, data, fn );\n        },\n        unbind: function( types, fn ) {\n            return this.off( types, null, fn );\n        },\n\n        delegate: function( selector, types, data, fn ) {\n            return this.on( types, selector, data, fn );\n        },\n        undelegate: function( selector, types, fn ) {\n\n            // ( namespace ) or ( selector, types [, fn] )\n            return arguments.length === 1 ?\n                this.off( selector, \"**\" ) :\n                this.off( types, selector || \"**\", fn );\n        }\n    } );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\n    jQuery.proxy = function( fn, context ) {\n        var tmp, args, proxy;\n\n        if ( typeof context === \"string\" ) {\n            tmp = fn[ context ];\n            context = fn;\n            fn = tmp;\n        }\n\n        // Quick check to determine if target is callable, in the spec\n        // this throws a TypeError, but we will just return undefined.\n        if ( !isFunction( fn ) ) {\n            return undefined;\n        }\n\n        // Simulated bind\n        args = slice.call( arguments, 2 );\n        proxy = function() {\n            return fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n        };\n\n        // Set the guid of unique handler to the same of original handler, so it can be removed\n        proxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n        return proxy;\n    };\n\n    jQuery.holdReady = function( hold ) {\n        if ( hold ) {\n            jQuery.readyWait++;\n        } else {\n            jQuery.ready( true );\n        }\n    };\n    jQuery.isArray = Array.isArray;\n    jQuery.parseJSON = JSON.parse;\n    jQuery.nodeName = nodeName;\n    jQuery.isFunction = isFunction;\n    jQuery.isWindow = isWindow;\n    jQuery.camelCase = camelCase;\n    jQuery.type = toType;\n\n    jQuery.now = Date.now;\n\n    jQuery.isNumeric = function( obj ) {\n\n        // As of jQuery 3.0, isNumeric is limited to\n        // strings and numbers (primitives or objects)\n        // that can be coerced to finite numbers (gh-2662)\n        var type = jQuery.type( obj );\n        return ( type === \"number\" || type === \"string\" ) &&\n\n            // parseFloat NaNs numeric-cast false positives (\"\")\n            // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n            // subtraction forces infinities to NaN\n            !isNaN( obj - parseFloat( obj ) );\n    };\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\n    if ( typeof define === \"function\" && define.amd ) {\n        define( \"jquery\", [], function() {\n            return jQuery;\n        } );\n    }\n\n\n\n\n    var\n\n    // Map over jQuery in case of overwrite\n        _jQuery = window.jQuery,\n\n    // Map over the $ in case of overwrite\n        _$ = window.$;\n\n    jQuery.noConflict = function( deep ) {\n        if ( window.$ === jQuery ) {\n            window.$ = _$;\n        }\n\n        if ( deep && window.jQuery === jQuery ) {\n            window.jQuery = _jQuery;\n        }\n\n        return jQuery;\n    };\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\n    if ( !noGlobal ) {\n        window.jQuery = window.$ = jQuery;\n    }\n    return jQuery;\n} );"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/jquery/jquery.history.js",
    "content": "/*\n * jQuery history plugin\n * \n * The MIT License\n * \n * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)\n * Copyright (c) 2010 Takayuki Miwa\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(function($) {\n    var locationWrapper = {\n        put: function(hash, win) {\n            (win || window).location.hash = this.encoder(hash);\n        },\n        get: function(win) {\n            var hash = ((win || window).location.hash).replace(/^#/, '');\n            try {\n                var mozilla = /mozilla/.test(navigator.userAgent.toLowerCase());\n                return mozilla ? hash : decodeURIComponent(hash);\n            }\n            catch (error) {\n                return hash;\n            }\n        },\n        encoder: encodeURIComponent\n    };\n\n    var iframeWrapper = {\n        id: \"__jQuery_history\",\n        init: function() {\n            var html = '<iframe id=\"'+ this.id +'\" style=\"display:none\" src=\"javascript:false;\" />';\n            $(\"body\").prepend(html);\n            return this;\n        },\n        _document: function() {\n            return $(\"#\"+ this.id)[0].contentWindow.document;\n        },\n        put: function(hash) {\n            var doc = this._document();\n            doc.open();\n            doc.close();\n            locationWrapper.put(hash, doc);\n        },\n        get: function() {\n            return locationWrapper.get(this._document());\n        }\n    };\n\n    function initObjects(options) {\n        options = $.extend({\n                unescape: true\n            }, options || {});\n\n        locationWrapper.encoder = encoder(options.unescape);\n\n        function encoder(unescape_) {\n            if(unescape_ === true) {\n                return function(hash){ return hash; };\n            }\n            if(typeof unescape_ == \"string\" &&\n               (unescape_ = partialDecoder(unescape_.split(\"\")))\n               || typeof unescape_ == \"function\") {\n                return function(hash) { return unescape_(encodeURIComponent(hash)); };\n            }\n            return encodeURIComponent;\n        }\n\n        function partialDecoder(chars) {\n            var re = new RegExp($.map(chars, encodeURIComponent).join(\"|\"), \"ig\");\n            return function(enc) { return enc.replace(re, decodeURIComponent); };\n        }\n    }\n\n    var implementations = {};\n\n    implementations.base = {\n        callback: undefined,\n        type: undefined,\n\n        check: function() {},\n        load:  function(hash) {},\n        init:  function(callback, options) {\n            initObjects(options);\n            self.callback = callback;\n            self._options = options;\n            self._init();\n        },\n\n        _init: function() {},\n        _options: {}\n    };\n\n    implementations.timer = {\n        _appState: undefined,\n        _init: function() {\n            var current_hash = locationWrapper.get();\n            self._appState = current_hash;\n            self.callback(current_hash);\n            setInterval(self.check, 100);\n        },\n        check: function() {\n            var current_hash = locationWrapper.get();\n            if(current_hash != self._appState) {\n                self._appState = current_hash;\n                self.callback(current_hash);\n            }\n        },\n        load: function(hash) {\n            if(hash != self._appState) {\n                locationWrapper.put(hash);\n                self._appState = hash;\n                self.callback(hash);\n            }\n        }\n    };\n\n    implementations.iframeTimer = {\n        _appState: undefined,\n        _init: function() {\n            var current_hash = locationWrapper.get();\n            self._appState = current_hash;\n            iframeWrapper.init().put(current_hash);\n            self.callback(current_hash);\n            setInterval(self.check, 100);\n        },\n        check: function() {\n            var iframe_hash = iframeWrapper.get(),\n                location_hash = locationWrapper.get();\n\n            if (location_hash != iframe_hash) {\n                if (location_hash == self._appState) {    // user used Back or Forward button\n                    self._appState = iframe_hash;\n                    locationWrapper.put(iframe_hash);\n                    self.callback(iframe_hash); \n                } else {                              // user loaded new bookmark\n                    self._appState = location_hash;  \n                    iframeWrapper.put(location_hash);\n                    self.callback(location_hash);\n                }\n            }\n        },\n        load: function(hash) {\n            if(hash != self._appState) {\n                locationWrapper.put(hash);\n                iframeWrapper.put(hash);\n                self._appState = hash;\n                self.callback(hash);\n            }\n        }\n    };\n\n    implementations.hashchangeEvent = {\n        _init: function() {\n            self.callback(locationWrapper.get());\n            $(window).bind('hashchange', self.check);\n        },\n        check: function() {\n            self.callback(locationWrapper.get());\n        },\n        load: function(hash) {\n            locationWrapper.put(hash);\n        }\n    };\n\n    var self = $.extend({}, implementations.base);\n\n    var msie = /msie/.test(navigator.userAgent.toLowerCase());\n    if( msie && !$.support.leadingWhitespace ) {\n        self.type = 'iframeTimer';\n    } else if(\"onhashchange\" in window) {\n        self.type = 'hashchangeEvent';\n    } else {\n        self.type = 'timer';\n    }\n\n    $.extend(self, implementations[self.type]);\n    $.history = self;\n})(jQuery);\n"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-config-web/src/main/resources/static/plugin/mock/mock-min.js",
    "content": "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.Mock=e():t.Mock=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var a=n[r]={exports:{},id:r,loaded:!1};return t[r].call(a.exports,a,a.exports,e),a.loaded=!0,a.exports}var n={};return e.m=t,e.c=n,e.p=\"\",e(0)}([function(t,e,n){var r,a=n(1),o=n(3),u=n(5),l=n(20),i=n(23),s=n(25);\"undefined\"!=typeof window&&(r=n(27));/*!\n\t    Mock - 模拟请求 & 模拟数据\n\t    https://github.com/nuysoft/Mock\n\t    墨智 mozhi.gyy@taobao.com nuysoft@gmail.com\n\t*/\nvar c={Handler:a,Random:u,Util:o,XHR:r,RE:l,toJSONSchema:i,valid:s,heredoc:o.heredoc,setup:function(t){return r.setup(t)},_mocked:{}};c.version=\"1.0.0-beta2\",r&&(r.Mock=c),c.mock=function(t,e,n){return 1===arguments.length?a.gen(t):(2===arguments.length&&(n=e,e=void 0),r&&(window.XMLHttpRequest=r),c._mocked[t+(e||\"\")]={rurl:t,rtype:e,template:n},c)},t.exports=c},function(module,exports,__webpack_require__){var Constant=__webpack_require__(2),Util=__webpack_require__(3),Parser=__webpack_require__(4),Random=__webpack_require__(5),RE=__webpack_require__(20),Handler={extend:Util.extend};Handler.gen=function(t,e,n){e=void 0==e?\"\":e+\"\",n=n||{},n={path:n.path||[Constant.GUID],templatePath:n.templatePath||[Constant.GUID++],currentContext:n.currentContext,templateCurrentContext:n.templateCurrentContext||t,root:n.root||n.currentContext,templateRoot:n.templateRoot||n.templateCurrentContext||t};var r,a=Parser.parse(e),o=Util.type(t);return Handler[o]?(r=Handler[o]({type:o,template:t,name:e,parsedName:e?e.replace(Constant.RE_KEY,\"$1\"):e,rule:a,context:n}),n.root||(n.root=r),r):t},Handler.extend({array:function(t){var e,n,r=[];if(0===t.template.length)return r;if(t.rule.parameters)if(1===t.rule.min&&void 0===t.rule.max)t.context.path.push(t.name),t.context.templatePath.push(t.name),r=Random.pick(Handler.gen(t.template,void 0,{path:t.context.path,templatePath:t.context.templatePath,currentContext:r,templateCurrentContext:t.template,root:t.context.root||r,templateRoot:t.context.templateRoot||t.template})),t.context.path.pop(),t.context.templatePath.pop();else if(t.rule.parameters[2])t.template.__order_index=t.template.__order_index||0,t.context.path.push(t.name),t.context.templatePath.push(t.name),r=Handler.gen(t.template,void 0,{path:t.context.path,templatePath:t.context.templatePath,currentContext:r,templateCurrentContext:t.template,root:t.context.root||r,templateRoot:t.context.templateRoot||t.template})[t.template.__order_index%t.template.length],t.template.__order_index+=+t.rule.parameters[2],t.context.path.pop(),t.context.templatePath.pop();else for(e=0;e<t.rule.count;e++)for(n=0;n<t.template.length;n++)t.context.path.push(r.length),t.context.templatePath.push(n),r.push(Handler.gen(t.template[n],r.length,{path:t.context.path,templatePath:t.context.templatePath,currentContext:r,templateCurrentContext:t.template,root:t.context.root||r,templateRoot:t.context.templateRoot||t.template})),t.context.path.pop(),t.context.templatePath.pop();else for(e=0;e<t.template.length;e++)t.context.path.push(e),t.context.templatePath.push(e),r.push(Handler.gen(t.template[e],e,{path:t.context.path,templatePath:t.context.templatePath,currentContext:r,templateCurrentContext:t.template,root:t.context.root||r,templateRoot:t.context.templateRoot||t.template})),t.context.path.pop(),t.context.templatePath.pop();return r},object:function(t){var e,n,r,a,o,u,l={};if(void 0!=t.rule.min)for(e=Util.keys(t.template),e=Random.shuffle(e),e=e.slice(0,t.rule.count),u=0;u<e.length;u++)r=e[u],a=r.replace(Constant.RE_KEY,\"$1\"),t.context.path.push(a),t.context.templatePath.push(r),l[a]=Handler.gen(t.template[r],r,{path:t.context.path,templatePath:t.context.templatePath,currentContext:l,templateCurrentContext:t.template,root:t.context.root||l,templateRoot:t.context.templateRoot||t.template}),t.context.path.pop(),t.context.templatePath.pop();else{e=[],n=[];for(r in t.template)(\"function\"==typeof t.template[r]?n:e).push(r);for(e=e.concat(n),u=0;u<e.length;u++)r=e[u],a=r.replace(Constant.RE_KEY,\"$1\"),t.context.path.push(a),t.context.templatePath.push(r),l[a]=Handler.gen(t.template[r],r,{path:t.context.path,templatePath:t.context.templatePath,currentContext:l,templateCurrentContext:t.template,root:t.context.root||l,templateRoot:t.context.templateRoot||t.template}),t.context.path.pop(),t.context.templatePath.pop(),o=r.match(Constant.RE_KEY),o&&o[2]&&\"number\"===Util.type(t.template[r])&&(t.template[r]+=parseInt(o[2],10))}return l},number:function(t){var e,n;if(t.rule.decimal){for(t.template+=\"\",n=t.template.split(\".\"),n[0]=t.rule.range?t.rule.count:n[0],n[1]=(n[1]||\"\").slice(0,t.rule.dcount);n[1].length<t.rule.dcount;)n[1]+=n[1].length<t.rule.dcount-1?Random.character(\"number\"):Random.character(\"123456789\");e=parseFloat(n.join(\".\"),10)}else e=t.rule.range&&!t.rule.parameters[2]?t.rule.count:t.template;return e},\"boolean\":function(t){var e;return e=t.rule.parameters?Random.bool(t.rule.min,t.rule.max,t.template):t.template},string:function(t){var e,n,r,a,o=\"\";if(t.template.length){for(void 0==t.rule.count&&(o+=t.template),e=0;e<t.rule.count;e++)o+=t.template;for(n=o.match(Constant.RE_PLACEHOLDER)||[],e=0;e<n.length;e++)if(r=n[e],/^\\\\/.test(r))n.splice(e--,1);else{if(a=Handler.placeholder(r,t.context.currentContext,t.context.templateCurrentContext,t),1===n.length&&r===o&&typeof a!=typeof o){o=a;break}o=o.replace(r,a)}}else o=t.rule.range?Random.string(t.rule.count):t.template;return o},\"function\":function(t){return t.template.call(t.context.currentContext,t)},regexp:function(t){for(var e=t.template.source,n=0;n<t.rule.count;n++)e+=t.template.source;return RE.Handler.gen(RE.Parser.parse(e))}}),Handler.extend({_all:function(){var t={};for(var e in Random)t[e.toLowerCase()]=e;return t},placeholder:function(placeholder,obj,templateContext,options){Constant.RE_PLACEHOLDER.exec(\"\");var parts=Constant.RE_PLACEHOLDER.exec(placeholder),key=parts&&parts[1],lkey=key&&key.toLowerCase(),okey=this._all()[lkey],params=parts&&parts[2]||\"\",pathParts=this.splitPathToArray(key);try{params=eval(\"(function(){ return [].splice.call(arguments, 0 ) })(\"+params+\")\")}catch(error){params=parts[2].split(/,\\s*/)}if(obj&&key in obj)return obj[key];if(\"/\"===key.charAt(0)||pathParts.length>1)return this.getValueByKeyPath(key,options);if(templateContext&&\"object\"==typeof templateContext&&key in templateContext&&placeholder!==templateContext[key])return templateContext[key]=Handler.gen(templateContext[key],key,{currentContext:obj,templateCurrentContext:templateContext}),templateContext[key];if(!(key in Random||lkey in Random||okey in Random))return placeholder;for(var i=0;i<params.length;i++)Constant.RE_PLACEHOLDER.exec(\"\"),Constant.RE_PLACEHOLDER.test(params[i])&&(params[i]=Handler.placeholder(params[i],obj,templateContext,options));var handle=Random[key]||Random[lkey]||Random[okey];switch(Util.type(handle)){case\"array\":return Random.pick(handle);case\"function\":handle.options=options;var re=handle.apply(Random,params);return void 0===re&&(re=\"\"),delete handle.options,re}},getValueByKeyPath:function(t,e){var n=t,r=this.splitPathToArray(t),a=[];\"/\"===t.charAt(0)?a=[e.context.path[0]].concat(this.normalizePath(r)):r.length>1&&(a=e.context.path.slice(0),a.pop(),a=this.normalizePath(a.concat(r))),t=r[r.length-1];for(var o=e.context.root,u=e.context.templateRoot,l=1;l<a.length-1;l++)o=o[a[l]],u=u[a[l]];return o&&t in o?o[t]:u&&\"object\"==typeof u&&t in u&&n!==u[t]?(u[t]=Handler.gen(u[t],t,{currentContext:o,templateCurrentContext:u}),u[t]):void 0},normalizePath:function(t){for(var e=[],n=0;n<t.length;n++)switch(t[n]){case\"..\":e.pop();break;case\".\":break;default:e.push(t[n])}return e},splitPathToArray:function(t){var e=t.split(/\\/+/);return e[e.length-1]||(e=e.slice(0,-1)),e[0]||(e=e.slice(1)),e}}),module.exports=Handler},function(t,e){t.exports={GUID:1,RE_KEY:/(.+)\\|(?:\\+(\\d+)|([\\+\\-]?\\d+-?[\\+\\-]?\\d*)?(?:\\.(\\d+-?\\d*))?)/,RE_RANGE:/([\\+\\-]?\\d+)-?([\\+\\-]?\\d+)?/,RE_PLACEHOLDER:/\\\\*@([^@#%&()\\?\\s]+)(?:\\((.*?)\\))?/g}},function(t,e){var n={};n.extend=function(){var t,e,r,a,o,u=arguments[0]||{},l=1,i=arguments.length;for(1===i&&(u=this,l=0);i>l;l++)if(t=arguments[l])for(e in t)r=u[e],a=t[e],u!==a&&void 0!==a&&(n.isArray(a)||n.isObject(a)?(n.isArray(a)&&(o=r&&n.isArray(r)?r:[]),n.isObject(a)&&(o=r&&n.isObject(r)?r:{}),u[e]=n.extend(o,a)):u[e]=a);return u},n.each=function(t,e,n){var r,a;if(\"number\"===this.type(t))for(r=0;t>r;r++)e(r,r);else if(t.length===+t.length)for(r=0;r<t.length&&e.call(n,t[r],r,t)!==!1;r++);else for(a in t)if(e.call(n,t[a],a,t)===!1)break},n.type=function(t){return null===t||void 0===t?String(t):Object.prototype.toString.call(t).match(/\\[object (\\w+)\\]/)[1].toLowerCase()},n.each(\"String Object Array RegExp Function\".split(\" \"),function(t){n[\"is\"+t]=function(e){return n.type(e)===t.toLowerCase()}}),n.isObjectOrArray=function(t){return n.isObject(t)||n.isArray(t)},n.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},n.keys=function(t){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);return e},n.values=function(t){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(t[n]);return e},n.heredoc=function(t){return t.toString().replace(/^[^\\/]+\\/\\*!?/,\"\").replace(/\\*\\/[^\\/]+$/,\"\").replace(/^[\\s\\xA0]+/,\"\").replace(/[\\s\\xA0]+$/,\"\")},n.noop=function(){},t.exports=n},function(t,e,n){var r=n(2),a=n(5);t.exports={parse:function(t){t=void 0==t?\"\":t+\"\";var e=(t||\"\").match(r.RE_KEY),n=e&&e[3]&&e[3].match(r.RE_RANGE),o=n&&n[1]&&parseInt(n[1],10),u=n&&n[2]&&parseInt(n[2],10),l=n?n[2]?a.integer(o,u):parseInt(n[1],10):void 0,i=e&&e[4]&&e[4].match(r.RE_RANGE),s=i&&parseInt(i[1],10),c=i&&parseInt(i[2],10),h=i?!i[2]&&parseInt(i[1],10)||a.integer(s,c):void 0,p={parameters:e,range:n,min:o,max:u,count:l,decimal:i,dmin:s,dmax:c,dcount:h};for(var f in p)if(void 0!=p[f])return p;return{}}}},function(t,e,n){var r=n(3),a={extend:r.extend};a.extend(n(6)),a.extend(n(7)),a.extend(n(8)),a.extend(n(10)),a.extend(n(13)),a.extend(n(15)),a.extend(n(16)),a.extend(n(17)),a.extend(n(14)),a.extend(n(19)),t.exports=a},function(t,e){t.exports={\"boolean\":function(t,e,n){return void 0!==n?(t=\"undefined\"==typeof t||isNaN(t)?1:parseInt(t,10),e=\"undefined\"==typeof e||isNaN(e)?1:parseInt(e,10),Math.random()>1/(t+e)*t?!n:n):Math.random()>=.5},bool:function(t,e,n){return this[\"boolean\"](t,e,n)},natural:function(t,e){return t=\"undefined\"!=typeof t?parseInt(t,10):0,e=\"undefined\"!=typeof e?parseInt(e,10):9007199254740992,Math.round(Math.random()*(e-t))+t},integer:function(t,e){return t=\"undefined\"!=typeof t?parseInt(t,10):-9007199254740992,e=\"undefined\"!=typeof e?parseInt(e,10):9007199254740992,Math.round(Math.random()*(e-t))+t},\"int\":function(t,e){return this.integer(t,e)},\"float\":function(t,e,n,r){n=void 0===n?0:n,n=Math.max(Math.min(n,17),0),r=void 0===r?17:r,r=Math.max(Math.min(r,17),0);for(var a=this.integer(t,e)+\".\",o=0,u=this.natural(n,r);u>o;o++)a+=u-1>o?this.character(\"number\"):this.character(\"123456789\");return parseFloat(a,10)},character:function(t){var e={lower:\"abcdefghijklmnopqrstuvwxyz\",upper:\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",number:\"0123456789\",symbol:\"!@#$%^&*()[]\"};return e.alpha=e.lower+e.upper,e.undefined=e.lower+e.upper+e.number+e.symbol,t=e[(\"\"+t).toLowerCase()]||t,t.charAt(this.natural(0,t.length-1))},\"char\":function(t){return this.character(t)},string:function(t,e,n){var r;switch(arguments.length){case 0:r=this.natural(3,7);break;case 1:r=t,t=void 0;break;case 2:\"string\"==typeof arguments[0]?r=e:(r=this.natural(t,e),t=void 0);break;case 3:r=this.natural(e,n)}for(var a=\"\",o=0;r>o;o++)a+=this.character(t);return a},str:function(){return this.string.apply(this,arguments)},range:function(t,e,n){arguments.length<=1&&(e=t||0,t=0),n=arguments[2]||1,t=+t,e=+e,n=+n;for(var r=Math.max(Math.ceil((e-t)/n),0),a=0,o=new Array(r);r>a;)o[a++]=t,t+=n;return o}}},function(t,e){var n={yyyy:\"getFullYear\",yy:function(t){return(\"\"+t.getFullYear()).slice(2)},y:\"yy\",MM:function(t){var e=t.getMonth()+1;return 10>e?\"0\"+e:e},M:function(t){return t.getMonth()+1},dd:function(t){var e=t.getDate();return 10>e?\"0\"+e:e},d:\"getDate\",HH:function(t){var e=t.getHours();return 10>e?\"0\"+e:e},H:\"getHours\",hh:function(t){var e=t.getHours()%12;return 10>e?\"0\"+e:e},h:function(t){return t.getHours()%12},mm:function(t){var e=t.getMinutes();return 10>e?\"0\"+e:e},m:\"getMinutes\",ss:function(t){var e=t.getSeconds();return 10>e?\"0\"+e:e},s:\"getSeconds\",SS:function(t){var e=t.getMilliseconds();return 10>e&&\"00\"+e||100>e&&\"0\"+e||e},S:\"getMilliseconds\",A:function(t){return t.getHours()<12?\"AM\":\"PM\"},a:function(t){return t.getHours()<12?\"am\":\"pm\"},T:\"getTime\"};t.exports={_patternLetters:n,_rformat:new RegExp(function(){var t=[];for(var e in n)t.push(e);return\"(\"+t.join(\"|\")+\")\"}(),\"g\"),_formatDate:function(t,e){return e.replace(this._rformat,function r(e,a){return\"function\"==typeof n[a]?n[a](t):n[a]in n?r(e,n[a]):t[n[a]]()})},_randomDate:function(t,e){return t=void 0===t?new Date(0):t,e=void 0===e?new Date:e,new Date(Math.random()*(e.getTime()-t.getTime()))},date:function(t){return t=t||\"yyyy-MM-dd\",this._formatDate(this._randomDate(),t)},time:function(t){return t=t||\"HH:mm:ss\",this._formatDate(this._randomDate(),t)},datetime:function(t){return t=t||\"yyyy-MM-dd HH:mm:ss\",this._formatDate(this._randomDate(),t)},now:function(t,e){1===arguments.length&&(/year|month|day|hour|minute|second|week/.test(t)||(e=t,t=\"\")),t=(t||\"\").toLowerCase(),e=e||\"yyyy-MM-dd HH:mm:ss\";var n=new Date;switch(t){case\"year\":n.setMonth(0);case\"month\":n.setDate(1);case\"week\":case\"day\":n.setHours(0);case\"hour\":n.setMinutes(0);case\"minute\":n.setSeconds(0);case\"second\":n.setMilliseconds(0)}switch(t){case\"week\":n.setDate(n.getDate()-n.getDay())}return this._formatDate(n,e)}}},function(t,e,n){(function(t){t.exports={_adSize:[\"300x250\",\"250x250\",\"240x400\",\"336x280\",\"180x150\",\"720x300\",\"468x60\",\"234x60\",\"88x31\",\"120x90\",\"120x60\",\"120x240\",\"125x125\",\"728x90\",\"160x600\",\"120x600\",\"300x600\"],_screenSize:[\"320x200\",\"320x240\",\"640x480\",\"800x480\",\"800x480\",\"1024x600\",\"1024x768\",\"1280x800\",\"1440x900\",\"1920x1200\",\"2560x1600\"],_videoSize:[\"720x480\",\"768x576\",\"1280x720\",\"1920x1080\"],image:function(t,e,n,r,a){return 4===arguments.length&&(a=r,r=void 0),3===arguments.length&&(a=n,n=void 0),t||(t=this.pick(this._adSize)),e&&~e.indexOf(\"#\")&&(e=e.slice(1)),n&&~n.indexOf(\"#\")&&(n=n.slice(1)),\"http://dummyimage.com/\"+t+(e?\"/\"+e:\"\")+(n?\"/\"+n:\"\")+(r?\".\"+r:\"\")+(a?\"&text=\"+a:\"\")},img:function(){return this.image.apply(this,arguments)},_brandColors:{\"4ormat\":\"#fb0a2a\",\"500px\":\"#02adea\",\"About.me (blue)\":\"#00405d\",\"About.me (yellow)\":\"#ffcc33\",Addvocate:\"#ff6138\",Adobe:\"#ff0000\",Aim:\"#fcd20b\",Amazon:\"#e47911\",Android:\"#a4c639\",\"Angie's List\":\"#7fbb00\",AOL:\"#0060a3\",Atlassian:\"#003366\",Behance:\"#053eff\",\"Big Cartel\":\"#97b538\",bitly:\"#ee6123\",Blogger:\"#fc4f08\",Boeing:\"#0039a6\",\"Booking.com\":\"#003580\",Carbonmade:\"#613854\",Cheddar:\"#ff7243\",\"Code School\":\"#3d4944\",Delicious:\"#205cc0\",Dell:\"#3287c1\",Designmoo:\"#e54a4f\",Deviantart:\"#4e6252\",\"Designer News\":\"#2d72da\",Devour:\"#fd0001\",DEWALT:\"#febd17\",\"Disqus (blue)\":\"#59a3fc\",\"Disqus (orange)\":\"#db7132\",Dribbble:\"#ea4c89\",Dropbox:\"#3d9ae8\",Drupal:\"#0c76ab\",Dunked:\"#2a323a\",eBay:\"#89c507\",Ember:\"#f05e1b\",Engadget:\"#00bdf6\",Envato:\"#528036\",Etsy:\"#eb6d20\",Evernote:\"#5ba525\",\"Fab.com\":\"#dd0017\",Facebook:\"#3b5998\",Firefox:\"#e66000\",\"Flickr (blue)\":\"#0063dc\",\"Flickr (pink)\":\"#ff0084\",Forrst:\"#5b9a68\",Foursquare:\"#25a0ca\",Garmin:\"#007cc3\",GetGlue:\"#2d75a2\",Gimmebar:\"#f70078\",GitHub:\"#171515\",\"Google Blue\":\"#0140ca\",\"Google Green\":\"#16a61e\",\"Google Red\":\"#dd1812\",\"Google Yellow\":\"#fcca03\",\"Google+\":\"#dd4b39\",Grooveshark:\"#f77f00\",Groupon:\"#82b548\",\"Hacker News\":\"#ff6600\",HelloWallet:\"#0085ca\",\"Heroku (light)\":\"#c7c5e6\",\"Heroku (dark)\":\"#6567a5\",HootSuite:\"#003366\",Houzz:\"#73ba37\",HTML5:\"#ec6231\",IKEA:\"#ffcc33\",IMDb:\"#f3ce13\",Instagram:\"#3f729b\",Intel:\"#0071c5\",Intuit:\"#365ebf\",Kickstarter:\"#76cc1e\",kippt:\"#e03500\",Kodery:\"#00af81\",LastFM:\"#c3000d\",LinkedIn:\"#0e76a8\",Livestream:\"#cf0005\",Lumo:\"#576396\",Mixpanel:\"#a086d3\",Meetup:\"#e51937\",Nokia:\"#183693\",NVIDIA:\"#76b900\",Opera:\"#cc0f16\",Path:\"#e41f11\",\"PayPal (dark)\":\"#1e477a\",\"PayPal (light)\":\"#3b7bbf\",Pinboard:\"#0000e6\",Pinterest:\"#c8232c\",PlayStation:\"#665cbe\",Pocket:\"#ee4056\",Prezi:\"#318bff\",Pusha:\"#0f71b4\",Quora:\"#a82400\",\"QUOTE.fm\":\"#66ceff\",Rdio:\"#008fd5\",Readability:\"#9c0000\",\"Red Hat\":\"#cc0000\",Resource:\"#7eb400\",Rockpack:\"#0ba6ab\",Roon:\"#62b0d9\",RSS:\"#ee802f\",Salesforce:\"#1798c1\",Samsung:\"#0c4da2\",Shopify:\"#96bf48\",Skype:\"#00aff0\",Snagajob:\"#f47a20\",Softonic:\"#008ace\",SoundCloud:\"#ff7700\",\"Space Box\":\"#f86960\",Spotify:\"#81b71a\",Sprint:\"#fee100\",Squarespace:\"#121212\",StackOverflow:\"#ef8236\",Staples:\"#cc0000\",\"Status Chart\":\"#d7584f\",Stripe:\"#008cdd\",StudyBlue:\"#00afe1\",StumbleUpon:\"#f74425\",\"T-Mobile\":\"#ea0a8e\",Technorati:\"#40a800\",\"The Next Web\":\"#ef4423\",Treehouse:\"#5cb868\",Trulia:\"#5eab1f\",Tumblr:\"#34526f\",\"Twitch.tv\":\"#6441a5\",Twitter:\"#00acee\",TYPO3:\"#ff8700\",Ubuntu:\"#dd4814\",Ustream:\"#3388ff\",Verizon:\"#ef1d1d\",Vimeo:\"#86c9ef\",Vine:\"#00a478\",Virb:\"#06afd8\",\"Virgin Media\":\"#cc0000\",Wooga:\"#5b009c\",\"WordPress (blue)\":\"#21759b\",\"WordPress (orange)\":\"#d54e21\",\"WordPress (grey)\":\"#464646\",Wunderlist:\"#2b88d9\",XBOX:\"#9bc848\",XING:\"#126567\",\"Yahoo!\":\"#720e9e\",Yandex:\"#ffcc00\",Yelp:\"#c41200\",YouTube:\"#c4302b\",Zalongo:\"#5498dc\",Zendesk:\"#78a300\",Zerply:\"#9dcc7a\",Zootool:\"#5e8b1d\"},_brandNames:function(){var t=[];for(var e in this._brandColors)t.push(e);return t},dataImage:function(e,n){var r;if(\"undefined\"!=typeof document)r=document.createElement(\"canvas\");else{var a=t.require(\"canvas\");r=new a}var o=r&&r.getContext&&r.getContext(\"2d\");if(!r||!o)return\"\";e||(e=this.pick(this._adSize)),n=void 0!==n?n:e,e=e.split(\"x\");var u=parseInt(e[0],10),l=parseInt(e[1],10),i=this._brandColors[this.pick(this._brandNames())],s=\"#FFF\",c=14,h=\"sans-serif\";return r.width=u,r.height=l,o.textAlign=\"center\",o.textBaseline=\"middle\",o.fillStyle=i,o.fillRect(0,0,u,l),o.fillStyle=s,o.font=\"bold \"+c+\"px \"+h,o.fillText(n,u/2,l/2,u),r.toDataURL(\"image/png\")}}}).call(e,n(9)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e,n){var r=n(11),a=n(12);t.exports={color:function(t){return t||a[t]?a[t].nicer:this.hex()},hex:function(){var t=this._goldenRatioColor(),e=r.hsv2rgb(t),n=r.rgb2hex(e[0],e[1],e[2]);return n},rgb:function(){var t=this._goldenRatioColor(),e=r.hsv2rgb(t);return\"rgb(\"+parseInt(e[0],10)+\", \"+parseInt(e[1],10)+\", \"+parseInt(e[2],10)+\")\"},rgba:function(){var t=this._goldenRatioColor(),e=r.hsv2rgb(t);return\"rgba(\"+parseInt(e[0],10)+\", \"+parseInt(e[1],10)+\", \"+parseInt(e[2],10)+\", \"+Math.random().toFixed(2)+\")\"},hsl:function(){var t=this._goldenRatioColor(),e=r.hsv2hsl(t);return\"hsl(\"+parseInt(e[0],10)+\", \"+parseInt(e[1],10)+\", \"+parseInt(e[2],10)+\")\"},_goldenRatioColor:function(t,e){return this._goldenRatio=.618033988749895,this._hue=this._hue||Math.random(),this._hue+=this._goldenRatio,this._hue%=1,\"number\"!=typeof t&&(t=.5),\"number\"!=typeof e&&(e=.95),[360*this._hue,100*t,100*e]}}},function(t,e){t.exports={rgb2hsl:function(t){var e,n,r,a=t[0]/255,o=t[1]/255,u=t[2]/255,l=Math.min(a,o,u),i=Math.max(a,o,u),s=i-l;return i==l?e=0:a==i?e=(o-u)/s:o==i?e=2+(u-a)/s:u==i&&(e=4+(a-o)/s),e=Math.min(60*e,360),0>e&&(e+=360),r=(l+i)/2,n=i==l?0:.5>=r?s/(i+l):s/(2-i-l),[e,100*n,100*r]},rgb2hsv:function(t){var e,n,r,a=t[0],o=t[1],u=t[2],l=Math.min(a,o,u),i=Math.max(a,o,u),s=i-l;return n=0===i?0:s/i*1e3/10,i==l?e=0:a==i?e=(o-u)/s:o==i?e=2+(u-a)/s:u==i&&(e=4+(a-o)/s),e=Math.min(60*e,360),0>e&&(e+=360),r=i/255*1e3/10,[e,n,r]},hsl2rgb:function(t){var e,n,r,a,o,u=t[0]/360,l=t[1]/100,i=t[2]/100;if(0===l)return o=255*i,[o,o,o];n=.5>i?i*(1+l):i+l-i*l,e=2*i-n,a=[0,0,0];for(var s=0;3>s;s++)r=u+1/3*-(s-1),0>r&&r++,r>1&&r--,o=1>6*r?e+6*(n-e)*r:1>2*r?n:2>3*r?e+(n-e)*(2/3-r)*6:e,a[s]=255*o;return a},hsl2hsv:function(t){var e,n,r=t[0],a=t[1]/100,o=t[2]/100;return o*=2,a*=1>=o?o:2-o,n=(o+a)/2,e=2*a/(o+a),[r,100*e,100*n]},hsv2rgb:function(t){var e=t[0]/60,n=t[1]/100,r=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),u=255*r*(1-n),l=255*r*(1-n*o),i=255*r*(1-n*(1-o));switch(r=255*r,a){case 0:return[r,i,u];case 1:return[l,r,u];case 2:return[u,r,i];case 3:return[u,l,r];case 4:return[i,u,r];case 5:return[r,u,l]}},hsv2hsl:function(t){var e,n,r=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=1>=n?n:2-n,n/=2,[r,100*e,100*n]},rgb2hex:function(t,e,n){return\"#\"+((256+t<<8|e)<<8|n).toString(16).slice(1)},hex2rgb:function(t){return t=\"0x\"+t.slice(1).replace(t.length>4?t:/./g,\"$&$&\")|0,[t>>16,t>>8&255,255&t]}}},function(t,e){t.exports={navy:{value:\"#000080\",nicer:\"#001F3F\"},blue:{value:\"#0000ff\",nicer:\"#0074D9\"},aqua:{value:\"#00ffff\",nicer:\"#7FDBFF\"},teal:{value:\"#008080\",nicer:\"#39CCCC\"},olive:{value:\"#008000\",nicer:\"#3D9970\"},green:{value:\"#008000\",nicer:\"#2ECC40\"},lime:{value:\"#00ff00\",nicer:\"#01FF70\"},yellow:{value:\"#ffff00\",nicer:\"#FFDC00\"},orange:{value:\"#ffa500\",nicer:\"#FF851B\"},red:{value:\"#ff0000\",nicer:\"#FF4136\"},maroon:{value:\"#800000\",nicer:\"#85144B\"},fuchsia:{value:\"#ff00ff\",nicer:\"#F012BE\"},purple:{value:\"#800080\",nicer:\"#B10DC9\"},silver:{value:\"#c0c0c0\",nicer:\"#DDDDDD\"},gray:{value:\"#808080\",nicer:\"#AAAAAA\"},black:{value:\"#000000\",nicer:\"#111111\"},white:{value:\"#FFFFFF\",nicer:\"#FFFFFF\"}}},function(t,e,n){function r(t,e,n,r){return void 0===n?a.natural(t,e):void 0===r?n:a.natural(parseInt(n,10),parseInt(r,10))}var a=n(6),o=n(14);t.exports={paragraph:function(t,e){for(var n=r(3,7,t,e),a=[],o=0;n>o;o++)a.push(this.sentence());return a.join(\" \")},cparagraph:function(t,e){for(var n=r(3,7,t,e),a=[],o=0;n>o;o++)a.push(this.csentence());return a.join(\"\")},sentence:function(t,e){for(var n=r(12,18,t,e),a=[],u=0;n>u;u++)a.push(this.word());return o.capitalize(a.join(\" \"))+\".\"},csentence:function(t,e){for(var n=r(12,18,t,e),a=[],o=0;n>o;o++)a.push(this.cword());return a.join(\"\")+\"。\"},word:function(t,e){for(var n=r(3,10,t,e),o=\"\",u=0;n>u;u++)o+=a.character(\"lower\");return o},cword:function(t,e,n){var r,a=\"的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞\";switch(arguments.length){case 0:t=a,r=1;break;case 1:\"string\"==typeof arguments[0]?r=1:(r=t,t=a);break;case 2:\"string\"==typeof arguments[0]?r=e:(r=this.natural(t,e),t=a);break;case 3:r=this.natural(e,n)}for(var o=\"\",u=0;r>u;u++)o+=t.charAt(this.natural(0,t.length-1));return o},title:function(t,e){for(var n=r(3,7,t,e),a=[],o=0;n>o;o++)a.push(this.capitalize(this.word()));return a.join(\" \")},ctitle:function(t,e){for(var n=r(3,7,t,e),a=[],o=0;n>o;o++)a.push(this.cword());return a.join(\"\")}}},function(t,e){t.exports={capitalize:function(t){return(t+\"\").charAt(0).toUpperCase()+(t+\"\").substr(1)},upper:function(t){return(t+\"\").toUpperCase()},lower:function(t){return(t+\"\").toLowerCase()},pick:function(t,e,n){switch(t=t||[],arguments.length){case 1:return t[this.natural(0,t.length-1)];case 2:n=e;case 3:return this.shuffle(t,e,n)}},shuffle:function(t,e,n){t=t||[];for(var r=t.slice(0),a=[],o=0,u=r.length,l=0;u>l;l++)o=this.natural(0,r.length-1),a.push(r[o]),r.splice(o,1);switch(arguments.length){case 0:case 1:return a;case 2:n=e;case 3:return e=parseInt(e,10),n=parseInt(n,10),a.slice(0,this.natural(e,n))}},order:function n(t){n.cache=n.cache||{},arguments.length>1&&(t=[].slice.call(arguments,0));var e=n.options,r=e.context.templatePath.join(\".\"),a=n.cache[r]=n.cache[r]||{index:0,array:t};return a.array[a.index++%a.array.length]}}},function(t,e){t.exports={first:function(){var t=[\"James\",\"John\",\"Robert\",\"Michael\",\"William\",\"David\",\"Richard\",\"Charles\",\"Joseph\",\"Thomas\",\"Christopher\",\"Daniel\",\"Paul\",\"Mark\",\"Donald\",\"George\",\"Kenneth\",\"Steven\",\"Edward\",\"Brian\",\"Ronald\",\"Anthony\",\"Kevin\",\"Jason\",\"Matthew\",\"Gary\",\"Timothy\",\"Jose\",\"Larry\",\"Jeffrey\",\"Frank\",\"Scott\",\"Eric\"].concat([\"Mary\",\"Patricia\",\"Linda\",\"Barbara\",\"Elizabeth\",\"Jennifer\",\"Maria\",\"Susan\",\"Margaret\",\"Dorothy\",\"Lisa\",\"Nancy\",\"Karen\",\"Betty\",\"Helen\",\"Sandra\",\"Donna\",\"Carol\",\"Ruth\",\"Sharon\",\"Michelle\",\"Laura\",\"Sarah\",\"Kimberly\",\"Deborah\",\"Jessica\",\"Shirley\",\"Cynthia\",\"Angela\",\"Melissa\",\"Brenda\",\"Amy\",\"Anna\"]);return this.pick(t)},last:function(){var t=[\"Smith\",\"Johnson\",\"Williams\",\"Brown\",\"Jones\",\"Miller\",\"Davis\",\"Garcia\",\"Rodriguez\",\"Wilson\",\"Martinez\",\"Anderson\",\"Taylor\",\"Thomas\",\"Hernandez\",\"Moore\",\"Martin\",\"Jackson\",\"Thompson\",\"White\",\"Lopez\",\"Lee\",\"Gonzalez\",\"Harris\",\"Clark\",\"Lewis\",\"Robinson\",\"Walker\",\"Perez\",\"Hall\",\"Young\",\"Allen\"];return this.pick(t)},name:function(t){return this.first()+\" \"+(t?this.first()+\" \":\"\")+this.last()},cfirst:function(){var t=\"王 李 张 刘 陈 杨 赵 黄 周 吴 徐 孙 胡 朱 高 林 何 郭 马 罗 梁 宋 郑 谢 韩 唐 冯 于 董 萧 程 曹 袁 邓 许 傅 沈 曾 彭 吕 苏 卢 蒋 蔡 贾 丁 魏 薛 叶 阎 余 潘 杜 戴 夏 锺 汪 田 任 姜 范 方 石 姚 谭 廖 邹 熊 金 陆 郝 孔 白 崔 康 毛 邱 秦 江 史 顾 侯 邵 孟 龙 万 段 雷 钱 汤 尹 黎 易 常 武 乔 贺 赖 龚 文\".split(\" \");return this.pick(t)},clast:function(){var t=\"伟 芳 娜 秀英 敏 静 丽 强 磊 军 洋 勇 艳 杰 娟 涛 明 超 秀兰 霞 平 刚 桂英\".split(\" \");return this.pick(t)},cname:function(){return this.cfirst()+this.clast()}}},function(t,e){t.exports={url:function(t,e){return(t||this.protocol())+\"://\"+(e||this.domain())+\"/\"+this.word()},protocol:function(){return this.pick(\"http ftp gopher mailto mid cid news nntp prospero telnet rlogin tn3270 wais\".split(\" \"))},domain:function(t){return this.word()+\".\"+(t||this.tld())},tld:function(){return this.pick(\"com net org edu gov int mil cn com.cn net.cn gov.cn org.cn 中国 中国互联.公司 中国互联.网络 tel biz cc tv info name hk mobi asia cd travel pro museum coop aero ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw\".split(\" \"))},email:function(t){return this.character(\"lower\")+\".\"+this.word()+\"@\"+(t||this.word()+\".\"+this.tld())},ip:function(){return this.natural(0,255)+\".\"+this.natural(0,255)+\".\"+this.natural(0,255)+\".\"+this.natural(0,255)}}},function(t,e,n){var r=n(18),a=[\"东北\",\"华北\",\"华东\",\"华中\",\"华南\",\"西南\",\"西北\"];t.exports={region:function(){return this.pick(a)},province:function(){return this.pick(r).name},city:function(t){var e=this.pick(r),n=this.pick(e.children);return t?[e.name,n.name].join(\" \"):n.name},county:function(t){var e=this.pick(r),n=this.pick(e.children),a=this.pick(n.children)||{name:\"-\"};return t?[e.name,n.name,a.name].join(\" \"):a.name},zip:function(t){for(var e=\"\",n=0;(t||6)>n;n++)e+=this.natural(0,9);return e}}},function(t,e){function n(t){for(var e,n={},r=0;r<t.length;r++)e=t[r],e&&e.id&&(n[e.id]=e);for(var a=[],o=0;o<t.length;o++)if(e=t[o])if(void 0!=e.pid||void 0!=e.parentId){var u=n[e.pid]||n[e.parentId];u&&(u.children||(u.children=[]),u.children.push(e))}else a.push(e);return a}var r={110000:\"北京\",110100:\"北京市\",110101:\"东城区\",110102:\"西城区\",110105:\"朝阳区\",110106:\"丰台区\",110107:\"石景山区\",110108:\"海淀区\",110109:\"门头沟区\",110111:\"房山区\",110112:\"通州区\",110113:\"顺义区\",110114:\"昌平区\",110115:\"大兴区\",110116:\"怀柔区\",110117:\"平谷区\",110228:\"密云县\",110229:\"延庆县\",110230:\"其它区\",120000:\"天津\",120100:\"天津市\",120101:\"和平区\",120102:\"河东区\",120103:\"河西区\",120104:\"南开区\",120105:\"河北区\",120106:\"红桥区\",120110:\"东丽区\",120111:\"西青区\",120112:\"津南区\",120113:\"北辰区\",120114:\"武清区\",120115:\"宝坻区\",120116:\"滨海新区\",120221:\"宁河县\",120223:\"静海县\",120225:\"蓟县\",120226:\"其它区\",130000:\"河北省\",130100:\"石家庄市\",130102:\"长安区\",130103:\"桥东区\",130104:\"桥西区\",130105:\"新华区\",130107:\"井陉矿区\",130108:\"裕华区\",130121:\"井陉县\",130123:\"正定县\",130124:\"栾城县\",130125:\"行唐县\",130126:\"灵寿县\",130127:\"高邑县\",130128:\"深泽县\",130129:\"赞皇县\",130130:\"无极县\",130131:\"平山县\",130132:\"元氏县\",130133:\"赵县\",130181:\"辛集市\",130182:\"藁城市\",130183:\"晋州市\",130184:\"新乐市\",130185:\"鹿泉市\",130186:\"其它区\",130200:\"唐山市\",130202:\"路南区\",130203:\"路北区\",130204:\"古冶区\",130205:\"开平区\",130207:\"丰南区\",130208:\"丰润区\",130223:\"滦县\",130224:\"滦南县\",130225:\"乐亭县\",130227:\"迁西县\",130229:\"玉田县\",130230:\"曹妃甸区\",130281:\"遵化市\",130283:\"迁安市\",130284:\"其它区\",130300:\"秦皇岛市\",130302:\"海港区\",130303:\"山海关区\",130304:\"北戴河区\",130321:\"青龙满族自治县\",130322:\"昌黎县\",130323:\"抚宁县\",130324:\"卢龙县\",130398:\"其它区\",130400:\"邯郸市\",130402:\"邯山区\",130403:\"丛台区\",130404:\"复兴区\",130406:\"峰峰矿区\",130421:\"邯郸县\",130423:\"临漳县\",130424:\"成安县\",130425:\"大名县\",130426:\"涉县\",130427:\"磁县\",130428:\"肥乡县\",130429:\"永年县\",130430:\"邱县\",130431:\"鸡泽县\",130432:\"广平县\",130433:\"馆陶县\",130434:\"魏县\",130435:\"曲周县\",130481:\"武安市\",130482:\"其它区\",130500:\"邢台市\",130502:\"桥东区\",130503:\"桥西区\",130521:\"邢台县\",130522:\"临城县\",130523:\"内丘县\",130524:\"柏乡县\",130525:\"隆尧县\",130526:\"任县\",130527:\"南和县\",130528:\"宁晋县\",130529:\"巨鹿县\",130530:\"新河县\",130531:\"广宗县\",130532:\"平乡县\",130533:\"威县\",130534:\"清河县\",130535:\"临西县\",130581:\"南宫市\",130582:\"沙河市\",130583:\"其它区\",130600:\"保定市\",130602:\"新市区\",130603:\"北市区\",130604:\"南市区\",130621:\"满城县\",130622:\"清苑县\",130623:\"涞水县\",130624:\"阜平县\",130625:\"徐水县\",130626:\"定兴县\",130627:\"唐县\",130628:\"高阳县\",130629:\"容城县\",130630:\"涞源县\",130631:\"望都县\",130632:\"安新县\",130633:\"易县\",130634:\"曲阳县\",130635:\"蠡县\",130636:\"顺平县\",130637:\"博野县\",130638:\"雄县\",130681:\"涿州市\",130682:\"定州市\",130683:\"安国市\",130684:\"高碑店市\",130699:\"其它区\",130700:\"张家口市\",130702:\"桥东区\",130703:\"桥西区\",130705:\"宣化区\",130706:\"下花园区\",130721:\"宣化县\",130722:\"张北县\",130723:\"康保县\",130724:\"沽源县\",130725:\"尚义县\",130726:\"蔚县\",130727:\"阳原县\",130728:\"怀安县\",130729:\"万全县\",130730:\"怀来县\",130731:\"涿鹿县\",130732:\"赤城县\",130733:\"崇礼县\",130734:\"其它区\",130800:\"承德市\",130802:\"双桥区\",130803:\"双滦区\",130804:\"鹰手营子矿区\",130821:\"承德县\",130822:\"兴隆县\",130823:\"平泉县\",130824:\"滦平县\",130825:\"隆化县\",130826:\"丰宁满族自治县\",130827:\"宽城满族自治县\",130828:\"围场满族蒙古族自治县\",130829:\"其它区\",130900:\"沧州市\",130902:\"新华区\",130903:\"运河区\",130921:\"沧县\",130922:\"青县\",130923:\"东光县\",130924:\"海兴县\",130925:\"盐山县\",130926:\"肃宁县\",130927:\"南皮县\",130928:\"吴桥县\",130929:\"献县\",130930:\"孟村回族自治县\",130981:\"泊头市\",130982:\"任丘市\",130983:\"黄骅市\",130984:\"河间市\",130985:\"其它区\",131000:\"廊坊市\",131002:\"安次区\",131003:\"广阳区\",131022:\"固安县\",131023:\"永清县\",131024:\"香河县\",131025:\"大城县\",131026:\"文安县\",131028:\"大厂回族自治县\",131081:\"霸州市\",131082:\"三河市\",131083:\"其它区\",131100:\"衡水市\",131102:\"桃城区\",131121:\"枣强县\",131122:\"武邑县\",131123:\"武强县\",131124:\"饶阳县\",131125:\"安平县\",131126:\"故城县\",131127:\"景县\",131128:\"阜城县\",131181:\"冀州市\",131182:\"深州市\",131183:\"其它区\",140000:\"山西省\",140100:\"太原市\",140105:\"小店区\",140106:\"迎泽区\",140107:\"杏花岭区\",140108:\"尖草坪区\",140109:\"万柏林区\",140110:\"晋源区\",140121:\"清徐县\",140122:\"阳曲县\",140123:\"娄烦县\",140181:\"古交市\",140182:\"其它区\",140200:\"大同市\",140202:\"城区\",140203:\"矿区\",140211:\"南郊区\",140212:\"新荣区\",140221:\"阳高县\",140222:\"天镇县\",140223:\"广灵县\",140224:\"灵丘县\",140225:\"浑源县\",140226:\"左云县\",140227:\"大同县\",140228:\"其它区\",140300:\"阳泉市\",140302:\"城区\",140303:\"矿区\",140311:\"郊区\",140321:\"平定县\",140322:\"盂县\",140323:\"其它区\",140400:\"长治市\",140421:\"长治县\",140423:\"襄垣县\",140424:\"屯留县\",140425:\"平顺县\",140426:\"黎城县\",140427:\"壶关县\",140428:\"长子县\",140429:\"武乡县\",140430:\"沁县\",140431:\"沁源县\",140481:\"潞城市\",140482:\"城区\",140483:\"郊区\",140485:\"其它区\",140500:\"晋城市\",140502:\"城区\",140521:\"沁水县\",140522:\"阳城县\",140524:\"陵川县\",140525:\"泽州县\",140581:\"高平市\",140582:\"其它区\",140600:\"朔州市\",140602:\"朔城区\",140603:\"平鲁区\",140621:\"山阴县\",140622:\"应县\",140623:\"右玉县\",140624:\"怀仁县\",140625:\"其它区\",140700:\"晋中市\",140702:\"榆次区\",140721:\"榆社县\",140722:\"左权县\",140723:\"和顺县\",140724:\"昔阳县\",140725:\"寿阳县\",140726:\"太谷县\",140727:\"祁县\",140728:\"平遥县\",140729:\"灵石县\",140781:\"介休市\",140782:\"其它区\",140800:\"运城市\",140802:\"盐湖区\",140821:\"临猗县\",140822:\"万荣县\",140823:\"闻喜县\",140824:\"稷山县\",140825:\"新绛县\",140826:\"绛县\",140827:\"垣曲县\",140828:\"夏县\",140829:\"平陆县\",140830:\"芮城县\",140881:\"永济市\",140882:\"河津市\",140883:\"其它区\",140900:\"忻州市\",140902:\"忻府区\",140921:\"定襄县\",140922:\"五台县\",140923:\"代县\",140924:\"繁峙县\",140925:\"宁武县\",140926:\"静乐县\",140927:\"神池县\",140928:\"五寨县\",140929:\"岢岚县\",140930:\"河曲县\",140931:\"保德县\",140932:\"偏关县\",140981:\"原平市\",140982:\"其它区\",141000:\"临汾市\",141002:\"尧都区\",141021:\"曲沃县\",141022:\"翼城县\",141023:\"襄汾县\",141024:\"洪洞县\",141025:\"古县\",141026:\"安泽县\",141027:\"浮山县\",141028:\"吉县\",141029:\"乡宁县\",141030:\"大宁县\",141031:\"隰县\",141032:\"永和县\",141033:\"蒲县\",141034:\"汾西县\",141081:\"侯马市\",141082:\"霍州市\",141083:\"其它区\",141100:\"吕梁市\",141102:\"离石区\",141121:\"文水县\",141122:\"交城县\",141123:\"兴县\",141124:\"临县\",141125:\"柳林县\",141126:\"石楼县\",141127:\"岚县\",141128:\"方山县\",141129:\"中阳县\",141130:\"交口县\",141181:\"孝义市\",141182:\"汾阳市\",141183:\"其它区\",150000:\"内蒙古自治区\",150100:\"呼和浩特市\",150102:\"新城区\",150103:\"回民区\",150104:\"玉泉区\",150105:\"赛罕区\",150121:\"土默特左旗\",150122:\"托克托县\",150123:\"和林格尔县\",150124:\"清水河县\",150125:\"武川县\",150126:\"其它区\",\n150200:\"包头市\",150202:\"东河区\",150203:\"昆都仑区\",150204:\"青山区\",150205:\"石拐区\",150206:\"白云鄂博矿区\",150207:\"九原区\",150221:\"土默特右旗\",150222:\"固阳县\",150223:\"达尔罕茂明安联合旗\",150224:\"其它区\",150300:\"乌海市\",150302:\"海勃湾区\",150303:\"海南区\",150304:\"乌达区\",150305:\"其它区\",150400:\"赤峰市\",150402:\"红山区\",150403:\"元宝山区\",150404:\"松山区\",150421:\"阿鲁科尔沁旗\",150422:\"巴林左旗\",150423:\"巴林右旗\",150424:\"林西县\",150425:\"克什克腾旗\",150426:\"翁牛特旗\",150428:\"喀喇沁旗\",150429:\"宁城县\",150430:\"敖汉旗\",150431:\"其它区\",150500:\"通辽市\",150502:\"科尔沁区\",150521:\"科尔沁左翼中旗\",150522:\"科尔沁左翼后旗\",150523:\"开鲁县\",150524:\"库伦旗\",150525:\"奈曼旗\",150526:\"扎鲁特旗\",150581:\"霍林郭勒市\",150582:\"其它区\",150600:\"鄂尔多斯市\",150602:\"东胜区\",150621:\"达拉特旗\",150622:\"准格尔旗\",150623:\"鄂托克前旗\",150624:\"鄂托克旗\",150625:\"杭锦旗\",150626:\"乌审旗\",150627:\"伊金霍洛旗\",150628:\"其它区\",150700:\"呼伦贝尔市\",150702:\"海拉尔区\",150703:\"扎赉诺尔区\",150721:\"阿荣旗\",150722:\"莫力达瓦达斡尔族自治旗\",150723:\"鄂伦春自治旗\",150724:\"鄂温克族自治旗\",150725:\"陈巴尔虎旗\",150726:\"新巴尔虎左旗\",150727:\"新巴尔虎右旗\",150781:\"满洲里市\",150782:\"牙克石市\",150783:\"扎兰屯市\",150784:\"额尔古纳市\",150785:\"根河市\",150786:\"其它区\",150800:\"巴彦淖尔市\",150802:\"临河区\",150821:\"五原县\",150822:\"磴口县\",150823:\"乌拉特前旗\",150824:\"乌拉特中旗\",150825:\"乌拉特后旗\",150826:\"杭锦后旗\",150827:\"其它区\",150900:\"乌兰察布市\",150902:\"集宁区\",150921:\"卓资县\",150922:\"化德县\",150923:\"商都县\",150924:\"兴和县\",150925:\"凉城县\",150926:\"察哈尔右翼前旗\",150927:\"察哈尔右翼中旗\",150928:\"察哈尔右翼后旗\",150929:\"四子王旗\",150981:\"丰镇市\",150982:\"其它区\",152200:\"兴安盟\",152201:\"乌兰浩特市\",152202:\"阿尔山市\",152221:\"科尔沁右翼前旗\",152222:\"科尔沁右翼中旗\",152223:\"扎赉特旗\",152224:\"突泉县\",152225:\"其它区\",152500:\"锡林郭勒盟\",152501:\"二连浩特市\",152502:\"锡林浩特市\",152522:\"阿巴嘎旗\",152523:\"苏尼特左旗\",152524:\"苏尼特右旗\",152525:\"东乌珠穆沁旗\",152526:\"西乌珠穆沁旗\",152527:\"太仆寺旗\",152528:\"镶黄旗\",152529:\"正镶白旗\",152530:\"正蓝旗\",152531:\"多伦县\",152532:\"其它区\",152900:\"阿拉善盟\",152921:\"阿拉善左旗\",152922:\"阿拉善右旗\",152923:\"额济纳旗\",152924:\"其它区\",210000:\"辽宁省\",210100:\"沈阳市\",210102:\"和平区\",210103:\"沈河区\",210104:\"大东区\",210105:\"皇姑区\",210106:\"铁西区\",210111:\"苏家屯区\",210112:\"东陵区\",210113:\"新城子区\",210114:\"于洪区\",210122:\"辽中县\",210123:\"康平县\",210124:\"法库县\",210181:\"新民市\",210184:\"沈北新区\",210185:\"其它区\",210200:\"大连市\",210202:\"中山区\",210203:\"西岗区\",210204:\"沙河口区\",210211:\"甘井子区\",210212:\"旅顺口区\",210213:\"金州区\",210224:\"长海县\",210281:\"瓦房店市\",210282:\"普兰店市\",210283:\"庄河市\",210298:\"其它区\",210300:\"鞍山市\",210302:\"铁东区\",210303:\"铁西区\",210304:\"立山区\",210311:\"千山区\",210321:\"台安县\",210323:\"岫岩满族自治县\",210381:\"海城市\",210382:\"其它区\",210400:\"抚顺市\",210402:\"新抚区\",210403:\"东洲区\",210404:\"望花区\",210411:\"顺城区\",210421:\"抚顺县\",210422:\"新宾满族自治县\",210423:\"清原满族自治县\",210424:\"其它区\",210500:\"本溪市\",210502:\"平山区\",210503:\"溪湖区\",210504:\"明山区\",210505:\"南芬区\",210521:\"本溪满族自治县\",210522:\"桓仁满族自治县\",210523:\"其它区\",210600:\"丹东市\",210602:\"元宝区\",210603:\"振兴区\",210604:\"振安区\",210624:\"宽甸满族自治县\",210681:\"东港市\",210682:\"凤城市\",210683:\"其它区\",210700:\"锦州市\",210702:\"古塔区\",210703:\"凌河区\",210711:\"太和区\",210726:\"黑山县\",210727:\"义县\",210781:\"凌海市\",210782:\"北镇市\",210783:\"其它区\",210800:\"营口市\",210802:\"站前区\",210803:\"西市区\",210804:\"鲅鱼圈区\",210811:\"老边区\",210881:\"盖州市\",210882:\"大石桥市\",210883:\"其它区\",210900:\"阜新市\",210902:\"海州区\",210903:\"新邱区\",210904:\"太平区\",210905:\"清河门区\",210911:\"细河区\",210921:\"阜新蒙古族自治县\",210922:\"彰武县\",210923:\"其它区\",211000:\"辽阳市\",211002:\"白塔区\",211003:\"文圣区\",211004:\"宏伟区\",211005:\"弓长岭区\",211011:\"太子河区\",211021:\"辽阳县\",211081:\"灯塔市\",211082:\"其它区\",211100:\"盘锦市\",211102:\"双台子区\",211103:\"兴隆台区\",211121:\"大洼县\",211122:\"盘山县\",211123:\"其它区\",211200:\"铁岭市\",211202:\"银州区\",211204:\"清河区\",211221:\"铁岭县\",211223:\"西丰县\",211224:\"昌图县\",211281:\"调兵山市\",211282:\"开原市\",211283:\"其它区\",211300:\"朝阳市\",211302:\"双塔区\",211303:\"龙城区\",211321:\"朝阳县\",211322:\"建平县\",211324:\"喀喇沁左翼蒙古族自治县\",211381:\"北票市\",211382:\"凌源市\",211383:\"其它区\",211400:\"葫芦岛市\",211402:\"连山区\",211403:\"龙港区\",211404:\"南票区\",211421:\"绥中县\",211422:\"建昌县\",211481:\"兴城市\",211482:\"其它区\",220000:\"吉林省\",220100:\"长春市\",220102:\"南关区\",220103:\"宽城区\",220104:\"朝阳区\",220105:\"二道区\",220106:\"绿园区\",220112:\"双阳区\",220122:\"农安县\",220181:\"九台市\",220182:\"榆树市\",220183:\"德惠市\",220188:\"其它区\",220200:\"吉林市\",220202:\"昌邑区\",220203:\"龙潭区\",220204:\"船营区\",220211:\"丰满区\",220221:\"永吉县\",220281:\"蛟河市\",220282:\"桦甸市\",220283:\"舒兰市\",220284:\"磐石市\",220285:\"其它区\",220300:\"四平市\",220302:\"铁西区\",220303:\"铁东区\",220322:\"梨树县\",220323:\"伊通满族自治县\",220381:\"公主岭市\",220382:\"双辽市\",220383:\"其它区\",220400:\"辽源市\",220402:\"龙山区\",220403:\"西安区\",220421:\"东丰县\",220422:\"东辽县\",220423:\"其它区\",220500:\"通化市\",220502:\"东昌区\",220503:\"二道江区\",220521:\"通化县\",220523:\"辉南县\",220524:\"柳河县\",220581:\"梅河口市\",220582:\"集安市\",220583:\"其它区\",220600:\"白山市\",220602:\"浑江区\",220621:\"抚松县\",220622:\"靖宇县\",220623:\"长白朝鲜族自治县\",220625:\"江源区\",220681:\"临江市\",220682:\"其它区\",220700:\"松原市\",220702:\"宁江区\",220721:\"前郭尔罗斯蒙古族自治县\",220722:\"长岭县\",220723:\"乾安县\",220724:\"扶余市\",220725:\"其它区\",220800:\"白城市\",220802:\"洮北区\",220821:\"镇赉县\",220822:\"通榆县\",220881:\"洮南市\",220882:\"大安市\",220883:\"其它区\",222400:\"延边朝鲜族自治州\",222401:\"延吉市\",222402:\"图们市\",222403:\"敦化市\",222404:\"珲春市\",222405:\"龙井市\",222406:\"和龙市\",222424:\"汪清县\",222426:\"安图县\",222427:\"其它区\",230000:\"黑龙江省\",230100:\"哈尔滨市\",230102:\"道里区\",230103:\"南岗区\",230104:\"道外区\",230106:\"香坊区\",230108:\"平房区\",230109:\"松北区\",230111:\"呼兰区\",230123:\"依兰县\",230124:\"方正县\",230125:\"宾县\",230126:\"巴彦县\",230127:\"木兰县\",230128:\"通河县\",230129:\"延寿县\",230181:\"阿城区\",230182:\"双城市\",230183:\"尚志市\",230184:\"五常市\",230186:\"其它区\",230200:\"齐齐哈尔市\",230202:\"龙沙区\",230203:\"建华区\",230204:\"铁锋区\",230205:\"昂昂溪区\",230206:\"富拉尔基区\",230207:\"碾子山区\",230208:\"梅里斯达斡尔族区\",230221:\"龙江县\",230223:\"依安县\",230224:\"泰来县\",230225:\"甘南县\",230227:\"富裕县\",230229:\"克山县\",230230:\"克东县\",230231:\"拜泉县\",230281:\"讷河市\",230282:\"其它区\",230300:\"鸡西市\",230302:\"鸡冠区\",230303:\"恒山区\",230304:\"滴道区\",230305:\"梨树区\",230306:\"城子河区\",230307:\"麻山区\",230321:\"鸡东县\",230381:\"虎林市\",230382:\"密山市\",230383:\"其它区\",230400:\"鹤岗市\",230402:\"向阳区\",230403:\"工农区\",230404:\"南山区\",230405:\"兴安区\",230406:\"东山区\",230407:\"兴山区\",230421:\"萝北县\",230422:\"绥滨县\",230423:\"其它区\",230500:\"双鸭山市\",230502:\"尖山区\",230503:\"岭东区\",230505:\"四方台区\",230506:\"宝山区\",230521:\"集贤县\",230522:\"友谊县\",230523:\"宝清县\",230524:\"饶河县\",230525:\"其它区\",230600:\"大庆市\",230602:\"萨尔图区\",230603:\"龙凤区\",230604:\"让胡路区\",230605:\"红岗区\",230606:\"大同区\",230621:\"肇州县\",230622:\"肇源县\",230623:\"林甸县\",230624:\"杜尔伯特蒙古族自治县\",230625:\"其它区\",230700:\"伊春市\",230702:\"伊春区\",230703:\"南岔区\",230704:\"友好区\",230705:\"西林区\",230706:\"翠峦区\",230707:\"新青区\",230708:\"美溪区\",230709:\"金山屯区\",230710:\"五营区\",230711:\"乌马河区\",230712:\"汤旺河区\",230713:\"带岭区\",230714:\"乌伊岭区\",230715:\"红星区\",230716:\"上甘岭区\",230722:\"嘉荫县\",230781:\"铁力市\",230782:\"其它区\",230800:\"佳木斯市\",230803:\"向阳区\",230804:\"前进区\",230805:\"东风区\",230811:\"郊区\",230822:\"桦南县\",230826:\"桦川县\",230828:\"汤原县\",230833:\"抚远县\",230881:\"同江市\",230882:\"富锦市\",230883:\"其它区\",230900:\"七台河市\",230902:\"新兴区\",230903:\"桃山区\",230904:\"茄子河区\",230921:\"勃利县\",230922:\"其它区\",231000:\"牡丹江市\",231002:\"东安区\",231003:\"阳明区\",231004:\"爱民区\",231005:\"西安区\",231024:\"东宁县\",231025:\"林口县\",231081:\"绥芬河市\",231083:\"海林市\",231084:\"宁安市\",231085:\"穆棱市\",231086:\"其它区\",231100:\"黑河市\",231102:\"爱辉区\",231121:\"嫩江县\",231123:\"逊克县\",231124:\"孙吴县\",231181:\"北安市\",231182:\"五大连池市\",231183:\"其它区\",231200:\"绥化市\",231202:\"北林区\",231221:\"望奎县\",231222:\"兰西县\",231223:\"青冈县\",231224:\"庆安县\",231225:\"明水县\",231226:\"绥棱县\",231281:\"安达市\",231282:\"肇东市\",231283:\"海伦市\",231284:\"其它区\",232700:\"大兴安岭地区\",232702:\"松岭区\",232703:\"新林区\",232704:\"呼中区\",232721:\"呼玛县\",232722:\"塔河县\",232723:\"漠河县\",232724:\"加格达奇区\",232725:\"其它区\",310000:\"上海\",310100:\"上海市\",310101:\"黄浦区\",310104:\"徐汇区\",310105:\"长宁区\",310106:\"静安区\",310107:\"普陀区\",310108:\"闸北区\",310109:\"虹口区\",310110:\"杨浦区\",310112:\"闵行区\",310113:\"宝山区\",310114:\"嘉定区\",310115:\"浦东新区\",310116:\"金山区\",310117:\"松江区\",310118:\"青浦区\",310120:\"奉贤区\",310230:\"崇明县\",310231:\"其它区\",320000:\"江苏省\",320100:\"南京市\",320102:\"玄武区\",320104:\"秦淮区\",320105:\"建邺区\",320106:\"鼓楼区\",320111:\"浦口区\",320113:\"栖霞区\",320114:\"雨花台区\",320115:\"江宁区\",320116:\"六合区\",320124:\"溧水区\",320125:\"高淳区\",320126:\"其它区\",320200:\"无锡市\",320202:\"崇安区\",320203:\"南长区\",320204:\"北塘区\",320205:\"锡山区\",320206:\"惠山区\",320211:\"滨湖区\",320281:\"江阴市\",320282:\"宜兴市\",320297:\"其它区\",320300:\"徐州市\",320302:\"鼓楼区\",320303:\"云龙区\",320305:\"贾汪区\",320311:\"泉山区\",320321:\"丰县\",320322:\"沛县\",320323:\"铜山区\",320324:\"睢宁县\",320381:\"新沂市\",320382:\"邳州市\",320383:\"其它区\",320400:\"常州市\",320402:\"天宁区\",320404:\"钟楼区\",320405:\"戚墅堰区\",320411:\"新北区\",320412:\"武进区\",320481:\"溧阳市\",320482:\"金坛市\",320483:\"其它区\",320500:\"苏州市\",320505:\"虎丘区\",320506:\"吴中区\",320507:\"相城区\",320508:\"姑苏区\",320581:\"常熟市\",320582:\"张家港市\",320583:\"昆山市\",320584:\"吴江区\",320585:\"太仓市\",320596:\"其它区\",320600:\"南通市\",320602:\"崇川区\",320611:\"港闸区\",320612:\"通州区\",320621:\"海安县\",320623:\"如东县\",320681:\"启东市\",320682:\"如皋市\",320684:\"海门市\",320694:\"其它区\",320700:\"连云港市\",320703:\"连云区\",320705:\"新浦区\",320706:\"海州区\",320721:\"赣榆县\",320722:\"东海县\",320723:\"灌云县\",320724:\"灌南县\",320725:\"其它区\",320800:\"淮安市\",320802:\"清河区\",320803:\"淮安区\",320804:\"淮阴区\",320811:\"清浦区\",320826:\"涟水县\",320829:\"洪泽县\",320830:\"盱眙县\",320831:\"金湖县\",320832:\"其它区\",320900:\"盐城市\",320902:\"亭湖区\",320903:\"盐都区\",320921:\"响水县\",320922:\"滨海县\",320923:\"阜宁县\",320924:\"射阳县\",320925:\"建湖县\",320981:\"东台市\",320982:\"大丰市\",320983:\"其它区\",321000:\"扬州市\",321002:\"广陵区\",321003:\"邗江区\",321023:\"宝应县\",321081:\"仪征市\",321084:\"高邮市\",321088:\"江都区\",321093:\"其它区\",321100:\"镇江市\",321102:\"京口区\",321111:\"润州区\",321112:\"丹徒区\",321181:\"丹阳市\",321182:\"扬中市\",321183:\"句容市\",321184:\"其它区\",321200:\"泰州市\",321202:\"海陵区\",321203:\"高港区\",321281:\"兴化市\",321282:\"靖江市\",321283:\"泰兴市\",321284:\"姜堰区\",321285:\"其它区\",321300:\"宿迁市\",321302:\"宿城区\",321311:\"宿豫区\",321322:\"沭阳县\",321323:\"泗阳县\",321324:\"泗洪县\",321325:\"其它区\",330000:\"浙江省\",330100:\"杭州市\",330102:\"上城区\",330103:\"下城区\",330104:\"江干区\",330105:\"拱墅区\",330106:\"西湖区\",330108:\"滨江区\",330109:\"萧山区\",330110:\"余杭区\",330122:\"桐庐县\",330127:\"淳安县\",330182:\"建德市\",330183:\"富阳市\",330185:\"临安市\",330186:\"其它区\",330200:\"宁波市\",330203:\"海曙区\",330204:\"江东区\",330205:\"江北区\",330206:\"北仑区\",330211:\"镇海区\",330212:\"鄞州区\",330225:\"象山县\",330226:\"宁海县\",330281:\"余姚市\",330282:\"慈溪市\",330283:\"奉化市\",330284:\"其它区\",330300:\"温州市\",330302:\"鹿城区\",330303:\"龙湾区\",330304:\"瓯海区\",330322:\"洞头县\",330324:\"永嘉县\",330326:\"平阳县\",330327:\"苍南县\",330328:\"文成县\",330329:\"泰顺县\",330381:\"瑞安市\",330382:\"乐清市\",330383:\"其它区\",330400:\"嘉兴市\",330402:\"南湖区\",330411:\"秀洲区\",330421:\"嘉善县\",330424:\"海盐县\",330481:\"海宁市\",330482:\"平湖市\",330483:\"桐乡市\",330484:\"其它区\",330500:\"湖州市\",330502:\"吴兴区\",330503:\"南浔区\",330521:\"德清县\",330522:\"长兴县\",330523:\"安吉县\",330524:\"其它区\",330600:\"绍兴市\",330602:\"越城区\",330621:\"绍兴县\",330624:\"新昌县\",330681:\"诸暨市\",330682:\"上虞市\",330683:\"嵊州市\",330684:\"其它区\",330700:\"金华市\",330702:\"婺城区\",330703:\"金东区\",330723:\"武义县\",330726:\"浦江县\",330727:\"磐安县\",330781:\"兰溪市\",330782:\"义乌市\",330783:\"东阳市\",330784:\"永康市\",330785:\"其它区\",330800:\"衢州市\",330802:\"柯城区\",330803:\"衢江区\",330822:\"常山县\",330824:\"开化县\",330825:\"龙游县\",330881:\"江山市\",330882:\"其它区\",330900:\"舟山市\",330902:\"定海区\",330903:\"普陀区\",330921:\"岱山县\",330922:\"嵊泗县\",330923:\"其它区\",331000:\"台州市\",331002:\"椒江区\",331003:\"黄岩区\",331004:\"路桥区\",331021:\"玉环县\",331022:\"三门县\",331023:\"天台县\",331024:\"仙居县\",331081:\"温岭市\",331082:\"临海市\",331083:\"其它区\",331100:\"丽水市\",331102:\"莲都区\",331121:\"青田县\",331122:\"缙云县\",331123:\"遂昌县\",331124:\"松阳县\",331125:\"云和县\",331126:\"庆元县\",331127:\"景宁畲族自治县\",331181:\"龙泉市\",331182:\"其它区\",340000:\"安徽省\",340100:\"合肥市\",340102:\"瑶海区\",340103:\"庐阳区\",340104:\"蜀山区\",340111:\"包河区\",340121:\"长丰县\",340122:\"肥东县\",340123:\"肥西县\",340192:\"其它区\",340200:\"芜湖市\",340202:\"镜湖区\",340203:\"弋江区\",340207:\"鸠江区\",340208:\"三山区\",340221:\"芜湖县\",340222:\"繁昌县\",340223:\"南陵县\",340224:\"其它区\",340300:\"蚌埠市\",340302:\"龙子湖区\",340303:\"蚌山区\",340304:\"禹会区\",340311:\"淮上区\",340321:\"怀远县\",340322:\"五河县\",340323:\"固镇县\",340324:\"其它区\",340400:\"淮南市\",340402:\"大通区\",340403:\"田家庵区\",340404:\"谢家集区\",340405:\"八公山区\",340406:\"潘集区\",340421:\"凤台县\",340422:\"其它区\",340500:\"马鞍山市\",340503:\"花山区\",340504:\"雨山区\",340506:\"博望区\",340521:\"当涂县\",340522:\"其它区\",340600:\"淮北市\",340602:\"杜集区\",340603:\"相山区\",340604:\"烈山区\",340621:\"濉溪县\",340622:\"其它区\",340700:\"铜陵市\",340702:\"铜官山区\",340703:\"狮子山区\",340711:\"郊区\",340721:\"铜陵县\",340722:\"其它区\",340800:\"安庆市\",340802:\"迎江区\",340803:\"大观区\",340811:\"宜秀区\",340822:\"怀宁县\",340823:\"枞阳县\",340824:\"潜山县\",340825:\"太湖县\",340826:\"宿松县\",340827:\"望江县\",340828:\"岳西县\",340881:\"桐城市\",340882:\"其它区\",341000:\"黄山市\",341002:\"屯溪区\",341003:\"黄山区\",341004:\"徽州区\",341021:\"歙县\",341022:\"休宁县\",341023:\"黟县\",341024:\"祁门县\",341025:\"其它区\",341100:\"滁州市\",341102:\"琅琊区\",341103:\"南谯区\",341122:\"来安县\",341124:\"全椒县\",341125:\"定远县\",341126:\"凤阳县\",341181:\"天长市\",341182:\"明光市\",341183:\"其它区\",341200:\"阜阳市\",341202:\"颍州区\",341203:\"颍东区\",341204:\"颍泉区\",341221:\"临泉县\",341222:\"太和县\",341225:\"阜南县\",341226:\"颍上县\",341282:\"界首市\",341283:\"其它区\",341300:\"宿州市\",341302:\"埇桥区\",341321:\"砀山县\",341322:\"萧县\",341323:\"灵璧县\",341324:\"泗县\",341325:\"其它区\",341400:\"巢湖市\",341421:\"庐江县\",341422:\"无为县\",341423:\"含山县\",341424:\"和县\",341500:\"六安市\",341502:\"金安区\",341503:\"裕安区\",341521:\"寿县\",341522:\"霍邱县\",341523:\"舒城县\",341524:\"金寨县\",341525:\"霍山县\",341526:\"其它区\",341600:\"亳州市\",341602:\"谯城区\",341621:\"涡阳县\",341622:\"蒙城县\",341623:\"利辛县\",341624:\"其它区\",341700:\"池州市\",341702:\"贵池区\",341721:\"东至县\",341722:\"石台县\",341723:\"青阳县\",341724:\"其它区\",341800:\"宣城市\",341802:\"宣州区\",341821:\"郎溪县\",341822:\"广德县\",341823:\"泾县\",341824:\"绩溪县\",341825:\"旌德县\",341881:\"宁国市\",341882:\"其它区\",350000:\"福建省\",350100:\"福州市\",350102:\"鼓楼区\",350103:\"台江区\",350104:\"仓山区\",350105:\"马尾区\",350111:\"晋安区\",350121:\"闽侯县\",350122:\"连江县\",350123:\"罗源县\",350124:\"闽清县\",350125:\"永泰县\",350128:\"平潭县\",350181:\"福清市\",350182:\"长乐市\",350183:\"其它区\",350200:\"厦门市\",350203:\"思明区\",350205:\"海沧区\",350206:\"湖里区\",350211:\"集美区\",350212:\"同安区\",350213:\"翔安区\",350214:\"其它区\",350300:\"莆田市\",350302:\"城厢区\",350303:\"涵江区\",350304:\"荔城区\",350305:\"秀屿区\",350322:\"仙游县\",350323:\"其它区\",350400:\"三明市\",350402:\"梅列区\",350403:\"三元区\",350421:\"明溪县\",350423:\"清流县\",350424:\"宁化县\",350425:\"大田县\",350426:\"尤溪县\",350427:\"沙县\",350428:\"将乐县\",350429:\"泰宁县\",350430:\"建宁县\",350481:\"永安市\",350482:\"其它区\",350500:\"泉州市\",350502:\"鲤城区\",350503:\"丰泽区\",350504:\"洛江区\",350505:\"泉港区\",350521:\"惠安县\",350524:\"安溪县\",350525:\"永春县\",350526:\"德化县\",350527:\"金门县\",350581:\"石狮市\",350582:\"晋江市\",350583:\"南安市\",350584:\"其它区\",350600:\"漳州市\",350602:\"芗城区\",350603:\"龙文区\",350622:\"云霄县\",350623:\"漳浦县\",350624:\"诏安县\",350625:\"长泰县\",350626:\"东山县\",350627:\"南靖县\",350628:\"平和县\",350629:\"华安县\",350681:\"龙海市\",350682:\"其它区\",350700:\"南平市\",350702:\"延平区\",350721:\"顺昌县\",350722:\"浦城县\",350723:\"光泽县\",350724:\"松溪县\",350725:\"政和县\",350781:\"邵武市\",350782:\"武夷山市\",350783:\"建瓯市\",350784:\"建阳市\",350785:\"其它区\",350800:\"龙岩市\",350802:\"新罗区\",350821:\"长汀县\",350822:\"永定县\",350823:\"上杭县\",350824:\"武平县\",350825:\"连城县\",350881:\"漳平市\",350882:\"其它区\",350900:\"宁德市\",350902:\"蕉城区\",350921:\"霞浦县\",350922:\"古田县\",350923:\"屏南县\",350924:\"寿宁县\",350925:\"周宁县\",350926:\"柘荣县\",350981:\"福安市\",350982:\"福鼎市\",350983:\"其它区\",360000:\"江西省\",360100:\"南昌市\",360102:\"东湖区\",360103:\"西湖区\",360104:\"青云谱区\",360105:\"湾里区\",360111:\"青山湖区\",360121:\"南昌县\",360122:\"新建县\",360123:\"安义县\",360124:\"进贤县\",360128:\"其它区\",360200:\"景德镇市\",360202:\"昌江区\",360203:\"珠山区\",360222:\"浮梁县\",360281:\"乐平市\",360282:\"其它区\",360300:\"萍乡市\",360302:\"安源区\",360313:\"湘东区\",360321:\"莲花县\",360322:\"上栗县\",360323:\"芦溪县\",360324:\"其它区\",360400:\"九江市\",360402:\"庐山区\",360403:\"浔阳区\",360421:\"九江县\",360423:\"武宁县\",360424:\"修水县\",360425:\"永修县\",360426:\"德安县\",360427:\"星子县\",360428:\"都昌县\",360429:\"湖口县\",360430:\"彭泽县\",360481:\"瑞昌市\",360482:\"其它区\",360483:\"共青城市\",360500:\"新余市\",360502:\"渝水区\",360521:\"分宜县\",360522:\"其它区\",360600:\"鹰潭市\",360602:\"月湖区\",360622:\"余江县\",360681:\"贵溪市\",360682:\"其它区\",360700:\"赣州市\",360702:\"章贡区\",360721:\"赣县\",360722:\"信丰县\",360723:\"大余县\",360724:\"上犹县\",360725:\"崇义县\",360726:\"安远县\",360727:\"龙南县\",360728:\"定南县\",360729:\"全南县\",360730:\"宁都县\",360731:\"于都县\",360732:\"兴国县\",360733:\"会昌县\",360734:\"寻乌县\",360735:\"石城县\",360781:\"瑞金市\",360782:\"南康市\",360783:\"其它区\",360800:\"吉安市\",360802:\"吉州区\",360803:\"青原区\",360821:\"吉安县\",360822:\"吉水县\",360823:\"峡江县\",360824:\"新干县\",360825:\"永丰县\",360826:\"泰和县\",360827:\"遂川县\",360828:\"万安县\",360829:\"安福县\",360830:\"永新县\",360881:\"井冈山市\",360882:\"其它区\",360900:\"宜春市\",360902:\"袁州区\",360921:\"奉新县\",360922:\"万载县\",360923:\"上高县\",360924:\"宜丰县\",360925:\"靖安县\",360926:\"铜鼓县\",360981:\"丰城市\",360982:\"樟树市\",360983:\"高安市\",360984:\"其它区\",361000:\"抚州市\",361002:\"临川区\",361021:\"南城县\",361022:\"黎川县\",361023:\"南丰县\",361024:\"崇仁县\",361025:\"乐安县\",361026:\"宜黄县\",361027:\"金溪县\",361028:\"资溪县\",361029:\"东乡县\",361030:\"广昌县\",361031:\"其它区\",361100:\"上饶市\",361102:\"信州区\",361121:\"上饶县\",361122:\"广丰县\",361123:\"玉山县\",361124:\"铅山县\",361125:\"横峰县\",361126:\"弋阳县\",361127:\"余干县\",361128:\"鄱阳县\",361129:\"万年县\",361130:\"婺源县\",361181:\"德兴市\",361182:\"其它区\",370000:\"山东省\",370100:\"济南市\",370102:\"历下区\",370103:\"市中区\",370104:\"槐荫区\",370105:\"天桥区\",370112:\"历城区\",370113:\"长清区\",370124:\"平阴县\",370125:\"济阳县\",370126:\"商河县\",370181:\"章丘市\",370182:\"其它区\",370200:\"青岛市\",370202:\"市南区\",370203:\"市北区\",370211:\"黄岛区\",370212:\"崂山区\",370213:\"李沧区\",370214:\"城阳区\",370281:\"胶州市\",370282:\"即墨市\",370283:\"平度市\",370285:\"莱西市\",370286:\"其它区\",370300:\"淄博市\",370302:\"淄川区\",370303:\"张店区\",370304:\"博山区\",370305:\"临淄区\",370306:\"周村区\",370321:\"桓台县\",370322:\"高青县\",370323:\"沂源县\",370324:\"其它区\",370400:\"枣庄市\",370402:\"市中区\",370403:\"薛城区\",370404:\"峄城区\",370405:\"台儿庄区\",370406:\"山亭区\",370481:\"滕州市\",370482:\"其它区\",370500:\"东营市\",370502:\"东营区\",370503:\"河口区\",370521:\"垦利县\",370522:\"利津县\",370523:\"广饶县\",370591:\"其它区\",370600:\"烟台市\",370602:\"芝罘区\",370611:\"福山区\",370612:\"牟平区\",370613:\"莱山区\",370634:\"长岛县\",370681:\"龙口市\",370682:\"莱阳市\",370683:\"莱州市\",370684:\"蓬莱市\",370685:\"招远市\",370686:\"栖霞市\",370687:\"海阳市\",370688:\"其它区\",370700:\"潍坊市\",370702:\"潍城区\",370703:\"寒亭区\",370704:\"坊子区\",370705:\"奎文区\",370724:\"临朐县\",370725:\"昌乐县\",370781:\"青州市\",370782:\"诸城市\",370783:\"寿光市\",370784:\"安丘市\",370785:\"高密市\",370786:\"昌邑市\",370787:\"其它区\",370800:\"济宁市\",370802:\"市中区\",370811:\"任城区\",370826:\"微山县\",370827:\"鱼台县\",370828:\"金乡县\",370829:\"嘉祥县\",370830:\"汶上县\",370831:\"泗水县\",370832:\"梁山县\",370881:\"曲阜市\",370882:\"兖州市\",370883:\"邹城市\",370884:\"其它区\",370900:\"泰安市\",370902:\"泰山区\",370903:\"岱岳区\",370921:\"宁阳县\",370923:\"东平县\",370982:\"新泰市\",370983:\"肥城市\",370984:\"其它区\",371000:\"威海市\",371002:\"环翠区\",371081:\"文登市\",371082:\"荣成市\",371083:\"乳山市\",371084:\"其它区\",371100:\"日照市\",371102:\"东港区\",371103:\"岚山区\",371121:\"五莲县\",371122:\"莒县\",371123:\"其它区\",371200:\"莱芜市\",371202:\"莱城区\",371203:\"钢城区\",371204:\"其它区\",371300:\"临沂市\",371302:\"兰山区\",371311:\"罗庄区\",371312:\"河东区\",371321:\"沂南县\",371322:\"郯城县\",371323:\"沂水县\",371324:\"苍山县\",371325:\"费县\",371326:\"平邑县\",371327:\"莒南县\",371328:\"蒙阴县\",371329:\"临沭县\",371330:\"其它区\",371400:\"德州市\",371402:\"德城区\",371421:\"陵县\",371422:\"宁津县\",371423:\"庆云县\",371424:\"临邑县\",371425:\"齐河县\",371426:\"平原县\",371427:\"夏津县\",371428:\"武城县\",371481:\"乐陵市\",371482:\"禹城市\",371483:\"其它区\",371500:\"聊城市\",371502:\"东昌府区\",371521:\"阳谷县\",371522:\"莘县\",371523:\"茌平县\",371524:\"东阿县\",371525:\"冠县\",371526:\"高唐县\",371581:\"临清市\",371582:\"其它区\",371600:\"滨州市\",371602:\"滨城区\",371621:\"惠民县\",371622:\"阳信县\",371623:\"无棣县\",371624:\"沾化县\",371625:\"博兴县\",371626:\"邹平县\",371627:\"其它区\",371700:\"菏泽市\",371702:\"牡丹区\",371721:\"曹县\",371722:\"单县\",371723:\"成武县\",371724:\"巨野县\",371725:\"郓城县\",371726:\"鄄城县\",371727:\"定陶县\",371728:\"东明县\",371729:\"其它区\",410000:\"河南省\",410100:\"郑州市\",410102:\"中原区\",410103:\"二七区\",410104:\"管城回族区\",410105:\"金水区\",410106:\"上街区\",410108:\"惠济区\",410122:\"中牟县\",410181:\"巩义市\",410182:\"荥阳市\",410183:\"新密市\",410184:\"新郑市\",410185:\"登封市\",410188:\"其它区\",410200:\"开封市\",410202:\"龙亭区\",410203:\"顺河回族区\",410204:\"鼓楼区\",410205:\"禹王台区\",410211:\"金明区\",410221:\"杞县\",410222:\"通许县\",410223:\"尉氏县\",410224:\"开封县\",410225:\"兰考县\",410226:\"其它区\",410300:\"洛阳市\",410302:\"老城区\",410303:\"西工区\",410304:\"瀍河回族区\",410305:\"涧西区\",410306:\"吉利区\",410307:\"洛龙区\",410322:\"孟津县\",410323:\"新安县\",410324:\"栾川县\",410325:\"嵩县\",410326:\"汝阳县\",410327:\"宜阳县\",410328:\"洛宁县\",410329:\"伊川县\",410381:\"偃师市\",410400:\"平顶山市\",410402:\"新华区\",410403:\"卫东区\",410404:\"石龙区\",410411:\"湛河区\",410421:\"宝丰县\",410422:\"叶县\",410423:\"鲁山县\",410425:\"郏县\",410481:\"舞钢市\",410482:\"汝州市\",410483:\"其它区\",410500:\"安阳市\",410502:\"文峰区\",410503:\"北关区\",410505:\"殷都区\",410506:\"龙安区\",410522:\"安阳县\",410523:\"汤阴县\",410526:\"滑县\",410527:\"内黄县\",410581:\"林州市\",410582:\"其它区\",410600:\"鹤壁市\",410602:\"鹤山区\",410603:\"山城区\",410611:\"淇滨区\",410621:\"浚县\",410622:\"淇县\",410623:\"其它区\",410700:\"新乡市\",410702:\"红旗区\",410703:\"卫滨区\",410704:\"凤泉区\",410711:\"牧野区\",410721:\"新乡县\",410724:\"获嘉县\",410725:\"原阳县\",410726:\"延津县\",410727:\"封丘县\",410728:\"长垣县\",410781:\"卫辉市\",410782:\"辉县市\",410783:\"其它区\",410800:\"焦作市\",410802:\"解放区\",410803:\"中站区\",410804:\"马村区\",410811:\"山阳区\",410821:\"修武县\",410822:\"博爱县\",410823:\"武陟县\",410825:\"温县\",410881:\"济源市\",410882:\"沁阳市\",410883:\"孟州市\",410884:\"其它区\",410900:\"濮阳市\",410902:\"华龙区\",410922:\"清丰县\",410923:\"南乐县\",410926:\"范县\",410927:\"台前县\",410928:\"濮阳县\",410929:\"其它区\",411000:\"许昌市\",411002:\"魏都区\",411023:\"许昌县\",411024:\"鄢陵县\",411025:\"襄城县\",411081:\"禹州市\",411082:\"长葛市\",411083:\"其它区\",411100:\"漯河市\",411102:\"源汇区\",411103:\"郾城区\",411104:\"召陵区\",411121:\"舞阳县\",411122:\"临颍县\",411123:\"其它区\",411200:\"三门峡市\",411202:\"湖滨区\",411221:\"渑池县\",411222:\"陕县\",411224:\"卢氏县\",411281:\"义马市\",411282:\"灵宝市\",411283:\"其它区\",411300:\"南阳市\",411302:\"宛城区\",411303:\"卧龙区\",411321:\"南召县\",411322:\"方城县\",411323:\"西峡县\",411324:\"镇平县\",411325:\"内乡县\",411326:\"淅川县\",411327:\"社旗县\",411328:\"唐河县\",411329:\"新野县\",411330:\"桐柏县\",411381:\"邓州市\",411382:\"其它区\",411400:\"商丘市\",411402:\"梁园区\",411403:\"睢阳区\",411421:\"民权县\",411422:\"睢县\",411423:\"宁陵县\",411424:\"柘城县\",411425:\"虞城县\",411426:\"夏邑县\",411481:\"永城市\",411482:\"其它区\",411500:\"信阳市\",411502:\"浉河区\",411503:\"平桥区\",411521:\"罗山县\",411522:\"光山县\",411523:\"新县\",411524:\"商城县\",411525:\"固始县\",411526:\"潢川县\",411527:\"淮滨县\",411528:\"息县\",411529:\"其它区\",411600:\"周口市\",411602:\"川汇区\",411621:\"扶沟县\",411622:\"西华县\",411623:\"商水县\",411624:\"沈丘县\",411625:\"郸城县\",411626:\"淮阳县\",411627:\"太康县\",411628:\"鹿邑县\",411681:\"项城市\",411682:\"其它区\",411700:\"驻马店市\",411702:\"驿城区\",411721:\"西平县\",411722:\"上蔡县\",411723:\"平舆县\",411724:\"正阳县\",411725:\"确山县\",411726:\"泌阳县\",411727:\"汝南县\",411728:\"遂平县\",411729:\"新蔡县\",411730:\"其它区\",420000:\"湖北省\",420100:\"武汉市\",420102:\"江岸区\",420103:\"江汉区\",420104:\"硚口区\",420105:\"汉阳区\",420106:\"武昌区\",420107:\"青山区\",420111:\"洪山区\",420112:\"东西湖区\",420113:\"汉南区\",420114:\"蔡甸区\",420115:\"江夏区\",420116:\"黄陂区\",420117:\"新洲区\",420118:\"其它区\",420200:\"黄石市\",420202:\"黄石港区\",420203:\"西塞山区\",420204:\"下陆区\",420205:\"铁山区\",420222:\"阳新县\",420281:\"大冶市\",420282:\"其它区\",420300:\"十堰市\",420302:\"茅箭区\",420303:\"张湾区\",420321:\"郧县\",420322:\"郧西县\",420323:\"竹山县\",420324:\"竹溪县\",420325:\"房县\",420381:\"丹江口市\",420383:\"其它区\",420500:\"宜昌市\",420502:\"西陵区\",420503:\"伍家岗区\",420504:\"点军区\",420505:\"猇亭区\",420506:\"夷陵区\",420525:\"远安县\",420526:\"兴山县\",420527:\"秭归县\",420528:\"长阳土家族自治县\",420529:\"五峰土家族自治县\",420581:\"宜都市\",420582:\"当阳市\",420583:\"枝江市\",420584:\"其它区\",420600:\"襄阳市\",420602:\"襄城区\",420606:\"樊城区\",420607:\"襄州区\",420624:\"南漳县\",420625:\"谷城县\",420626:\"保康县\",420682:\"老河口市\",420683:\"枣阳市\",420684:\"宜城市\",420685:\"其它区\",420700:\"鄂州市\",420702:\"梁子湖区\",420703:\"华容区\",420704:\"鄂城区\",420705:\"其它区\",420800:\"荆门市\",420802:\"东宝区\",420804:\"掇刀区\",420821:\"京山县\",420822:\"沙洋县\",420881:\"钟祥市\",420882:\"其它区\",420900:\"孝感市\",420902:\"孝南区\",420921:\"孝昌县\",420922:\"大悟县\",420923:\"云梦县\",420981:\"应城市\",420982:\"安陆市\",420984:\"汉川市\",420985:\"其它区\",421000:\"荆州市\",421002:\"沙市区\",421003:\"荆州区\",421022:\"公安县\",421023:\"监利县\",421024:\"江陵县\",421081:\"石首市\",421083:\"洪湖市\",421087:\"松滋市\",421088:\"其它区\",421100:\"黄冈市\",421102:\"黄州区\",421121:\"团风县\",421122:\"红安县\",421123:\"罗田县\",421124:\"英山县\",421125:\"浠水县\",421126:\"蕲春县\",421127:\"黄梅县\",421181:\"麻城市\",421182:\"武穴市\",421183:\"其它区\",421200:\"咸宁市\",421202:\"咸安区\",421221:\"嘉鱼县\",421222:\"通城县\",421223:\"崇阳县\",421224:\"通山县\",421281:\"赤壁市\",421283:\"其它区\",421300:\"随州市\",421302:\"曾都区\",421321:\"随县\",421381:\"广水市\",421382:\"其它区\",422800:\"恩施土家族苗族自治州\",422801:\"恩施市\",422802:\"利川市\",422822:\"建始县\",422823:\"巴东县\",422825:\"宣恩县\",422826:\"咸丰县\",422827:\"来凤县\",422828:\"鹤峰县\",422829:\"其它区\",429004:\"仙桃市\",429005:\"潜江市\",429006:\"天门市\",429021:\"神农架林区\",430000:\"湖南省\",430100:\"长沙市\",430102:\"芙蓉区\",430103:\"天心区\",430104:\"岳麓区\",430105:\"开福区\",430111:\"雨花区\",430121:\"长沙县\",430122:\"望城区\",430124:\"宁乡县\",430181:\"浏阳市\",430182:\"其它区\",430200:\"株洲市\",430202:\"荷塘区\",430203:\"芦淞区\",430204:\"石峰区\",430211:\"天元区\",430221:\"株洲县\",430223:\"攸县\",430224:\"茶陵县\",430225:\"炎陵县\",430281:\"醴陵市\",430282:\"其它区\",430300:\"湘潭市\",430302:\"雨湖区\",430304:\"岳塘区\",430321:\"湘潭县\",430381:\"湘乡市\",430382:\"韶山市\",430383:\"其它区\",430400:\"衡阳市\",430405:\"珠晖区\",430406:\"雁峰区\",430407:\"石鼓区\",430408:\"蒸湘区\",430412:\"南岳区\",430421:\"衡阳县\",430422:\"衡南县\",430423:\"衡山县\",430424:\"衡东县\",430426:\"祁东县\",430481:\"耒阳市\",430482:\"常宁市\",430483:\"其它区\",430500:\"邵阳市\",430502:\"双清区\",430503:\"大祥区\",430511:\"北塔区\",430521:\"邵东县\",430522:\"新邵县\",430523:\"邵阳县\",430524:\"隆回县\",430525:\"洞口县\",430527:\"绥宁县\",430528:\"新宁县\",430529:\"城步苗族自治县\",430581:\"武冈市\",430582:\"其它区\",430600:\"岳阳市\",430602:\"岳阳楼区\",430603:\"云溪区\",430611:\"君山区\",430621:\"岳阳县\",430623:\"华容县\",430624:\"湘阴县\",430626:\"平江县\",430681:\"汨罗市\",430682:\"临湘市\",430683:\"其它区\",430700:\"常德市\",430702:\"武陵区\",430703:\"鼎城区\",430721:\"安乡县\",430722:\"汉寿县\",430723:\"澧县\",430724:\"临澧县\",430725:\"桃源县\",430726:\"石门县\",430781:\"津市市\",430782:\"其它区\",430800:\"张家界市\",430802:\"永定区\",430811:\"武陵源区\",430821:\"慈利县\",430822:\"桑植县\",430823:\"其它区\",430900:\"益阳市\",430902:\"资阳区\",430903:\"赫山区\",430921:\"南县\",430922:\"桃江县\",430923:\"安化县\",430981:\"沅江市\",430982:\"其它区\",431000:\"郴州市\",431002:\"北湖区\",431003:\"苏仙区\",431021:\"桂阳县\",431022:\"宜章县\",431023:\"永兴县\",431024:\"嘉禾县\",431025:\"临武县\",431026:\"汝城县\",431027:\"桂东县\",431028:\"安仁县\",431081:\"资兴市\",431082:\"其它区\",431100:\"永州市\",431102:\"零陵区\",431103:\"冷水滩区\",431121:\"祁阳县\",431122:\"东安县\",431123:\"双牌县\",431124:\"道县\",431125:\"江永县\",431126:\"宁远县\",431127:\"蓝山县\",431128:\"新田县\",431129:\"江华瑶族自治县\",431130:\"其它区\",431200:\"怀化市\",431202:\"鹤城区\",431221:\"中方县\",431222:\"沅陵县\",431223:\"辰溪县\",431224:\"溆浦县\",431225:\"会同县\",431226:\"麻阳苗族自治县\",431227:\"新晃侗族自治县\",431228:\"芷江侗族自治县\",431229:\"靖州苗族侗族自治县\",431230:\"通道侗族自治县\",431281:\"洪江市\",431282:\"其它区\",431300:\"娄底市\",431302:\"娄星区\",431321:\"双峰县\",431322:\"新化县\",431381:\"冷水江市\",431382:\"涟源市\",431383:\"其它区\",433100:\"湘西土家族苗族自治州\",433101:\"吉首市\",433122:\"泸溪县\",433123:\"凤凰县\",433124:\"花垣县\",433125:\"保靖县\",433126:\"古丈县\",433127:\"永顺县\",433130:\"龙山县\",433131:\"其它区\",440000:\"广东省\",440100:\"广州市\",440103:\"荔湾区\",440104:\"越秀区\",440105:\"海珠区\",440106:\"天河区\",440111:\"白云区\",440112:\"黄埔区\",440113:\"番禺区\",440114:\"花都区\",440115:\"南沙区\",440116:\"萝岗区\",440183:\"增城市\",440184:\"从化市\",440189:\"其它区\",440200:\"韶关市\",440203:\"武江区\",440204:\"浈江区\",440205:\"曲江区\",440222:\"始兴县\",440224:\"仁化县\",440229:\"翁源县\",440232:\"乳源瑶族自治县\",440233:\"新丰县\",440281:\"乐昌市\",440282:\"南雄市\",440283:\"其它区\",440300:\"深圳市\",440303:\"罗湖区\",440304:\"福田区\",440305:\"南山区\",440306:\"宝安区\",440307:\"龙岗区\",440308:\"盐田区\",440309:\"其它区\",440320:\"光明新区\",440321:\"坪山新区\",440322:\"大鹏新区\",440323:\"龙华新区\",440400:\"珠海市\",440402:\"香洲区\",440403:\"斗门区\",440404:\"金湾区\",440488:\"其它区\",440500:\"汕头市\",440507:\"龙湖区\",440511:\"金平区\",440512:\"濠江区\",440513:\"潮阳区\",440514:\"潮南区\",440515:\"澄海区\",440523:\"南澳县\",440524:\"其它区\",440600:\"佛山市\",440604:\"禅城区\",440605:\"南海区\",440606:\"顺德区\",440607:\"三水区\",440608:\"高明区\",440609:\"其它区\",440700:\"江门市\",440703:\"蓬江区\",440704:\"江海区\",440705:\"新会区\",440781:\"台山市\",440783:\"开平市\",440784:\"鹤山市\",440785:\"恩平市\",440786:\"其它区\",440800:\"湛江市\",440802:\"赤坎区\",440803:\"霞山区\",440804:\"坡头区\",440811:\"麻章区\",440823:\"遂溪县\",440825:\"徐闻县\",440881:\"廉江市\",440882:\"雷州市\",440883:\"吴川市\",440884:\"其它区\",440900:\"茂名市\",440902:\"茂南区\",440903:\"茂港区\",440923:\"电白县\",440981:\"高州市\",440982:\"化州市\",440983:\"信宜市\",440984:\"其它区\",441200:\"肇庆市\",441202:\"端州区\",441203:\"鼎湖区\",441223:\"广宁县\",441224:\"怀集县\",441225:\"封开县\",441226:\"德庆县\",441283:\"高要市\",441284:\"四会市\",441285:\"其它区\",441300:\"惠州市\",441302:\"惠城区\",441303:\"惠阳区\",441322:\"博罗县\",441323:\"惠东县\",441324:\"龙门县\",441325:\"其它区\",441400:\"梅州市\",441402:\"梅江区\",441421:\"梅县\",441422:\"大埔县\",441423:\"丰顺县\",441424:\"五华县\",441426:\"平远县\",441427:\"蕉岭县\",441481:\"兴宁市\",441482:\"其它区\",441500:\"汕尾市\",441502:\"城区\",441521:\"海丰县\",441523:\"陆河县\",441581:\"陆丰市\",441582:\"其它区\",441600:\"河源市\",441602:\"源城区\",441621:\"紫金县\",441622:\"龙川县\",441623:\"连平县\",441624:\"和平县\",441625:\"东源县\",441626:\"其它区\",441700:\"阳江市\",441702:\"江城区\",441721:\"阳西县\",441723:\"阳东县\",441781:\"阳春市\",441782:\"其它区\",441800:\"清远市\",441802:\"清城区\",441821:\"佛冈县\",441823:\"阳山县\",441825:\"连山壮族瑶族自治县\",441826:\"连南瑶族自治县\",441827:\"清新区\",441881:\"英德市\",441882:\"连州市\",441883:\"其它区\",441900:\"东莞市\",442000:\"中山市\",442101:\"东沙群岛\",445100:\"潮州市\",445102:\"湘桥区\",445121:\"潮安区\",445122:\"饶平县\",445186:\"其它区\",445200:\"揭阳市\",445202:\"榕城区\",445221:\"揭东区\",445222:\"揭西县\",445224:\"惠来县\",445281:\"普宁市\",445285:\"其它区\",445300:\"云浮市\",445302:\"云城区\",445321:\"新兴县\",445322:\"郁南县\",445323:\"云安县\",445381:\"罗定市\",445382:\"其它区\",450000:\"广西壮族自治区\",450100:\"南宁市\",450102:\"兴宁区\",450103:\"青秀区\",450105:\"江南区\",450107:\"西乡塘区\",450108:\"良庆区\",450109:\"邕宁区\",450122:\"武鸣县\",450123:\"隆安县\",450124:\"马山县\",450125:\"上林县\",450126:\"宾阳县\",450127:\"横县\",450128:\"其它区\",450200:\"柳州市\",450202:\"城中区\",450203:\"鱼峰区\",450204:\"柳南区\",450205:\"柳北区\",450221:\"柳江县\",450222:\"柳城县\",450223:\"鹿寨县\",450224:\"融安县\",450225:\"融水苗族自治县\",450226:\"三江侗族自治县\",450227:\"其它区\",450300:\"桂林市\",450302:\"秀峰区\",450303:\"叠彩区\",450304:\"象山区\",450305:\"七星区\",450311:\"雁山区\",450321:\"阳朔县\",450322:\"临桂区\",450323:\"灵川县\",450324:\"全州县\",450325:\"兴安县\",450326:\"永福县\",450327:\"灌阳县\",450328:\"龙胜各族自治县\",450329:\"资源县\",450330:\"平乐县\",450331:\"荔浦县\",450332:\"恭城瑶族自治县\",450333:\"其它区\",450400:\"梧州市\",450403:\"万秀区\",450405:\"长洲区\",450406:\"龙圩区\",450421:\"苍梧县\",450422:\"藤县\",450423:\"蒙山县\",450481:\"岑溪市\",450482:\"其它区\",450500:\"北海市\",450502:\"海城区\",450503:\"银海区\",450512:\"铁山港区\",450521:\"合浦县\",450522:\"其它区\",450600:\"防城港市\",450602:\"港口区\",450603:\"防城区\",450621:\"上思县\",450681:\"东兴市\",450682:\"其它区\",450700:\"钦州市\",450702:\"钦南区\",450703:\"钦北区\",450721:\"灵山县\",450722:\"浦北县\",450723:\"其它区\",450800:\"贵港市\",450802:\"港北区\",450803:\"港南区\",450804:\"覃塘区\",450821:\"平南县\",450881:\"桂平市\",450882:\"其它区\",450900:\"玉林市\",450902:\"玉州区\",450903:\"福绵区\",450921:\"容县\",450922:\"陆川县\",450923:\"博白县\",450924:\"兴业县\",450981:\"北流市\",450982:\"其它区\",451000:\"百色市\",451002:\"右江区\",451021:\"田阳县\",451022:\"田东县\",451023:\"平果县\",451024:\"德保县\",451025:\"靖西县\",451026:\"那坡县\",451027:\"凌云县\",451028:\"乐业县\",451029:\"田林县\",451030:\"西林县\",451031:\"隆林各族自治县\",451032:\"其它区\",451100:\"贺州市\",451102:\"八步区\",451119:\"平桂管理区\",451121:\"昭平县\",451122:\"钟山县\",451123:\"富川瑶族自治县\",451124:\"其它区\",451200:\"河池市\",451202:\"金城江区\",451221:\"南丹县\",451222:\"天峨县\",451223:\"凤山县\",451224:\"东兰县\",451225:\"罗城仫佬族自治县\",451226:\"环江毛南族自治县\",451227:\"巴马瑶族自治县\",451228:\"都安瑶族自治县\",451229:\"大化瑶族自治县\",451281:\"宜州市\",451282:\"其它区\",451300:\"来宾市\",451302:\"兴宾区\",451321:\"忻城县\",451322:\"象州县\",451323:\"武宣县\",451324:\"金秀瑶族自治县\",451381:\"合山市\",451382:\"其它区\",451400:\"崇左市\",451402:\"江州区\",451421:\"扶绥县\",451422:\"宁明县\",451423:\"龙州县\",451424:\"大新县\",451425:\"天等县\",451481:\"凭祥市\",451482:\"其它区\",460000:\"海南省\",460100:\"海口市\",460105:\"秀英区\",460106:\"龙华区\",460107:\"琼山区\",460108:\"美兰区\",460109:\"其它区\",460200:\"三亚市\",460300:\"三沙市\",460321:\"西沙群岛\",460322:\"南沙群岛\",460323:\"中沙群岛的岛礁及其海域\",469001:\"五指山市\",469002:\"琼海市\",469003:\"儋州市\",469005:\"文昌市\",469006:\"万宁市\",469007:\"东方市\",469025:\"定安县\",469026:\"屯昌县\",469027:\"澄迈县\",469028:\"临高县\",469030:\"白沙黎族自治县\",469031:\"昌江黎族自治县\",469033:\"乐东黎族自治县\",469034:\"陵水黎族自治县\",469035:\"保亭黎族苗族自治县\",469036:\"琼中黎族苗族自治县\",471005:\"其它区\",500000:\"重庆\",500100:\"重庆市\",500101:\"万州区\",500102:\"涪陵区\",500103:\"渝中区\",500104:\"大渡口区\",500105:\"江北区\",500106:\"沙坪坝区\",500107:\"九龙坡区\",500108:\"南岸区\",500109:\"北碚区\",500110:\"万盛区\",500111:\"双桥区\",500112:\"渝北区\",500113:\"巴南区\",500114:\"黔江区\",500115:\"长寿区\",500222:\"綦江区\",500223:\"潼南县\",500224:\"铜梁县\",500225:\"大足区\",500226:\"荣昌县\",500227:\"璧山县\",500228:\"梁平县\",500229:\"城口县\",500230:\"丰都县\",500231:\"垫江县\",500232:\"武隆县\",500233:\"忠县\",500234:\"开县\",500235:\"云阳县\",500236:\"奉节县\",500237:\"巫山县\",500238:\"巫溪县\",500240:\"石柱土家族自治县\",500241:\"秀山土家族苗族自治县\",500242:\"酉阳土家族苗族自治县\",500243:\"彭水苗族土家族自治县\",500381:\"江津区\",500382:\"合川区\",500383:\"永川区\",500384:\"南川区\",500385:\"其它区\",510000:\"四川省\",510100:\"成都市\",510104:\"锦江区\",510105:\"青羊区\",510106:\"金牛区\",510107:\"武侯区\",510108:\"成华区\",510112:\"龙泉驿区\",510113:\"青白江区\",510114:\"新都区\",510115:\"温江区\",510121:\"金堂县\",510122:\"双流县\",510124:\"郫县\",510129:\"大邑县\",510131:\"蒲江县\",510132:\"新津县\",510181:\"都江堰市\",510182:\"彭州市\",510183:\"邛崃市\",510184:\"崇州市\",510185:\"其它区\",510300:\"自贡市\",510302:\"自流井区\",510303:\"贡井区\",510304:\"大安区\",510311:\"沿滩区\",510321:\"荣县\",510322:\"富顺县\",510323:\"其它区\",510400:\"攀枝花市\",510402:\"东区\",510403:\"西区\",510411:\"仁和区\",510421:\"米易县\",510422:\"盐边县\",510423:\"其它区\",510500:\"泸州市\",510502:\"江阳区\",510503:\"纳溪区\",510504:\"龙马潭区\",510521:\"泸县\",510522:\"合江县\",510524:\"叙永县\",510525:\"古蔺县\",510526:\"其它区\",510600:\"德阳市\",510603:\"旌阳区\",510623:\"中江县\",510626:\"罗江县\",510681:\"广汉市\",510682:\"什邡市\",510683:\"绵竹市\",510684:\"其它区\",510700:\"绵阳市\",510703:\"涪城区\",510704:\"游仙区\",510722:\"三台县\",510723:\"盐亭县\",510724:\"安县\",510725:\"梓潼县\",510726:\"北川羌族自治县\",510727:\"平武县\",510781:\"江油市\",510782:\"其它区\",510800:\"广元市\",510802:\"利州区\",510811:\"昭化区\",510812:\"朝天区\",510821:\"旺苍县\",510822:\"青川县\",510823:\"剑阁县\",510824:\"苍溪县\",510825:\"其它区\",510900:\"遂宁市\",510903:\"船山区\",510904:\"安居区\",510921:\"蓬溪县\",510922:\"射洪县\",510923:\"大英县\",510924:\"其它区\",511000:\"内江市\",511002:\"市中区\",511011:\"东兴区\",511024:\"威远县\",511025:\"资中县\",511028:\"隆昌县\",511029:\"其它区\",511100:\"乐山市\",511102:\"市中区\",511111:\"沙湾区\",511112:\"五通桥区\",511113:\"金口河区\",511123:\"犍为县\",511124:\"井研县\",511126:\"夹江县\",511129:\"沐川县\",511132:\"峨边彝族自治县\",511133:\"马边彝族自治县\",511181:\"峨眉山市\",511182:\"其它区\",511300:\"南充市\",511302:\"顺庆区\",511303:\"高坪区\",511304:\"嘉陵区\",511321:\"南部县\",511322:\"营山县\",511323:\"蓬安县\",511324:\"仪陇县\",511325:\"西充县\",511381:\"阆中市\",511382:\"其它区\",511400:\"眉山市\",511402:\"东坡区\",511421:\"仁寿县\",511422:\"彭山县\",511423:\"洪雅县\",511424:\"丹棱县\",511425:\"青神县\",511426:\"其它区\",511500:\"宜宾市\",511502:\"翠屏区\",511521:\"宜宾县\",511522:\"南溪区\",511523:\"江安县\",511524:\"长宁县\",511525:\"高县\",511526:\"珙县\",511527:\"筠连县\",511528:\"兴文县\",511529:\"屏山县\",511530:\"其它区\",511600:\"广安市\",511602:\"广安区\",511603:\"前锋区\",511621:\"岳池县\",511622:\"武胜县\",511623:\"邻水县\",511681:\"华蓥市\",511683:\"其它区\",511700:\"达州市\",511702:\"通川区\",511721:\"达川区\",511722:\"宣汉县\",511723:\"开江县\",511724:\"大竹县\",511725:\"渠县\",511781:\"万源市\",511782:\"其它区\",511800:\"雅安市\",511802:\"雨城区\",511821:\"名山区\",511822:\"荥经县\",511823:\"汉源县\",511824:\"石棉县\",511825:\"天全县\",511826:\"芦山县\",511827:\"宝兴县\",511828:\"其它区\",511900:\"巴中市\",511902:\"巴州区\",511903:\"恩阳区\",511921:\"通江县\",511922:\"南江县\",511923:\"平昌县\",511924:\"其它区\",512000:\"资阳市\",512002:\"雁江区\",512021:\"安岳县\",512022:\"乐至县\",512081:\"简阳市\",512082:\"其它区\",513200:\"阿坝藏族羌族自治州\",513221:\"汶川县\",513222:\"理县\",513223:\"茂县\",513224:\"松潘县\",513225:\"九寨沟县\",513226:\"金川县\",513227:\"小金县\",513228:\"黑水县\",513229:\"马尔康县\",513230:\"壤塘县\",513231:\"阿坝县\",513232:\"若尔盖县\",513233:\"红原县\",513234:\"其它区\",513300:\"甘孜藏族自治州\",513321:\"康定县\",513322:\"泸定县\",513323:\"丹巴县\",513324:\"九龙县\",513325:\"雅江县\",513326:\"道孚县\",513327:\"炉霍县\",513328:\"甘孜县\",513329:\"新龙县\",513330:\"德格县\",513331:\"白玉县\",513332:\"石渠县\",513333:\"色达县\",513334:\"理塘县\",513335:\"巴塘县\",513336:\"乡城县\",513337:\"稻城县\",513338:\"得荣县\",513339:\"其它区\",513400:\"凉山彝族自治州\",513401:\"西昌市\",513422:\"木里藏族自治县\",513423:\"盐源县\",513424:\"德昌县\",513425:\"会理县\",513426:\"会东县\",513427:\"宁南县\",513428:\"普格县\",513429:\"布拖县\",513430:\"金阳县\",513431:\"昭觉县\",513432:\"喜德县\",513433:\"冕宁县\",513434:\"越西县\",513435:\"甘洛县\",513436:\"美姑县\",513437:\"雷波县\",513438:\"其它区\",520000:\"贵州省\",520100:\"贵阳市\",520102:\"南明区\",520103:\"云岩区\",520111:\"花溪区\",520112:\"乌当区\",520113:\"白云区\",520121:\"开阳县\",520122:\"息烽县\",520123:\"修文县\",520151:\"观山湖区\",520181:\"清镇市\",520182:\"其它区\",520200:\"六盘水市\",520201:\"钟山区\",520203:\"六枝特区\",520221:\"水城县\",520222:\"盘县\",520223:\"其它区\",520300:\"遵义市\",520302:\"红花岗区\",520303:\"汇川区\",520321:\"遵义县\",520322:\"桐梓县\",520323:\"绥阳县\",520324:\"正安县\",520325:\"道真仡佬族苗族自治县\",520326:\"务川仡佬族苗族自治县\",520327:\"凤冈县\",520328:\"湄潭县\",520329:\"余庆县\",520330:\"习水县\",520381:\"赤水市\",520382:\"仁怀市\",520383:\"其它区\",520400:\"安顺市\",520402:\"西秀区\",520421:\"平坝县\",520422:\"普定县\",520423:\"镇宁布依族苗族自治县\",520424:\"关岭布依族苗族自治县\",520425:\"紫云苗族布依族自治县\",520426:\"其它区\",522200:\"铜仁市\",522201:\"碧江区\",522222:\"江口县\",522223:\"玉屏侗族自治县\",522224:\"石阡县\",522225:\"思南县\",522226:\"印江土家族苗族自治县\",522227:\"德江县\",522228:\"沿河土家族自治县\",522229:\"松桃苗族自治县\",522230:\"万山区\",522231:\"其它区\",522300:\"黔西南布依族苗族自治州\",522301:\"兴义市\",522322:\"兴仁县\",522323:\"普安县\",\n522324:\"晴隆县\",522325:\"贞丰县\",522326:\"望谟县\",522327:\"册亨县\",522328:\"安龙县\",522329:\"其它区\",522400:\"毕节市\",522401:\"七星关区\",522422:\"大方县\",522423:\"黔西县\",522424:\"金沙县\",522425:\"织金县\",522426:\"纳雍县\",522427:\"威宁彝族回族苗族自治县\",522428:\"赫章县\",522429:\"其它区\",522600:\"黔东南苗族侗族自治州\",522601:\"凯里市\",522622:\"黄平县\",522623:\"施秉县\",522624:\"三穗县\",522625:\"镇远县\",522626:\"岑巩县\",522627:\"天柱县\",522628:\"锦屏县\",522629:\"剑河县\",522630:\"台江县\",522631:\"黎平县\",522632:\"榕江县\",522633:\"从江县\",522634:\"雷山县\",522635:\"麻江县\",522636:\"丹寨县\",522637:\"其它区\",522700:\"黔南布依族苗族自治州\",522701:\"都匀市\",522702:\"福泉市\",522722:\"荔波县\",522723:\"贵定县\",522725:\"瓮安县\",522726:\"独山县\",522727:\"平塘县\",522728:\"罗甸县\",522729:\"长顺县\",522730:\"龙里县\",522731:\"惠水县\",522732:\"三都水族自治县\",522733:\"其它区\",530000:\"云南省\",530100:\"昆明市\",530102:\"五华区\",530103:\"盘龙区\",530111:\"官渡区\",530112:\"西山区\",530113:\"东川区\",530121:\"呈贡区\",530122:\"晋宁县\",530124:\"富民县\",530125:\"宜良县\",530126:\"石林彝族自治县\",530127:\"嵩明县\",530128:\"禄劝彝族苗族自治县\",530129:\"寻甸回族彝族自治县\",530181:\"安宁市\",530182:\"其它区\",530300:\"曲靖市\",530302:\"麒麟区\",530321:\"马龙县\",530322:\"陆良县\",530323:\"师宗县\",530324:\"罗平县\",530325:\"富源县\",530326:\"会泽县\",530328:\"沾益县\",530381:\"宣威市\",530382:\"其它区\",530400:\"玉溪市\",530402:\"红塔区\",530421:\"江川县\",530422:\"澄江县\",530423:\"通海县\",530424:\"华宁县\",530425:\"易门县\",530426:\"峨山彝族自治县\",530427:\"新平彝族傣族自治县\",530428:\"元江哈尼族彝族傣族自治县\",530429:\"其它区\",530500:\"保山市\",530502:\"隆阳区\",530521:\"施甸县\",530522:\"腾冲县\",530523:\"龙陵县\",530524:\"昌宁县\",530525:\"其它区\",530600:\"昭通市\",530602:\"昭阳区\",530621:\"鲁甸县\",530622:\"巧家县\",530623:\"盐津县\",530624:\"大关县\",530625:\"永善县\",530626:\"绥江县\",530627:\"镇雄县\",530628:\"彝良县\",530629:\"威信县\",530630:\"水富县\",530631:\"其它区\",530700:\"丽江市\",530702:\"古城区\",530721:\"玉龙纳西族自治县\",530722:\"永胜县\",530723:\"华坪县\",530724:\"宁蒗彝族自治县\",530725:\"其它区\",530800:\"普洱市\",530802:\"思茅区\",530821:\"宁洱哈尼族彝族自治县\",530822:\"墨江哈尼族自治县\",530823:\"景东彝族自治县\",530824:\"景谷傣族彝族自治县\",530825:\"镇沅彝族哈尼族拉祜族自治县\",530826:\"江城哈尼族彝族自治县\",530827:\"孟连傣族拉祜族佤族自治县\",530828:\"澜沧拉祜族自治县\",530829:\"西盟佤族自治县\",530830:\"其它区\",530900:\"临沧市\",530902:\"临翔区\",530921:\"凤庆县\",530922:\"云县\",530923:\"永德县\",530924:\"镇康县\",530925:\"双江拉祜族佤族布朗族傣族自治县\",530926:\"耿马傣族佤族自治县\",530927:\"沧源佤族自治县\",530928:\"其它区\",532300:\"楚雄彝族自治州\",532301:\"楚雄市\",532322:\"双柏县\",532323:\"牟定县\",532324:\"南华县\",532325:\"姚安县\",532326:\"大姚县\",532327:\"永仁县\",532328:\"元谋县\",532329:\"武定县\",532331:\"禄丰县\",532332:\"其它区\",532500:\"红河哈尼族彝族自治州\",532501:\"个旧市\",532502:\"开远市\",532522:\"蒙自市\",532523:\"屏边苗族自治县\",532524:\"建水县\",532525:\"石屏县\",532526:\"弥勒市\",532527:\"泸西县\",532528:\"元阳县\",532529:\"红河县\",532530:\"金平苗族瑶族傣族自治县\",532531:\"绿春县\",532532:\"河口瑶族自治县\",532533:\"其它区\",532600:\"文山壮族苗族自治州\",532621:\"文山市\",532622:\"砚山县\",532623:\"西畴县\",532624:\"麻栗坡县\",532625:\"马关县\",532626:\"丘北县\",532627:\"广南县\",532628:\"富宁县\",532629:\"其它区\",532800:\"西双版纳傣族自治州\",532801:\"景洪市\",532822:\"勐海县\",532823:\"勐腊县\",532824:\"其它区\",532900:\"大理白族自治州\",532901:\"大理市\",532922:\"漾濞彝族自治县\",532923:\"祥云县\",532924:\"宾川县\",532925:\"弥渡县\",532926:\"南涧彝族自治县\",532927:\"巍山彝族回族自治县\",532928:\"永平县\",532929:\"云龙县\",532930:\"洱源县\",532931:\"剑川县\",532932:\"鹤庆县\",532933:\"其它区\",533100:\"德宏傣族景颇族自治州\",533102:\"瑞丽市\",533103:\"芒市\",533122:\"梁河县\",533123:\"盈江县\",533124:\"陇川县\",533125:\"其它区\",533300:\"怒江傈僳族自治州\",533321:\"泸水县\",533323:\"福贡县\",533324:\"贡山独龙族怒族自治县\",533325:\"兰坪白族普米族自治县\",533326:\"其它区\",533400:\"迪庆藏族自治州\",533421:\"香格里拉县\",533422:\"德钦县\",533423:\"维西傈僳族自治县\",533424:\"其它区\",540000:\"西藏自治区\",540100:\"拉萨市\",540102:\"城关区\",540121:\"林周县\",540122:\"当雄县\",540123:\"尼木县\",540124:\"曲水县\",540125:\"堆龙德庆县\",540126:\"达孜县\",540127:\"墨竹工卡县\",540128:\"其它区\",542100:\"昌都地区\",542121:\"昌都县\",542122:\"江达县\",542123:\"贡觉县\",542124:\"类乌齐县\",542125:\"丁青县\",542126:\"察雅县\",542127:\"八宿县\",542128:\"左贡县\",542129:\"芒康县\",542132:\"洛隆县\",542133:\"边坝县\",542134:\"其它区\",542200:\"山南地区\",542221:\"乃东县\",542222:\"扎囊县\",542223:\"贡嘎县\",542224:\"桑日县\",542225:\"琼结县\",542226:\"曲松县\",542227:\"措美县\",542228:\"洛扎县\",542229:\"加查县\",542231:\"隆子县\",542232:\"错那县\",542233:\"浪卡子县\",542234:\"其它区\",542300:\"日喀则地区\",542301:\"日喀则市\",542322:\"南木林县\",542323:\"江孜县\",542324:\"定日县\",542325:\"萨迦县\",542326:\"拉孜县\",542327:\"昂仁县\",542328:\"谢通门县\",542329:\"白朗县\",542330:\"仁布县\",542331:\"康马县\",542332:\"定结县\",542333:\"仲巴县\",542334:\"亚东县\",542335:\"吉隆县\",542336:\"聂拉木县\",542337:\"萨嘎县\",542338:\"岗巴县\",542339:\"其它区\",542400:\"那曲地区\",542421:\"那曲县\",542422:\"嘉黎县\",542423:\"比如县\",542424:\"聂荣县\",542425:\"安多县\",542426:\"申扎县\",542427:\"索县\",542428:\"班戈县\",542429:\"巴青县\",542430:\"尼玛县\",542431:\"其它区\",542432:\"双湖县\",542500:\"阿里地区\",542521:\"普兰县\",542522:\"札达县\",542523:\"噶尔县\",542524:\"日土县\",542525:\"革吉县\",542526:\"改则县\",542527:\"措勤县\",542528:\"其它区\",542600:\"林芝地区\",542621:\"林芝县\",542622:\"工布江达县\",542623:\"米林县\",542624:\"墨脱县\",542625:\"波密县\",542626:\"察隅县\",542627:\"朗县\",542628:\"其它区\",610000:\"陕西省\",610100:\"西安市\",610102:\"新城区\",610103:\"碑林区\",610104:\"莲湖区\",610111:\"灞桥区\",610112:\"未央区\",610113:\"雁塔区\",610114:\"阎良区\",610115:\"临潼区\",610116:\"长安区\",610122:\"蓝田县\",610124:\"周至县\",610125:\"户县\",610126:\"高陵县\",610127:\"其它区\",610200:\"铜川市\",610202:\"王益区\",610203:\"印台区\",610204:\"耀州区\",610222:\"宜君县\",610223:\"其它区\",610300:\"宝鸡市\",610302:\"渭滨区\",610303:\"金台区\",610304:\"陈仓区\",610322:\"凤翔县\",610323:\"岐山县\",610324:\"扶风县\",610326:\"眉县\",610327:\"陇县\",610328:\"千阳县\",610329:\"麟游县\",610330:\"凤县\",610331:\"太白县\",610332:\"其它区\",610400:\"咸阳市\",610402:\"秦都区\",610403:\"杨陵区\",610404:\"渭城区\",610422:\"三原县\",610423:\"泾阳县\",610424:\"乾县\",610425:\"礼泉县\",610426:\"永寿县\",610427:\"彬县\",610428:\"长武县\",610429:\"旬邑县\",610430:\"淳化县\",610431:\"武功县\",610481:\"兴平市\",610482:\"其它区\",610500:\"渭南市\",610502:\"临渭区\",610521:\"华县\",610522:\"潼关县\",610523:\"大荔县\",610524:\"合阳县\",610525:\"澄城县\",610526:\"蒲城县\",610527:\"白水县\",610528:\"富平县\",610581:\"韩城市\",610582:\"华阴市\",610583:\"其它区\",610600:\"延安市\",610602:\"宝塔区\",610621:\"延长县\",610622:\"延川县\",610623:\"子长县\",610624:\"安塞县\",610625:\"志丹县\",610626:\"吴起县\",610627:\"甘泉县\",610628:\"富县\",610629:\"洛川县\",610630:\"宜川县\",610631:\"黄龙县\",610632:\"黄陵县\",610633:\"其它区\",610700:\"汉中市\",610702:\"汉台区\",610721:\"南郑县\",610722:\"城固县\",610723:\"洋县\",610724:\"西乡县\",610725:\"勉县\",610726:\"宁强县\",610727:\"略阳县\",610728:\"镇巴县\",610729:\"留坝县\",610730:\"佛坪县\",610731:\"其它区\",610800:\"榆林市\",610802:\"榆阳区\",610821:\"神木县\",610822:\"府谷县\",610823:\"横山县\",610824:\"靖边县\",610825:\"定边县\",610826:\"绥德县\",610827:\"米脂县\",610828:\"佳县\",610829:\"吴堡县\",610830:\"清涧县\",610831:\"子洲县\",610832:\"其它区\",610900:\"安康市\",610902:\"汉滨区\",610921:\"汉阴县\",610922:\"石泉县\",610923:\"宁陕县\",610924:\"紫阳县\",610925:\"岚皋县\",610926:\"平利县\",610927:\"镇坪县\",610928:\"旬阳县\",610929:\"白河县\",610930:\"其它区\",611000:\"商洛市\",611002:\"商州区\",611021:\"洛南县\",611022:\"丹凤县\",611023:\"商南县\",611024:\"山阳县\",611025:\"镇安县\",611026:\"柞水县\",611027:\"其它区\",620000:\"甘肃省\",620100:\"兰州市\",620102:\"城关区\",620103:\"七里河区\",620104:\"西固区\",620105:\"安宁区\",620111:\"红古区\",620121:\"永登县\",620122:\"皋兰县\",620123:\"榆中县\",620124:\"其它区\",620200:\"嘉峪关市\",620300:\"金昌市\",620302:\"金川区\",620321:\"永昌县\",620322:\"其它区\",620400:\"白银市\",620402:\"白银区\",620403:\"平川区\",620421:\"靖远县\",620422:\"会宁县\",620423:\"景泰县\",620424:\"其它区\",620500:\"天水市\",620502:\"秦州区\",620503:\"麦积区\",620521:\"清水县\",620522:\"秦安县\",620523:\"甘谷县\",620524:\"武山县\",620525:\"张家川回族自治县\",620526:\"其它区\",620600:\"武威市\",620602:\"凉州区\",620621:\"民勤县\",620622:\"古浪县\",620623:\"天祝藏族自治县\",620624:\"其它区\",620700:\"张掖市\",620702:\"甘州区\",620721:\"肃南裕固族自治县\",620722:\"民乐县\",620723:\"临泽县\",620724:\"高台县\",620725:\"山丹县\",620726:\"其它区\",620800:\"平凉市\",620802:\"崆峒区\",620821:\"泾川县\",620822:\"灵台县\",620823:\"崇信县\",620824:\"华亭县\",620825:\"庄浪县\",620826:\"静宁县\",620827:\"其它区\",620900:\"酒泉市\",620902:\"肃州区\",620921:\"金塔县\",620922:\"瓜州县\",620923:\"肃北蒙古族自治县\",620924:\"阿克塞哈萨克族自治县\",620981:\"玉门市\",620982:\"敦煌市\",620983:\"其它区\",621000:\"庆阳市\",621002:\"西峰区\",621021:\"庆城县\",621022:\"环县\",621023:\"华池县\",621024:\"合水县\",621025:\"正宁县\",621026:\"宁县\",621027:\"镇原县\",621028:\"其它区\",621100:\"定西市\",621102:\"安定区\",621121:\"通渭县\",621122:\"陇西县\",621123:\"渭源县\",621124:\"临洮县\",621125:\"漳县\",621126:\"岷县\",621127:\"其它区\",621200:\"陇南市\",621202:\"武都区\",621221:\"成县\",621222:\"文县\",621223:\"宕昌县\",621224:\"康县\",621225:\"西和县\",621226:\"礼县\",621227:\"徽县\",621228:\"两当县\",621229:\"其它区\",622900:\"临夏回族自治州\",622901:\"临夏市\",622921:\"临夏县\",622922:\"康乐县\",622923:\"永靖县\",622924:\"广河县\",622925:\"和政县\",622926:\"东乡族自治县\",622927:\"积石山保安族东乡族撒拉族自治县\",622928:\"其它区\",623000:\"甘南藏族自治州\",623001:\"合作市\",623021:\"临潭县\",623022:\"卓尼县\",623023:\"舟曲县\",623024:\"迭部县\",623025:\"玛曲县\",623026:\"碌曲县\",623027:\"夏河县\",623028:\"其它区\",630000:\"青海省\",630100:\"西宁市\",630102:\"城东区\",630103:\"城中区\",630104:\"城西区\",630105:\"城北区\",630121:\"大通回族土族自治县\",630122:\"湟中县\",630123:\"湟源县\",630124:\"其它区\",632100:\"海东市\",632121:\"平安县\",632122:\"民和回族土族自治县\",632123:\"乐都区\",632126:\"互助土族自治县\",632127:\"化隆回族自治县\",632128:\"循化撒拉族自治县\",632129:\"其它区\",632200:\"海北藏族自治州\",632221:\"门源回族自治县\",632222:\"祁连县\",632223:\"海晏县\",632224:\"刚察县\",632225:\"其它区\",632300:\"黄南藏族自治州\",632321:\"同仁县\",632322:\"尖扎县\",632323:\"泽库县\",632324:\"河南蒙古族自治县\",632325:\"其它区\",632500:\"海南藏族自治州\",632521:\"共和县\",632522:\"同德县\",632523:\"贵德县\",632524:\"兴海县\",632525:\"贵南县\",632526:\"其它区\",632600:\"果洛藏族自治州\",632621:\"玛沁县\",632622:\"班玛县\",632623:\"甘德县\",632624:\"达日县\",632625:\"久治县\",632626:\"玛多县\",632627:\"其它区\",632700:\"玉树藏族自治州\",632721:\"玉树市\",632722:\"杂多县\",632723:\"称多县\",632724:\"治多县\",632725:\"囊谦县\",632726:\"曲麻莱县\",632727:\"其它区\",632800:\"海西蒙古族藏族自治州\",632801:\"格尔木市\",632802:\"德令哈市\",632821:\"乌兰县\",632822:\"都兰县\",632823:\"天峻县\",632824:\"其它区\",640000:\"宁夏回族自治区\",640100:\"银川市\",640104:\"兴庆区\",640105:\"西夏区\",640106:\"金凤区\",640121:\"永宁县\",640122:\"贺兰县\",640181:\"灵武市\",640182:\"其它区\",640200:\"石嘴山市\",640202:\"大武口区\",640205:\"惠农区\",640221:\"平罗县\",640222:\"其它区\",640300:\"吴忠市\",640302:\"利通区\",640303:\"红寺堡区\",640323:\"盐池县\",640324:\"同心县\",640381:\"青铜峡市\",640382:\"其它区\",640400:\"固原市\",640402:\"原州区\",640422:\"西吉县\",640423:\"隆德县\",640424:\"泾源县\",640425:\"彭阳县\",640426:\"其它区\",640500:\"中卫市\",640502:\"沙坡头区\",640521:\"中宁县\",640522:\"海原县\",640523:\"其它区\",650000:\"新疆维吾尔自治区\",650100:\"乌鲁木齐市\",650102:\"天山区\",650103:\"沙依巴克区\",650104:\"新市区\",650105:\"水磨沟区\",650106:\"头屯河区\",650107:\"达坂城区\",650109:\"米东区\",650121:\"乌鲁木齐县\",650122:\"其它区\",650200:\"克拉玛依市\",650202:\"独山子区\",650203:\"克拉玛依区\",650204:\"白碱滩区\",650205:\"乌尔禾区\",650206:\"其它区\",652100:\"吐鲁番地区\",652101:\"吐鲁番市\",652122:\"鄯善县\",652123:\"托克逊县\",652124:\"其它区\",652200:\"哈密地区\",652201:\"哈密市\",652222:\"巴里坤哈萨克自治县\",652223:\"伊吾县\",652224:\"其它区\",652300:\"昌吉回族自治州\",652301:\"昌吉市\",652302:\"阜康市\",652323:\"呼图壁县\",652324:\"玛纳斯县\",652325:\"奇台县\",652327:\"吉木萨尔县\",652328:\"木垒哈萨克自治县\",652329:\"其它区\",652700:\"博尔塔拉蒙古自治州\",652701:\"博乐市\",652702:\"阿拉山口市\",652722:\"精河县\",652723:\"温泉县\",652724:\"其它区\",652800:\"巴音郭楞蒙古自治州\",652801:\"库尔勒市\",652822:\"轮台县\",652823:\"尉犁县\",652824:\"若羌县\",652825:\"且末县\",652826:\"焉耆回族自治县\",652827:\"和静县\",652828:\"和硕县\",652829:\"博湖县\",652830:\"其它区\",652900:\"阿克苏地区\",652901:\"阿克苏市\",652922:\"温宿县\",652923:\"库车县\",652924:\"沙雅县\",652925:\"新和县\",652926:\"拜城县\",652927:\"乌什县\",652928:\"阿瓦提县\",652929:\"柯坪县\",652930:\"其它区\",653000:\"克孜勒苏柯尔克孜自治州\",653001:\"阿图什市\",653022:\"阿克陶县\",653023:\"阿合奇县\",653024:\"乌恰县\",653025:\"其它区\",653100:\"喀什地区\",653101:\"喀什市\",653121:\"疏附县\",653122:\"疏勒县\",653123:\"英吉沙县\",653124:\"泽普县\",653125:\"莎车县\",653126:\"叶城县\",653127:\"麦盖提县\",653128:\"岳普湖县\",653129:\"伽师县\",653130:\"巴楚县\",653131:\"塔什库尔干塔吉克自治县\",653132:\"其它区\",653200:\"和田地区\",653201:\"和田市\",653221:\"和田县\",653222:\"墨玉县\",653223:\"皮山县\",653224:\"洛浦县\",653225:\"策勒县\",653226:\"于田县\",653227:\"民丰县\",653228:\"其它区\",654000:\"伊犁哈萨克自治州\",654002:\"伊宁市\",654003:\"奎屯市\",654021:\"伊宁县\",654022:\"察布查尔锡伯自治县\",654023:\"霍城县\",654024:\"巩留县\",654025:\"新源县\",654026:\"昭苏县\",654027:\"特克斯县\",654028:\"尼勒克县\",654029:\"其它区\",654200:\"塔城地区\",654201:\"塔城市\",654202:\"乌苏市\",654221:\"额敏县\",654223:\"沙湾县\",654224:\"托里县\",654225:\"裕民县\",654226:\"和布克赛尔蒙古自治县\",654227:\"其它区\",654300:\"阿勒泰地区\",654301:\"阿勒泰市\",654321:\"布尔津县\",654322:\"富蕴县\",654323:\"福海县\",654324:\"哈巴河县\",654325:\"青河县\",654326:\"吉木乃县\",654327:\"其它区\",659001:\"石河子市\",659002:\"阿拉尔市\",659003:\"图木舒克市\",659004:\"五家渠市\",710000:\"台湾\",710100:\"台北市\",710101:\"中正区\",710102:\"大同区\",710103:\"中山区\",710104:\"松山区\",710105:\"大安区\",710106:\"万华区\",710107:\"信义区\",710108:\"士林区\",710109:\"北投区\",710110:\"内湖区\",710111:\"南港区\",710112:\"文山区\",710113:\"其它区\",710200:\"高雄市\",710201:\"新兴区\",710202:\"前金区\",710203:\"芩雅区\",710204:\"盐埕区\",710205:\"鼓山区\",710206:\"旗津区\",710207:\"前镇区\",710208:\"三民区\",710209:\"左营区\",710210:\"楠梓区\",710211:\"小港区\",710212:\"其它区\",710241:\"苓雅区\",710242:\"仁武区\",710243:\"大社区\",710244:\"冈山区\",710245:\"路竹区\",710246:\"阿莲区\",710247:\"田寮区\",710248:\"燕巢区\",710249:\"桥头区\",710250:\"梓官区\",710251:\"弥陀区\",710252:\"永安区\",710253:\"湖内区\",710254:\"凤山区\",710255:\"大寮区\",710256:\"林园区\",710257:\"鸟松区\",710258:\"大树区\",710259:\"旗山区\",710260:\"美浓区\",710261:\"六龟区\",710262:\"内门区\",710263:\"杉林区\",710264:\"甲仙区\",710265:\"桃源区\",710266:\"那玛夏区\",710267:\"茂林区\",710268:\"茄萣区\",710300:\"台南市\",710301:\"中西区\",710302:\"东区\",710303:\"南区\",710304:\"北区\",710305:\"安平区\",710306:\"安南区\",710307:\"其它区\",710339:\"永康区\",710340:\"归仁区\",710341:\"新化区\",710342:\"左镇区\",710343:\"玉井区\",710344:\"楠西区\",710345:\"南化区\",710346:\"仁德区\",710347:\"关庙区\",710348:\"龙崎区\",710349:\"官田区\",710350:\"麻豆区\",710351:\"佳里区\",710352:\"西港区\",710353:\"七股区\",710354:\"将军区\",710355:\"学甲区\",710356:\"北门区\",710357:\"新营区\",710358:\"后壁区\",710359:\"白河区\",710360:\"东山区\",710361:\"六甲区\",710362:\"下营区\",710363:\"柳营区\",710364:\"盐水区\",710365:\"善化区\",710366:\"大内区\",710367:\"山上区\",710368:\"新市区\",710369:\"安定区\",710400:\"台中市\",710401:\"中区\",710402:\"东区\",710403:\"南区\",710404:\"西区\",710405:\"北区\",710406:\"北屯区\",710407:\"西屯区\",710408:\"南屯区\",710409:\"其它区\",710431:\"太平区\",710432:\"大里区\",710433:\"雾峰区\",710434:\"乌日区\",710435:\"丰原区\",710436:\"后里区\",710437:\"石冈区\",710438:\"东势区\",710439:\"和平区\",710440:\"新社区\",710441:\"潭子区\",710442:\"大雅区\",710443:\"神冈区\",710444:\"大肚区\",710445:\"沙鹿区\",710446:\"龙井区\",710447:\"梧栖区\",710448:\"清水区\",710449:\"大甲区\",710450:\"外埔区\",710451:\"大安区\",710500:\"金门县\",710507:\"金沙镇\",710508:\"金湖镇\",710509:\"金宁乡\",710510:\"金城镇\",710511:\"烈屿乡\",710512:\"乌坵乡\",710600:\"南投县\",710614:\"南投市\",710615:\"中寮乡\",710616:\"草屯镇\",710617:\"国姓乡\",710618:\"埔里镇\",710619:\"仁爱乡\",710620:\"名间乡\",710621:\"集集镇\",710622:\"水里乡\",710623:\"鱼池乡\",710624:\"信义乡\",710625:\"竹山镇\",710626:\"鹿谷乡\",710700:\"基隆市\",710701:\"仁爱区\",710702:\"信义区\",710703:\"中正区\",710704:\"中山区\",710705:\"安乐区\",710706:\"暖暖区\",710707:\"七堵区\",710708:\"其它区\",710800:\"新竹市\",710801:\"东区\",710802:\"北区\",710803:\"香山区\",710804:\"其它区\",710900:\"嘉义市\",710901:\"东区\",710902:\"西区\",710903:\"其它区\",711100:\"新北市\",711130:\"万里区\",711131:\"金山区\",711132:\"板桥区\",711133:\"汐止区\",711134:\"深坑区\",711135:\"石碇区\",711136:\"瑞芳区\",711137:\"平溪区\",711138:\"双溪区\",711139:\"贡寮区\",711140:\"新店区\",711141:\"坪林区\",711142:\"乌来区\",711143:\"永和区\",711144:\"中和区\",711145:\"土城区\",711146:\"三峡区\",711147:\"树林区\",711148:\"莺歌区\",711149:\"三重区\",711150:\"新庄区\",711151:\"泰山区\",711152:\"林口区\",711153:\"芦洲区\",711154:\"五股区\",711155:\"八里区\",711156:\"淡水区\",711157:\"三芝区\",711158:\"石门区\",711200:\"宜兰县\",711214:\"宜兰市\",711215:\"头城镇\",711216:\"礁溪乡\",711217:\"壮围乡\",711218:\"员山乡\",711219:\"罗东镇\",711220:\"三星乡\",711221:\"大同乡\",711222:\"五结乡\",711223:\"冬山乡\",711224:\"苏澳镇\",711225:\"南澳乡\",711226:\"钓鱼台\",711300:\"新竹县\",711314:\"竹北市\",711315:\"湖口乡\",711316:\"新丰乡\",711317:\"新埔镇\",711318:\"关西镇\",711319:\"芎林乡\",711320:\"宝山乡\",711321:\"竹东镇\",711322:\"五峰乡\",711323:\"横山乡\",711324:\"尖石乡\",711325:\"北埔乡\",711326:\"峨眉乡\",711400:\"桃园县\",711414:\"中坜市\",711415:\"平镇市\",711416:\"龙潭乡\",711417:\"杨梅市\",711418:\"新屋乡\",711419:\"观音乡\",711420:\"桃园市\",711421:\"龟山乡\",711422:\"八德市\",711423:\"大溪镇\",711424:\"复兴乡\",711425:\"大园乡\",711426:\"芦竹乡\",711500:\"苗栗县\",711519:\"竹南镇\",711520:\"头份镇\",711521:\"三湾乡\",711522:\"南庄乡\",711523:\"狮潭乡\",711524:\"后龙镇\",711525:\"通霄镇\",711526:\"苑里镇\",711527:\"苗栗市\",711528:\"造桥乡\",711529:\"头屋乡\",711530:\"公馆乡\",711531:\"大湖乡\",711532:\"泰安乡\",711533:\"铜锣乡\",711534:\"三义乡\",711535:\"西湖乡\",711536:\"卓兰镇\",711700:\"彰化县\",711727:\"彰化市\",711728:\"芬园乡\",711729:\"花坛乡\",711730:\"秀水乡\",711731:\"鹿港镇\",711732:\"福兴乡\",711733:\"线西乡\",711734:\"和美镇\",711735:\"伸港乡\",711736:\"员林镇\",711737:\"社头乡\",711738:\"永靖乡\",711739:\"埔心乡\",711740:\"溪湖镇\",711741:\"大村乡\",711742:\"埔盐乡\",711743:\"田中镇\",711744:\"北斗镇\",711745:\"田尾乡\",711746:\"埤头乡\",711747:\"溪州乡\",711748:\"竹塘乡\",711749:\"二林镇\",711750:\"大城乡\",711751:\"芳苑乡\",711752:\"二水乡\",711900:\"嘉义县\",711919:\"番路乡\",711920:\"梅山乡\",711921:\"竹崎乡\",711922:\"阿里山乡\",711923:\"中埔乡\",711924:\"大埔乡\",711925:\"水上乡\",711926:\"鹿草乡\",711927:\"太保市\",711928:\"朴子市\",711929:\"东石乡\",711930:\"六脚乡\",711931:\"新港乡\",711932:\"民雄乡\",711933:\"大林镇\",711934:\"溪口乡\",711935:\"义竹乡\",711936:\"布袋镇\",712100:\"云林县\",712121:\"斗南镇\",712122:\"大埤乡\",712123:\"虎尾镇\",712124:\"土库镇\",712125:\"褒忠乡\",712126:\"东势乡\",712127:\"台西乡\",712128:\"仑背乡\",712129:\"麦寮乡\",712130:\"斗六市\",712131:\"林内乡\",712132:\"古坑乡\",712133:\"莿桐乡\",712134:\"西螺镇\",712135:\"二仑乡\",712136:\"北港镇\",712137:\"水林乡\",712138:\"口湖乡\",712139:\"四湖乡\",712140:\"元长乡\",712400:\"屏东县\",712434:\"屏东市\",712435:\"三地门乡\",712436:\"雾台乡\",712437:\"玛家乡\",712438:\"九如乡\",712439:\"里港乡\",712440:\"高树乡\",712441:\"盐埔乡\",712442:\"长治乡\",712443:\"麟洛乡\",712444:\"竹田乡\",712445:\"内埔乡\",712446:\"万丹乡\",712447:\"潮州镇\",712448:\"泰武乡\",712449:\"来义乡\",712450:\"万峦乡\",712451:\"崁顶乡\",712452:\"新埤乡\",712453:\"南州乡\",712454:\"林边乡\",712455:\"东港镇\",712456:\"琉球乡\",712457:\"佳冬乡\",712458:\"新园乡\",712459:\"枋寮乡\",712460:\"枋山乡\",712461:\"春日乡\",712462:\"狮子乡\",712463:\"车城乡\",712464:\"牡丹乡\",712465:\"恒春镇\",712466:\"满州乡\",712500:\"台东县\",712517:\"台东市\",712518:\"绿岛乡\",712519:\"兰屿乡\",712520:\"延平乡\",712521:\"卑南乡\",712522:\"鹿野乡\",712523:\"关山镇\",712524:\"海端乡\",712525:\"池上乡\",712526:\"东河乡\",712527:\"成功镇\",712528:\"长滨乡\",712529:\"金峰乡\",712530:\"大武乡\",712531:\"达仁乡\",712532:\"太麻里乡\",712600:\"花莲县\",712615:\"花莲市\",712616:\"新城乡\",712617:\"太鲁阁\",712618:\"秀林乡\",712619:\"吉安乡\",712620:\"寿丰乡\",712621:\"凤林镇\",712622:\"光复乡\",712623:\"丰滨乡\",712624:\"瑞穗乡\",712625:\"万荣乡\",712626:\"玉里镇\",712627:\"卓溪乡\",712628:\"富里乡\",712700:\"澎湖县\",712707:\"马公市\",712708:\"西屿乡\",712709:\"望安乡\",712710:\"七美乡\",712711:\"白沙乡\",712712:\"湖西乡\",712800:\"连江县\",712805:\"南竿乡\",712806:\"北竿乡\",712807:\"莒光乡\",712808:\"东引乡\",810000:\"香港特别行政区\",810100:\"香港岛\",810101:\"中西区\",810102:\"湾仔\",810103:\"东区\",810104:\"南区\",810200:\"九龙\",810201:\"九龙城区\",810202:\"油尖旺区\",810203:\"深水埗区\",810204:\"黄大仙区\",810205:\"观塘区\",810300:\"新界\",810301:\"北区\",810302:\"大埔区\",810303:\"沙田区\",810304:\"西贡区\",810305:\"元朗区\",810306:\"屯门区\",810307:\"荃湾区\",810308:\"葵青区\",810309:\"离岛区\",820000:\"澳门特别行政区\",820100:\"澳门半岛\",820200:\"离岛\",990000:\"海外\",990100:\"海外\"},a=function(){var t=[];for(var e in r){var a=\"0000\"===e.slice(2,6)?void 0:\"00\"==e.slice(4,6)?e.slice(0,2)+\"0000\":e.slice(0,4)+\"00\";t.push({id:e,pid:a,name:r[e]})}return n(t)}();t.exports=a},function(t,e,n){var r=n(18);t.exports={d4:function(){return this.natural(1,4)},d6:function(){return this.natural(1,6)},d8:function(){return this.natural(1,8)},d12:function(){return this.natural(1,12)},d20:function(){return this.natural(1,20)},d100:function(){return this.natural(1,100)},guid:function(){var t=\"abcdefABCDEF1234567890\",e=this.string(t,8)+\"-\"+this.string(t,4)+\"-\"+this.string(t,4)+\"-\"+this.string(t,4)+\"-\"+this.string(t,12);return e},uuid:function(){return this.guid()},id:function(){var t,e=0,n=[\"7\",\"9\",\"10\",\"5\",\"8\",\"4\",\"2\",\"1\",\"6\",\"3\",\"7\",\"9\",\"10\",\"5\",\"8\",\"4\",\"2\"],a=[\"1\",\"0\",\"X\",\"9\",\"8\",\"7\",\"6\",\"5\",\"4\",\"3\",\"2\"];t=this.pick(r).id+this.date(\"yyyyMMdd\")+this.string(\"number\",3);for(var o=0;o<t.length;o++)e+=t[o]*n[o];return t+=a[e%11]},increment:function(){var t=0;return function(e){return t+=+e||1}}(),inc:function(t){return this.increment(t)}}},function(t,e,n){var r=n(21),a=n(22);t.exports={Parser:r,Handler:a}},function(t,e){function n(t){this.type=t,this.offset=n.offset(),this.text=n.text()}function r(t,e){n.call(this,\"alternate\"),this.left=t,this.right=e}function a(t){n.call(this,\"match\"),this.body=t.filter(Boolean)}function o(t,e){n.call(this,t),this.body=e}function u(t){o.call(this,\"capture-group\"),this.index=y[this.offset]||(y[this.offset]=x++),this.body=t}function l(t,e){n.call(this,\"quantified\"),this.body=t,this.quantifier=e}function i(t,e){n.call(this,\"quantifier\"),this.min=t,this.max=e,this.greedy=!0}function s(t,e){n.call(this,\"charset\"),this.invert=t,this.body=e}function c(t,e){n.call(this,\"range\"),this.start=t,this.end=e}function h(t){n.call(this,\"literal\"),this.body=t,this.escaped=this.body!=this.text}function p(t){n.call(this,\"unicode\"),this.code=t.toUpperCase()}function f(t){n.call(this,\"hex\"),this.code=t.toUpperCase()}function d(t){n.call(this,\"octal\"),this.code=t.toUpperCase()}function m(t){n.call(this,\"back-reference\"),this.code=t.toUpperCase()}function g(t){n.call(this,\"control-character\"),this.code=t.toUpperCase()}var v=function(){function t(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n}function e(t,e,n,r,a){function o(t,e){function n(t){function e(t){return t.charCodeAt(0).toString(16).toUpperCase()}return t.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\x08/g,\"\\\\b\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\f/g,\"\\\\f\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g,function(t){return\"\\\\x0\"+e(t)}).replace(/[\\x10-\\x1F\\x80-\\xFF]/g,function(t){return\"\\\\x\"+e(t)}).replace(/[\\u0180-\\u0FFF]/g,function(t){return\"\\\\u0\"+e(t)}).replace(/[\\u1080-\\uFFFF]/g,function(t){return\"\\\\u\"+e(t)})}var r,a;switch(t.length){case 0:r=\"end of input\";break;case 1:r=t[0];break;default:r=t.slice(0,-1).join(\", \")+\" or \"+t[t.length-1]}return a=e?'\"'+n(e)+'\"':\"end of input\",\"Expected \"+r+\" but \"+a+\" found.\"}this.expected=t,this.found=e,this.offset=n,this.line=r,this.column=a,this.name=\"SyntaxError\",this.message=o(t,e)}function v(t){function v(){return t.substring(Qn,Zn)}function x(){return Qn}function y(e){function n(e,n,r){var a,o;for(a=n;r>a;a++)o=t.charAt(a),\"\\n\"===o?(e.seenCR||e.line++,e.column=1,e.seenCR=!1):\"\\r\"===o||\"\\u2028\"===o||\"\\u2029\"===o?(e.line++,e.column=1,e.seenCR=!0):(e.column++,e.seenCR=!1)}return tr!==e&&(tr>e&&(tr=0,er={line:1,column:1,seenCR:!1}),n(er,tr,e),tr=e),er}function b(t){nr>Zn||(Zn>nr&&(nr=Zn,rr=[]),rr.push(t))}function w(t){var e=0;for(t.sort();e<t.length;)t[e-1]===t[e]?t.splice(e,1):e++}function C(){var e,n,r,a,o;return e=Zn,n=k(),null!==n?(r=Zn,124===t.charCodeAt(Zn)?(a=Et,Zn++):(a=null,0===ar&&b(At)),null!==a?(o=C(),null!==o?(a=[a,o],r=a):(Zn=r,r=kt)):(Zn=r,r=kt),null===r&&(r=Rt),null!==r?(Qn=e,n=_t(n,r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function k(){var t,e,n,r,a;if(t=Zn,e=E(),null===e&&(e=Rt),null!==e)if(n=Zn,ar++,r=M(),ar--,null===r?n=Rt:(Zn=n,n=kt),null!==n){for(r=[],a=_(),null===a&&(a=R());null!==a;)r.push(a),a=_(),null===a&&(a=R());null!==r?(a=A(),null===a&&(a=Rt),null!==a?(Qn=t,e=Mt(e,r,a),null===e?(Zn=t,t=e):t=e):(Zn=t,t=kt)):(Zn=t,t=kt)}else Zn=t,t=kt;else Zn=t,t=kt;return t}function R(){var t;return t=I(),null===t&&(t=B(),null===t&&(t=Y())),t}function E(){var e,n;return e=Zn,94===t.charCodeAt(Zn)?(n=Pt,Zn++):(n=null,0===ar&&b(St)),null!==n&&(Qn=e,n=Tt()),null===n?(Zn=e,e=n):e=n,e}function A(){var e,n;return e=Zn,36===t.charCodeAt(Zn)?(n=Ht,Zn++):(n=null,0===ar&&b(Dt)),null!==n&&(Qn=e,n=qt()),null===n?(Zn=e,e=n):e=n,e}function _(){var t,e,n;return t=Zn,e=R(),null!==e?(n=M(),null!==n?(Qn=t,e=Ft(e,n),null===e?(Zn=t,t=e):t=e):(Zn=t,t=kt)):(Zn=t,t=kt),t}function M(){var t,e,n;return ar++,t=Zn,e=P(),null!==e?(n=L(),null===n&&(n=Rt),null!==n?(Qn=t,e=Ot(e,n),null===e?(Zn=t,t=e):t=e):(Zn=t,t=kt)):(Zn=t,t=kt),ar--,null===t&&(e=null,0===ar&&b(Lt)),t}function P(){var t;return t=S(),null===t&&(t=T(),null===t&&(t=H(),null===t&&(t=D(),null===t&&(t=q(),null===t&&(t=F()))))),t}function S(){var e,n,r,a,o,u;return e=Zn,123===t.charCodeAt(Zn)?(n=It,Zn++):(n=null,0===ar&&b(jt)),null!==n?(r=O(),null!==r?(44===t.charCodeAt(Zn)?(a=Nt,Zn++):(a=null,0===ar&&b(zt)),null!==a?(o=O(),null!==o?(125===t.charCodeAt(Zn)?(u=Ut,Zn++):(u=null,0===ar&&b(Bt)),null!==u?(Qn=e,n=Gt(r,o),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt),e}function T(){var e,n,r,a;return e=Zn,123===t.charCodeAt(Zn)?(n=It,Zn++):(n=null,0===ar&&b(jt)),null!==n?(r=O(),null!==r?(t.substr(Zn,2)===Xt?(a=Xt,Zn+=2):(a=null,0===ar&&b(Kt)),null!==a?(Qn=e,n=Wt(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt),e}function H(){var e,n,r,a;return e=Zn,123===t.charCodeAt(Zn)?(n=It,Zn++):(n=null,0===ar&&b(jt)),null!==n?(r=O(),null!==r?(125===t.charCodeAt(Zn)?(a=Ut,Zn++):(a=null,0===ar&&b(Bt)),null!==a?(Qn=e,n=Yt(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt),e}function D(){var e,n;return e=Zn,43===t.charCodeAt(Zn)?(n=Jt,Zn++):(n=null,0===ar&&b($t)),null!==n&&(Qn=e,n=Vt()),null===n?(Zn=e,e=n):e=n,e}function q(){var e,n;return e=Zn,42===t.charCodeAt(Zn)?(n=Zt,Zn++):(n=null,0===ar&&b(Qt)),null!==n&&(Qn=e,n=te()),null===n?(Zn=e,e=n):e=n,e}function F(){var e,n;return e=Zn,63===t.charCodeAt(Zn)?(n=ee,Zn++):(n=null,0===ar&&b(ne)),null!==n&&(Qn=e,n=re()),null===n?(Zn=e,e=n):e=n,e}function L(){var e;return 63===t.charCodeAt(Zn)?(e=ee,Zn++):(e=null,0===ar&&b(ne)),e}function O(){var e,n,r;if(e=Zn,n=[],ae.test(t.charAt(Zn))?(r=t.charAt(Zn),Zn++):(r=null,0===ar&&b(oe)),null!==r)for(;null!==r;)n.push(r),ae.test(t.charAt(Zn))?(r=t.charAt(Zn),Zn++):(r=null,0===ar&&b(oe));else n=kt;return null!==n&&(Qn=e,n=ue(n)),null===n?(Zn=e,e=n):e=n,e}function I(){var e,n,r,a;return e=Zn,40===t.charCodeAt(Zn)?(n=le,Zn++):(n=null,0===ar&&b(ie)),null!==n?(r=z(),null===r&&(r=U(),null===r&&(r=N(),null===r&&(r=j()))),null!==r?(41===t.charCodeAt(Zn)?(a=se,Zn++):(a=null,0===ar&&b(ce)),null!==a?(Qn=e,n=he(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt),e}function j(){var t,e;return t=Zn,e=C(),null!==e&&(Qn=t,e=pe(e)),null===e?(Zn=t,t=e):t=e,t}function N(){var e,n,r;return e=Zn,t.substr(Zn,2)===fe?(n=fe,Zn+=2):(n=null,0===ar&&b(de)),null!==n?(r=C(),null!==r?(Qn=e,n=me(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function z(){var e,n,r;return e=Zn,t.substr(Zn,2)===ge?(n=ge,Zn+=2):(n=null,0===ar&&b(ve)),null!==n?(r=C(),null!==r?(Qn=e,n=xe(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function U(){var e,n,r;return e=Zn,t.substr(Zn,2)===ye?(n=ye,Zn+=2):(n=null,0===ar&&b(be)),null!==n?(r=C(),null!==r?(Qn=e,n=we(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function B(){var e,n,r,a,o;if(ar++,e=Zn,91===t.charCodeAt(Zn)?(n=ke,Zn++):(n=null,0===ar&&b(Re)),null!==n)if(94===t.charCodeAt(Zn)?(r=Pt,Zn++):(r=null,0===ar&&b(St)),null===r&&(r=Rt),null!==r){for(a=[],o=G(),null===o&&(o=X());null!==o;)a.push(o),o=G(),null===o&&(o=X());null!==a?(93===t.charCodeAt(Zn)?(o=Ee,Zn++):(o=null,0===ar&&b(Ae)),null!==o?(Qn=e,n=_e(r,a),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)}else Zn=e,e=kt;else Zn=e,e=kt;return ar--,null===e&&(n=null,0===ar&&b(Ce)),e}function G(){var e,n,r,a;return ar++,e=Zn,n=X(),null!==n?(45===t.charCodeAt(Zn)?(r=Pe,Zn++):(r=null,0===ar&&b(Se)),null!==r?(a=X(),null!==a?(Qn=e,n=Te(n,a),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt)):(Zn=e,e=kt),ar--,null===e&&(n=null,0===ar&&b(Me)),e}function X(){var t,e;return ar++,t=W(),null===t&&(t=K()),ar--,null===t&&(e=null,0===ar&&b(He)),t}function K(){var e,n;return e=Zn,De.test(t.charAt(Zn))?(n=t.charAt(Zn),Zn++):(n=null,0===ar&&b(qe)),null!==n&&(Qn=e,n=Fe(n)),null===n?(Zn=e,e=n):e=n,e}function W(){var t;return t=Z(),null===t&&(t=pt(),null===t&&(t=et(),null===t&&(t=nt(),null===t&&(t=rt(),null===t&&(t=at(),null===t&&(t=ot(),null===t&&(t=ut(),null===t&&(t=lt(),null===t&&(t=it(),null===t&&(t=st(),null===t&&(t=ct(),null===t&&(t=ht(),null===t&&(t=dt(),null===t&&(t=mt(),null===t&&(t=gt(),null===t&&(t=vt(),null===t&&(t=xt()))))))))))))))))),t}function Y(){var t;return t=J(),null===t&&(t=V(),null===t&&(t=$())),t}function J(){var e,n;return e=Zn,46===t.charCodeAt(Zn)?(n=Le,Zn++):(n=null,0===ar&&b(Oe)),null!==n&&(Qn=e,n=Ie()),null===n?(Zn=e,e=n):e=n,e}function $(){var e,n;return ar++,e=Zn,Ne.test(t.charAt(Zn))?(n=t.charAt(Zn),Zn++):(n=null,0===ar&&b(ze)),null!==n&&(Qn=e,n=Fe(n)),null===n?(Zn=e,e=n):e=n,ar--,null===e&&(n=null,0===ar&&b(je)),e}function V(){var t;return t=Q(),null===t&&(t=tt(),null===t&&(t=pt(),null===t&&(t=et(),null===t&&(t=nt(),null===t&&(t=rt(),null===t&&(t=at(),null===t&&(t=ot(),null===t&&(t=ut(),null===t&&(t=lt(),null===t&&(t=it(),null===t&&(t=st(),null===t&&(t=ct(),null===t&&(t=ht(),null===t&&(t=ft(),null===t&&(t=dt(),null===t&&(t=mt(),null===t&&(t=gt(),null===t&&(t=vt(),null===t&&(t=xt()))))))))))))))))))),t}function Z(){var e,n;return e=Zn,t.substr(Zn,2)===Ue?(n=Ue,Zn+=2):(n=null,0===ar&&b(Be)),null!==n&&(Qn=e,n=Ge()),null===n?(Zn=e,e=n):e=n,e}function Q(){var e,n;return e=Zn,t.substr(Zn,2)===Ue?(n=Ue,Zn+=2):(n=null,0===ar&&b(Be)),null!==n&&(Qn=e,n=Xe()),null===n?(Zn=e,e=n):e=n,e}function tt(){var e,n;return e=Zn,t.substr(Zn,2)===Ke?(n=Ke,Zn+=2):(n=null,0===ar&&b(We)),null!==n&&(Qn=e,n=Ye()),null===n?(Zn=e,e=n):e=n,e}function et(){var e,n;return e=Zn,t.substr(Zn,2)===Je?(n=Je,Zn+=2):(n=null,0===ar&&b($e)),null!==n&&(Qn=e,n=Ve()),null===n?(Zn=e,e=n):e=n,e}function nt(){var e,n;return e=Zn,t.substr(Zn,2)===Ze?(n=Ze,Zn+=2):(n=null,0===ar&&b(Qe)),null!==n&&(Qn=e,n=tn()),null===n?(Zn=e,e=n):e=n,e}function rt(){var e,n;return e=Zn,t.substr(Zn,2)===en?(n=en,Zn+=2):(n=null,0===ar&&b(nn)),null!==n&&(Qn=e,n=rn()),null===n?(Zn=e,e=n):e=n,e}function at(){var e,n;return e=Zn,t.substr(Zn,2)===an?(n=an,Zn+=2):(n=null,0===ar&&b(on)),null!==n&&(Qn=e,n=un()),null===n?(Zn=e,e=n):e=n,e}function ot(){var e,n;return e=Zn,t.substr(Zn,2)===ln?(n=ln,Zn+=2):(n=null,0===ar&&b(sn)),null!==n&&(Qn=e,n=cn()),null===n?(Zn=e,e=n):e=n,e}function ut(){var e,n;return e=Zn,t.substr(Zn,2)===hn?(n=hn,Zn+=2):(n=null,0===ar&&b(pn)),null!==n&&(Qn=e,n=fn()),null===n?(Zn=e,e=n):e=n,e}function lt(){var e,n;return e=Zn,t.substr(Zn,2)===dn?(n=dn,Zn+=2):(n=null,0===ar&&b(mn)),null!==n&&(Qn=e,n=gn()),null===n?(Zn=e,e=n):e=n,e}function it(){var e,n;return e=Zn,t.substr(Zn,2)===vn?(n=vn,Zn+=2):(n=null,0===ar&&b(xn)),null!==n&&(Qn=e,n=yn()),null===n?(Zn=e,e=n):e=n,e}function st(){var e,n;return e=Zn,t.substr(Zn,2)===bn?(n=bn,Zn+=2):(n=null,0===ar&&b(wn)),null!==n&&(Qn=e,n=Cn()),null===n?(Zn=e,e=n):e=n,e}function ct(){var e,n;return e=Zn,t.substr(Zn,2)===kn?(n=kn,Zn+=2):(n=null,0===ar&&b(Rn)),null!==n&&(Qn=e,n=En()),null===n?(Zn=e,e=n):e=n,e}function ht(){var e,n;return e=Zn,t.substr(Zn,2)===An?(n=An,Zn+=2):(n=null,0===ar&&b(_n)),null!==n&&(Qn=e,n=Mn()),null===n?(Zn=e,e=n):e=n,e}function pt(){var e,n,r;return e=Zn,t.substr(Zn,2)===Pn?(n=Pn,Zn+=2):(n=null,0===ar&&b(Sn)),null!==n?(t.length>Zn?(r=t.charAt(Zn),Zn++):(r=null,0===ar&&b(Tn)),null!==r?(Qn=e,n=Hn(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function ft(){var e,n,r;return e=Zn,92===t.charCodeAt(Zn)?(n=Dn,Zn++):(n=null,0===ar&&b(qn)),null!==n?(Fn.test(t.charAt(Zn))?(r=t.charAt(Zn),Zn++):(r=null,0===ar&&b(Ln)),null!==r?(Qn=e,n=On(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}function dt(){var e,n,r,a;if(e=Zn,t.substr(Zn,2)===In?(n=In,Zn+=2):(n=null,0===ar&&b(jn)),null!==n){if(r=[],Nn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(zn)),null!==a)for(;null!==a;)r.push(a),Nn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(zn));else r=kt;null!==r?(Qn=e,n=Un(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)}else Zn=e,e=kt;return e}function mt(){var e,n,r,a;if(e=Zn,t.substr(Zn,2)===Bn?(n=Bn,Zn+=2):(n=null,0===ar&&b(Gn)),null!==n){if(r=[],Xn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(Kn)),null!==a)for(;null!==a;)r.push(a),Xn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(Kn));else r=kt;null!==r?(Qn=e,n=Wn(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)}else Zn=e,e=kt;return e}function gt(){var e,n,r,a;if(e=Zn,t.substr(Zn,2)===Yn?(n=Yn,Zn+=2):(n=null,0===ar&&b(Jn)),null!==n){if(r=[],Xn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(Kn)),null!==a)for(;null!==a;)r.push(a),Xn.test(t.charAt(Zn))?(a=t.charAt(Zn),Zn++):(a=null,0===ar&&b(Kn));else r=kt;null!==r?(Qn=e,n=$n(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)}else Zn=e,e=kt;return e}function vt(){var e,n;return e=Zn,t.substr(Zn,2)===In?(n=In,Zn+=2):(n=null,0===ar&&b(jn)),null!==n&&(Qn=e,n=Vn()),null===n?(Zn=e,e=n):e=n,e}function xt(){var e,n,r;return e=Zn,92===t.charCodeAt(Zn)?(n=Dn,Zn++):(n=null,0===ar&&b(qn)),null!==n?(t.length>Zn?(r=t.charAt(Zn),Zn++):(r=null,0===ar&&b(Tn)),null!==r?(Qn=e,n=Fe(r),null===n?(Zn=e,e=n):e=n):(Zn=e,e=kt)):(Zn=e,e=kt),e}var yt,bt=arguments.length>1?arguments[1]:{},wt={regexp:C},Ct=C,kt=null,Rt=\"\",Et=\"|\",At='\"|\"',_t=function(t,e){return e?new r(t,e[1]):t},Mt=function(t,e,n){return new a([t].concat(e).concat([n]))},Pt=\"^\",St='\"^\"',Tt=function(){return new n(\"start\")},Ht=\"$\",Dt='\"$\"',qt=function(){return new n(\"end\")},Ft=function(t,e){return new l(t,e)},Lt=\"Quantifier\",Ot=function(t,e){return e&&(t.greedy=!1),t},It=\"{\",jt='\"{\"',Nt=\",\",zt='\",\"',Ut=\"}\",Bt='\"}\"',Gt=function(t,e){return new i(t,e)},Xt=\",}\",Kt='\",}\"',Wt=function(t){return new i(t,1/0)},Yt=function(t){return new i(t,t)},Jt=\"+\",$t='\"+\"',Vt=function(){return new i(1,1/0)},Zt=\"*\",Qt='\"*\"',te=function(){return new i(0,1/0)},ee=\"?\",ne='\"?\"',re=function(){return new i(0,1)},ae=/^[0-9]/,oe=\"[0-9]\",ue=function(t){return+t.join(\"\")},le=\"(\",ie='\"(\"',se=\")\",ce='\")\"',he=function(t){return t},pe=function(t){return new u(t)},fe=\"?:\",de='\"?:\"',me=function(t){return new o(\"non-capture-group\",t)},ge=\"?=\",ve='\"?=\"',xe=function(t){return new o(\"positive-lookahead\",t)},ye=\"?!\",be='\"?!\"',we=function(t){return new o(\"negative-lookahead\",t)},Ce=\"CharacterSet\",ke=\"[\",Re='\"[\"',Ee=\"]\",Ae='\"]\"',_e=function(t,e){return new s(!!t,e)},Me=\"CharacterRange\",Pe=\"-\",Se='\"-\"',Te=function(t,e){return new c(t,e)},He=\"Character\",De=/^[^\\\\\\]]/,qe=\"[^\\\\\\\\\\\\]]\",Fe=function(t){return new h(t)},Le=\".\",Oe='\".\"',Ie=function(){return new n(\"any-character\")},je=\"Literal\",Ne=/^[^|\\\\\\/.[()?+*$\\^]/,ze=\"[^|\\\\\\\\\\\\/.[()?+*$\\\\^]\",Ue=\"\\\\b\",Be='\"\\\\\\\\b\"',Ge=function(){return new n(\"backspace\")},Xe=function(){return new n(\"word-boundary\")},Ke=\"\\\\B\",We='\"\\\\\\\\B\"',Ye=function(){return new n(\"non-word-boundary\")},Je=\"\\\\d\",$e='\"\\\\\\\\d\"',Ve=function(){return new n(\"digit\")},Ze=\"\\\\D\",Qe='\"\\\\\\\\D\"',tn=function(){return new n(\"non-digit\")},en=\"\\\\f\",nn='\"\\\\\\\\f\"',rn=function(){return new n(\"form-feed\")},an=\"\\\\n\",on='\"\\\\\\\\n\"',un=function(){return new n(\"line-feed\")},ln=\"\\\\r\",sn='\"\\\\\\\\r\"',cn=function(){return new n(\"carriage-return\")},hn=\"\\\\s\",pn='\"\\\\\\\\s\"',fn=function(){return new n(\"white-space\")},dn=\"\\\\S\",mn='\"\\\\\\\\S\"',gn=function(){return new n(\"non-white-space\")},vn=\"\\\\t\",xn='\"\\\\\\\\t\"',yn=function(){return new n(\"tab\")},bn=\"\\\\v\",wn='\"\\\\\\\\v\"',Cn=function(){return new n(\"vertical-tab\")},kn=\"\\\\w\",Rn='\"\\\\\\\\w\"',En=function(){return new n(\"word\")},An=\"\\\\W\",_n='\"\\\\\\\\W\"',Mn=function(){\nreturn new n(\"non-word\")},Pn=\"\\\\c\",Sn='\"\\\\\\\\c\"',Tn=\"any character\",Hn=function(t){return new g(t)},Dn=\"\\\\\",qn='\"\\\\\\\\\"',Fn=/^[1-9]/,Ln=\"[1-9]\",On=function(t){return new m(t)},In=\"\\\\0\",jn='\"\\\\\\\\0\"',Nn=/^[0-7]/,zn=\"[0-7]\",Un=function(t){return new d(t.join(\"\"))},Bn=\"\\\\x\",Gn='\"\\\\\\\\x\"',Xn=/^[0-9a-fA-F]/,Kn=\"[0-9a-fA-F]\",Wn=function(t){return new f(t.join(\"\"))},Yn=\"\\\\u\",Jn='\"\\\\\\\\u\"',$n=function(t){return new p(t.join(\"\"))},Vn=function(){return new n(\"null-character\")},Zn=0,Qn=0,tr=0,er={line:1,column:1,seenCR:!1},nr=0,rr=[],ar=0;if(\"startRule\"in bt){if(!(bt.startRule in wt))throw new Error(\"Can't start parsing from rule \\\"\"+bt.startRule+'\".');Ct=wt[bt.startRule]}if(n.offset=x,n.text=v,yt=Ct(),null!==yt&&Zn===t.length)return yt;throw w(rr),Qn=Math.max(Zn,nr),new e(rr,Qn<t.length?t.charAt(Qn):null,Qn,y(Qn).line,y(Qn).column)}return t(e,Error),{SyntaxError:e,parse:v}}(),x=1,y={};t.exports=v},function(t,e,n){function r(t,e){for(var n=\"\",r=t;e>=r;r++)n+=String.fromCharCode(r);return n}var a=n(3),o=n(5),u={extend:a.extend},l=r(97,122),i=r(65,90),s=r(48,57),c=r(32,47)+r(58,64)+r(91,96)+r(123,126),h=r(32,126),p=\" \\f\\n\\r\t\\x0B \\u2028\\u2029\",f={\"\\\\w\":l+i+s+\"_\",\"\\\\W\":c.replace(\"_\",\"\"),\"\\\\s\":p,\"\\\\S\":function(){for(var t=h,e=0;e<p.length;e++)t=t.replace(p[e],\"\");return t}(),\"\\\\d\":s,\"\\\\D\":l+i+c};u.gen=function(t,e,n){return n=n||{guid:1},u[t.type]?u[t.type](t,e,n):u.token(t,e,n)},u.extend({token:function(t,e,n){switch(t.type){case\"start\":case\"end\":return\"\";case\"any-character\":return o.character();case\"backspace\":return\"\";case\"word-boundary\":return\"\";case\"non-word-boundary\":break;case\"digit\":return o.pick(s.split(\"\"));case\"non-digit\":return o.pick((l+i+c).split(\"\"));case\"form-feed\":break;case\"line-feed\":return t.body||t.text;case\"carriage-return\":break;case\"white-space\":return o.pick(p.split(\"\"));case\"non-white-space\":return o.pick((l+i+s).split(\"\"));case\"tab\":break;case\"vertical-tab\":break;case\"word\":return o.pick((l+i+s).split(\"\"));case\"non-word\":return o.pick(c.replace(\"_\",\"\").split(\"\"));case\"null-character\":}return t.body||t.text},alternate:function(t,e,n){return this.gen(o[\"boolean\"]()?t.left:t.right,e,n)},match:function(t,e,n){e=\"\";for(var r=0;r<t.body.length;r++)e+=this.gen(t.body[r],e,n);return e},\"capture-group\":function(t,e,n){return e=this.gen(t.body,e,n),n[n.guid++]=e,e},\"non-capture-group\":function(t,e,n){return this.gen(t.body,e,n)},\"positive-lookahead\":function(t,e,n){return this.gen(t.body,e,n)},\"negative-lookahead\":function(t,e,n){return\"\"},quantified:function(t,e,n){e=\"\";for(var r=this.quantifier(t.quantifier),a=0;r>a;a++)e+=this.gen(t.body,e,n);return e},quantifier:function(t,e,n){var r=Math.max(t.min,0),a=isFinite(t.max)?t.max:r+o.integer(3,7);return o.integer(r,a)},charset:function(t,e,n){if(t.invert)return this[\"invert-charset\"](t,e,n);var r=o.pick(t.body);return this.gen(r,e,n)},\"invert-charset\":function(t,e,n){for(var r,a=h,u=0;u<t.body.length;u++)switch(r=t.body[u],r.type){case\"literal\":a=a.replace(r.body,\"\");break;case\"range\":for(var l=this.gen(r.start,e,n).charCodeAt(),i=this.gen(r.end,e,n).charCodeAt(),s=l;i>=s;s++)a=a.replace(String.fromCharCode(s),\"\");default:var c=f[r.text];if(c)for(var p=0;p<=c.length;p++)a=a.replace(c[p],\"\")}return o.pick(a.split(\"\"))},range:function(t,e,n){var r=this.gen(t.start,e,n).charCodeAt(),a=this.gen(t.end,e,n).charCodeAt();return String.fromCharCode(o.integer(r,a))},literal:function(t,e,n){return t.escaped?t.body:t.text},unicode:function(t,e,n){return String.fromCharCode(parseInt(t.code,16))},hex:function(t,e,n){return String.fromCharCode(parseInt(t.code,16))},octal:function(t,e,n){return String.fromCharCode(parseInt(t.code,8))},\"back-reference\":function(t,e,n){return n[t.code]||\"\"},CONTROL_CHARACTER_MAP:function(){for(var t=\"@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\\\ ] ^ _\".split(\" \"),e=\"\\x00 \u0001 \u0002 \u0003 \u0004 \u0005 \u0006 \u0007 \\b \t \\n \\x0B \\f \\r \u000e \u000f \u0010 \u0011 \u0012 \u0013 \u0014 \u0015 \u0016 \u0017 \u0018 \u0019 \u001a \u001b \u001c \u001d \u001e \u001f\".split(\" \"),n={},r=0;r<t.length;r++)n[t[r]]=e[r];return n}(),\"control-character\":function(t,e,n){return this.CONTROL_CHARACTER_MAP[t.code]}}),t.exports=u},function(t,e,n){t.exports=n(24)},function(t,e,n){function r(t,e,n){n=n||[];var l={name:\"string\"==typeof e?e.replace(a.RE_KEY,\"$1\"):e,template:t,type:o.type(t),rule:u.parse(e)};switch(l.path=n.slice(0),l.path.push(void 0===e?\"ROOT\":l.name),l.type){case\"array\":l.items=[],o.each(t,function(t,e){l.items.push(r(t,e,l.path))});break;case\"object\":l.properties=[],o.each(t,function(t,e){l.properties.push(r(t,e,l.path))})}return l}var a=n(2),o=n(3),u=n(4);t.exports=r},function(t,e,n){t.exports=n(26)},function(t,e,n){function r(t,e){for(var n=o(t),r=u.diff(n,e),a=0;a<r.length;a++);return r}var a=n(3),o=n(23),u={diff:function(t,e,n){var r=[];return this.name(t,e,n,r)&&this.type(t,e,n,r)&&(this.value(t,e,n,r),this.properties(t,e,n,r),this.items(t,e,n,r)),r},name:function(t,e,n,r){var a=r.length;return l.equal(\"name\",t.path,n+\"\",t.name+\"\",r),r.length!==a?!1:!0},type:function(t,e,n,r){var o=r.length;return l.equal(\"type\",t.path,a.type(e),t.type,r),r.length!==o?!1:!0},value:function(t,e,n,r){var o=r.length,u=t.rule,i=a.type(t.template);if(\"object\"!==i&&\"array\"!==i){if(!t.rule.parameters)return void l.equal(\"value\",t.path,e,t.template,r);switch(i){case\"number\":var s=(e+\"\").split(\".\");s[0]=+s[0],void 0!==u.min&&void 0!==u.max&&(l.greaterThanOrEqualTo(\"value\",t.path,s[0],u.min,r),l.lessThanOrEqualTo(\"value\",t.path,s[0],u.max,r)),void 0!==u.min&&void 0===u.max&&l.equal(\"value\",t.path,s[0],u.min,r,\"[value] \"+n),u.decimal&&(void 0!==u.dmin&&void 0!==u.dmax&&(l.greaterThanOrEqualTo(\"value\",t.path,s[1].length,u.dmin,r),l.lessThanOrEqualTo(\"value\",t.path,s[1].length,u.dmax,r)),void 0!==u.dmin&&void 0===u.dmax&&l.equal(\"value\",t.path,s[1].length,u.dmin,r));break;case\"boolean\":break;case\"string\":var c=e.match(new RegExp(t.template,\"g\"));c=c?c.length:c,void 0!==u.min&&void 0!==u.max&&(l.greaterThanOrEqualTo(\"value\",t.path,c,u.min,r),l.lessThanOrEqualTo(\"value\",t.path,c,u.max,r)),void 0!==u.min&&void 0===u.max&&l.equal(\"value\",t.path,c,u.min,r)}return r.length!==o?!1:!0}},properties:function(t,e,n,r){var o=r.length,u=t.rule,i=a.keys(e);if(t.properties){if(t.rule.parameters?(void 0!==u.min&&void 0!==u.max&&(l.greaterThanOrEqualTo(\"properties length\",t.path,i.length,u.min,r),l.lessThanOrEqualTo(\"properties length\",t.path,i.length,u.max,r)),void 0!==u.min&&void 0===u.max&&l.equal(\"properties length\",t.path,i.length,u.min,r)):l.equal(\"properties length\",t.path,i.length,t.properties.length,r),r.length!==o)return!1;for(var s=0;s<i.length;s++)r.push.apply(r,this.diff(t.properties[s],e[i[s]],i[s]));return r.length!==o?!1:!0}},items:function(t,e,n,r){var a=r.length;if(t.items){var o=t.rule;if(t.rule.parameters?(void 0!==o.min&&void 0!==o.max&&(l.greaterThanOrEqualTo(\"items\",t.path,e.length,o.min*t.items.length,r,\"[{utype}] array is too short: {path} must have at least {expected} elements but instance has {actual} elements\"),l.lessThanOrEqualTo(\"items\",t.path,e.length,o.max*t.items.length,r,\"[{utype}] array is too long: {path} must have at most {expected} elements but instance has {actual} elements\")),void 0!==o.min&&void 0===o.max&&l.equal(\"items length\",t.path,e.length,o.min*t.items.length,r)):l.equal(\"items length\",t.path,e.length,t.items.length,r),r.length!==a)return!1;for(var u=0;u<e.length;u++)r.push.apply(r,this.diff(t.items[u%t.items.length],e[u],u%t.items.length));return r.length!==a?!1:!0}}},l={message:function(t){return(t.message||\"[{utype}] Expect {path}'{ltype} is {action} {expected}, but is {actual}\").replace(\"{utype}\",t.type.toUpperCase()).replace(\"{ltype}\",t.type.toLowerCase()).replace(\"{path}\",a.isArray(t.path)&&t.path.join(\".\")||t.path).replace(\"{action}\",t.action).replace(\"{expected}\",t.expected).replace(\"{actual}\",t.actual)},equal:function(t,e,n,r,a,o){if(n===r)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"equal to\",message:o};return u.message=l.message(u),a.push(u),!1},notEqual:function(t,e,n,r,a,o){if(n!==r)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"not equal to\",message:o};return u.message=l.message(u),a.push(u),!1},greaterThan:function(t,e,n,r,a,o){if(n>r)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"greater than\",message:o};return u.message=l.message(u),a.push(u),!1},lessThan:function(t,e,n,r,a,o){if(r>n)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"less to\",message:o};return u.message=l.message(u),a.push(u),!1},greaterThanOrEqualTo:function(t,e,n,r,a,o){if(n>=r)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"greater than or equal to\",message:o};return u.message=l.message(u),a.push(u),!1},lessThanOrEqualTo:function(t,e,n,r,a,o){if(r>=n)return!0;var u={path:e,type:t,actual:n,expected:r,action:\"less than or equal to\",message:o};return u.message=l.message(u),a.push(u),!1}};r.Diff=u,r.Assert=l,t.exports=r},function(t,e,n){t.exports=n(28)},function(t,e,n){function r(){this.custom={events:{},requestHeaders:{},responseHeaders:{}}}function a(){function t(){try{return new window._XMLHttpRequest}catch(t){}}function e(){try{return new window._ActiveXObject(\"Microsoft.XMLHTTP\")}catch(t){}}var n=function(){var t=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,e=/^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,n=location.href,r=e.exec(n.toLowerCase())||[];return t.test(r[1])}();return window.ActiveXObject?!n&&t()||e():t()}function o(t){function e(t,e){return\"string\"===l.type(t)?t===e:\"regexp\"===l.type(t)?t.test(e):void 0}for(var n in r.Mock._mocked){var a=r.Mock._mocked[n];if((!a.rurl||e(a.rurl,t.url))&&(!a.rtype||e(a.rtype,t.type.toLowerCase())))return a}}function u(t,e){return l.isFunction(t.template)?t.template(e):r.Mock.mock(t.template)}var l=n(3);window._XMLHttpRequest=window.XMLHttpRequest,window._ActiveXObject=window.ActiveXObject;try{new window.Event(\"custom\")}catch(i){window.Event=function(t,e,n,r){var a=document.createEvent(\"CustomEvent\");return a.initCustomEvent(t,e,n,r),a}}var s={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},c=\"readystatechange loadstart progress abort error load timeout loadend\".split(\" \"),h=\"readyState responseURL status statusText responseType response responseText responseXML\".split(\" \"),p={100:\"Continue\",101:\"Switching Protocols\",200:\"OK\",201:\"Created\",202:\"Accepted\",203:\"Non-Authoritative Information\",204:\"No Content\",205:\"Reset Content\",206:\"Partial Content\",300:\"Multiple Choice\",301:\"Moved Permanently\",302:\"Found\",303:\"See Other\",304:\"Not Modified\",305:\"Use Proxy\",307:\"Temporary Redirect\",400:\"Bad Request\",401:\"Unauthorized\",402:\"Payment Required\",403:\"Forbidden\",404:\"Not Found\",405:\"Method Not Allowed\",406:\"Not Acceptable\",407:\"Proxy Authentication Required\",408:\"Request Timeout\",409:\"Conflict\",410:\"Gone\",411:\"Length Required\",412:\"Precondition Failed\",413:\"Request Entity Too Large\",414:\"Request-URI Too Long\",415:\"Unsupported Media Type\",416:\"Requested Range Not Satisfiable\",417:\"Expectation Failed\",422:\"Unprocessable Entity\",500:\"Internal Server Error\",501:\"Not Implemented\",502:\"Bad Gateway\",503:\"Service Unavailable\",504:\"Gateway Timeout\",505:\"HTTP Version Not Supported\"};r._settings={timeout:\"10-100\"},r.setup=function(t){return l.extend(r._settings,t),r._settings},l.extend(r,s),l.extend(r.prototype,s),r.prototype.mock=!0,r.prototype.match=!1,l.extend(r.prototype,{open:function(t,e,n,u,i){function s(t){for(var e=0,n=h.length;n>e;e++)try{p[h[e]]=d[h[e]]}catch(r){}p.dispatchEvent(new Event(t.type))}var p=this;l.extend(this.custom,{method:t,url:e,async:\"boolean\"==typeof n?n:!0,username:u,password:i,options:{url:e,type:t}}),this.custom.timeout=function(t){if(\"number\"==typeof t)return t;if(\"string\"==typeof t&&!~t.indexOf(\"-\"))return parseInt(t,10);if(\"string\"==typeof t&&~t.indexOf(\"-\")){var e=t.split(\"-\"),n=parseInt(e[0],10),r=parseInt(e[1],10);return Math.round(Math.random()*(r-n))+n}}(r._settings.timeout);var f=o(this.custom.options);if(!f){var d=a();this.custom.xhr=d;for(var m=0;m<c.length;m++)d.addEventListener(c[m],s);return void(u?d.open(t,e,n,u,i):d.open(t,e,n))}this.match=!0,this.custom.template=f,this.readyState=r.OPENED,this.dispatchEvent(new Event(\"readystatechange\"))},setRequestHeader:function(t,e){if(!this.match)return void this.custom.xhr.setRequestHeader(t,e);var n=this.custom.requestHeaders;n[t]?n[t]+=\",\"+e:n[t]=e},timeout:0,withCredentials:!1,upload:{},send:function(t){function e(){n.readyState=r.HEADERS_RECEIVED,n.dispatchEvent(new Event(\"readystatechange\")),n.readyState=r.LOADING,n.dispatchEvent(new Event(\"readystatechange\")),n.status=200,n.statusText=p[200],n.responseText=JSON.stringify(u(n.custom.template,n.custom.options),null,4),n.readyState=r.DONE,n.dispatchEvent(new Event(\"readystatechange\")),n.dispatchEvent(new Event(\"load\")),n.dispatchEvent(new Event(\"loadend\"))}var n=this;return this.custom.options.body=t,this.match?(this.setRequestHeader(\"X-Requested-With\",\"MockXMLHttpRequest\"),this.dispatchEvent(new Event(\"loadstart\")),void(this.custom.async?setTimeout(e,this.custom.timeout):e())):void this.custom.xhr.send(t)},abort:function(){return this.match?(this.readyState=r.UNSENT,this.dispatchEvent(new Event(\"abort\",!1,!1,this)),void this.dispatchEvent(new Event(\"error\",!1,!1,this))):void this.custom.xhr.abort()}}),l.extend(r.prototype,{responseURL:\"\",status:r.UNSENT,statusText:\"\",getResponseHeader:function(t){return this.match?this.custom.responseHeaders[t.toLowerCase()]:this.custom.xhr.getResponseHeader(t)},getAllResponseHeaders:function(){if(!this.match)return this.custom.xhr.getAllResponseHeaders();var t=this.custom.responseHeaders,e=\"\";for(var n in t)t.hasOwnProperty(n)&&(e+=n+\": \"+t[n]+\"\\r\\n\");return e},overrideMimeType:function(){},responseType:\"\",response:null,responseText:\"\",responseXML:null}),l.extend(r.prototype,{addEventListene:function(t,e){var n=this.custom.events;n[t]||(n[t]=[]),n[t].push(e)},removeEventListener:function(t,e){for(var n=this.custom.events[t]||[],r=0;r<n.length;r++)n[r]===e&&n.splice(r--,1)},dispatchEvent:function(t){for(var e=this.custom.events[t.type]||[],n=0;n<e.length;n++)e[n].call(this,t);var r=\"on\"+t.type;this[r]&&this[r](t)}}),t.exports=r}])});\n//# sourceMappingURL=mock-min.js.map"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-starter-config/README.md",
    "content": "1. 客户端引用该pom，使用springcloud config client组件。\n2. spring.provides文件指定了具体的模块：\n    ```$xslt\n    provides: custom-config-client\n    ```\n3. POM关键配置\n    ```$xslt\n    <dependency>\n        <groupId>org.springframework.cloud</groupId>\n        <artifactId>spring-cloud-starter</artifactId>\n    </dependency>\n     <dependency>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <artifactId>custom-config-client</artifactId>\n    </dependency>\n    ```"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-starter-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>SpringCloud-Custom-ConfigCenter</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>custom-starter-config</artifactId>\n\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>custom-config-client</artifactId>\n            <version>0.0.1-SNAPSHOT</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <!-- Only needed at compile time -->\n            <scope>compile</scope>\n            <optional>true</optional>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/custom-starter-config/src/main/resources/META-INF/spring.provides",
    "content": "provides: custom-config-client"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/doc/configMysql.sql",
    "content": "DROP TABLE IF EXISTS `t_application`;\nCREATE TABLE `t_application` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `application` varchar(45) NOT NULL COMMENT '应用',\n  `application_name` varchar(45) DEFAULT NULL COMMENT '应用名称',\n  `label` varchar(45) NOT NULL DEFAULT 'master',\n  `profile` varchar(45) NOT NULL DEFAULT 'default' COMMENT '环境',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  `region_id` bigint(16) NOT NULL COMMENT '所属区域',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `APPLICATION_UNIQUE_KEY` (`application`,`label`,`profile`),\n  KEY `APPLICATION_INDEX` (`application`),\n  KEY `LABEL_INDEX` (`label`),\n  KEY `PROFILE_INDEX` (`profile`),\n  KEY `REGOIN_ID_INDEX` (`region_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COMMENT='应用表';\n\nDROP TABLE IF EXISTS `t_application_config`;\nCREATE TABLE `t_application_config` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `application_id` bigint(16) NOT NULL COMMENT '关联的应用ID',\n  `item_key` varchar(128) COLLATE utf8mb4_bin NOT NULL COMMENT '配置项KEY',\n  `item_value` varchar(128) COLLATE utf8mb4_bin NOT NULL COMMENT '配置项值',\n  `item_desc` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配置描述',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='应用私有配置信息表';\n\nDROP TABLE IF EXISTS `t_application_item_group_relation`;\nCREATE TABLE `t_application_item_group_relation` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `application_id` bigint(16) NOT NULL COMMENT '应用ID',\n  `item_group_id` bigint(16) NOT NULL COMMENT '配置组ID',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='应用和配置项组关系，应用多对多配置项组';\n\nDROP TABLE IF EXISTS `t_client_application`;\nCREATE TABLE `t_client_application` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT,\n  `application` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '应用名称',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  `status` int(11) DEFAULT '0' COMMENT '0在线，1离线(所有hostinfo离线的时候)',\n  `profile` varchar(45) COLLATE utf8mb4_bin DEFAULT 'default' COMMENT '环境',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`),\n  KEY `APPLICATION_INDEX` (`application`),\n  KEY `PROFILE_INDEX` (`profile`)\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='配置中心客户端应用';\n\nDROP TABLE IF EXISTS `t_client_host_info`;\nCREATE TABLE `t_client_host_info` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `client_application_id` bigint(16) NOT NULL COMMENT '所属应用ID',\n  `host_ip` varchar(45) COLLATE utf8mb4_bin NOT NULL COMMENT '连接主机IP',\n  `host_port` int(11) NOT NULL COMMENT '连接主机开放服务的端口',\n  `netty_ip` VARCHAR(45) NULL COMMENT 'netty 连接的IP地址',\n  `netty_port` int(11) NULL COMMENT 'netty 连接的PORT',\n  `status` int(11) DEFAULT '0' COMMENT '状态，0在线，1离线',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`),\n  KEY `IP_INDEX` (`host_ip`),\n  KEY `PORT_INDEX` (`host_port`),\n  KEY `STATUS_INDEX` (`status`)\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='配置中心客户端连接信息';\n\nDROP TABLE IF EXISTS `t_config_item`;\nCREATE TABLE `t_config_item` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `item_key` varchar(256) NOT NULL COMMENT '配置项KEY',\n  `item_value` varchar(128) NOT NULL COMMENT '配置项值',\n  `item_desc` varchar(128) DEFAULT NULL COMMENT '配置项描述',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  `status` int(11) DEFAULT '0' COMMENT '0可用,1不可用',\n  `item_type` int(1) DEFAULT '0' COMMENT '应用类型，0通用，1开发环境，2测试环境，3生产环境，4其他',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8mb4 COMMENT='具体配置项表';\n\nDROP TABLE IF EXISTS `t_config_item_group`;\nCREATE TABLE `t_config_item_group` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `group_name` varchar(45) NOT NULL COMMENT '组名称',\n  `group_desc` varchar(45) DEFAULT NULL COMMENT '组描述',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COMMENT='配置项组';\n\nDROP TABLE IF EXISTS `t_config_item_group_relation`;\nCREATE TABLE `t_config_item_group_relation` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `item_id` bigint(16) NOT NULL COMMENT '配置项ID',\n  `group_id` bigint(16) NOT NULL COMMENT '组ID',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb4 COMMENT='配置组和配置项的关系表';\n\nDROP TABLE IF EXISTS `t_region`;\nCREATE TABLE `t_region` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `region_name` varchar(45) NOT NULL COMMENT '区域名称',\n  `region_desc` varchar(45) DEFAULT NULL COMMENT '区域描述',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COMMENT='区域';\n\nDROP TABLE IF EXISTS `t_server_host_config`;\nCREATE TABLE `t_server_host_config` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\n  `server_host` varchar(45) NOT NULL COMMENT 'IP地址',\n  `server_desc` varchar(45) DEFAULT NULL COMMENT '服务描述',\n  `region_id` bigint(16) NOT NULL COMMENT '关联区域',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id_UNIQUE` (`id`),\n  UNIQUE KEY `host_UNIQUE` (`server_host`)\n) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COMMENT='服务器配置';"
  },
  {
    "path": "SpringCloud-Custom-ConfigCenter/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>pom</packaging>\n    <modules>\n        <module>custom-config-pojo</module>\n        <module>custom-config-service</module>\n        <module>custom-config-web</module>\n        <module>custom-config-server</module>\n        <module>custom-config-client</module>\n        <module>custom-config-dependencies</module>\n        <module>custom-starter-config</module>\n        <module>custom-config-simple</module>\n    </modules>\n\n    <artifactId>SpringCloud-Custom-ConfigCenter</artifactId>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <spring-cloud.version>Edgware.SR4</spring-cloud.version>\n    </properties>\n\n    <dependencies>\n        <!-- 开发者工具 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-devtools</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <profiles>\n        <profile>\n            <id>dev</id>\n            <activation>\n                <activeByDefault>true</activeByDefault>\n            </activation>\n            <properties>\n                <env>dev</env>\n            </properties>\n        </profile>\n        <profile>\n            <id>test</id>\n            <properties>\n                <env>test</env>\n            </properties>\n        </profile>\n        <profile>\n            <id>prod</id>\n            <properties>\n                <env>prod</env>\n            </properties>\n        </profile>\n    </profiles>\n\n\n</project>"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/Readme.md",
    "content": "Springboot Rest Template配置\n\n1. 支持Ok Http和Http连接池模式，内嵌包装成HttClientService服务，并提供完成的请求日志处理\n2. 引入pom:\n    ```$xslt\n    <dependency>\n        <groupId>com.purcotton.omni</groupId>\n        <artifactId>omni-common-rest-starter</artifactId>\n        <version>${project.version}</version>\n    </dependency>\n    ```\n\n3. Ok Http使用：\n    ```$xslt\n        rest:\n          # okhttp 配置\n          okhttp:\n            enable: true\n            connection-timeout: 12000\n            read-timeout: 30000\n            write-timeout: 12000\n    ```\n4. Http pool使用：\n    ```$xslt\n        rest\n          # http pool\n          pool:\n            enable: true\n            max-total: 20\n            default-max-per-route: 2\n            validate-after-inactivity: 2000\n            connect-timeout: 10000\n            connection-request-timeout: 10000\n            socket-timeout: 10000\n    ```\n5. 使用方式，推荐使用HttpClientService，因为提供了完整的日志记录：\n    ```$xslt\n            // 使用包装http client\n           @Autowired\n           private HttpClientService httpClientService;\n           \n           // 使用 resttemplate\n           @Autowired\n           private RestTemplate restTemplate;\n    ```\n6. HttpClientService日志处理，实现HttpRequestLogService接口\n    ```$xslt\n    public class HttpLogServiceImpl implements HttpRequestLogService\n        {\n            /**\n             * [简要描述]:保存日志信息<br/>\n             * [详细描述]:<br/>\n             *\n             * @param requestLog :\n             * llxiao  2019/4/24 - 14:42\n             **/\n            @Override\n            public void saveRequestLog(HttpRequestLog requestLog)\n            {\n                // 日志输出\n                log.info(\"Example log : {}\", JSONObject.toJSONString(requestLog));\n            }\n        }\n    ```"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/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>SpringCloud-Custom-RestTemplate-Stater</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-RestTemplate-Stater</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-context</artifactId>\n            <scope>compile</scope>\n            <version>1.3.4.RELEASE</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n\n        <!-- springboot 依赖 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-autoconfigure</artifactId>\n        </dependency>\n\n        <!-- 将被@ConfigurationProperties注解的类的属性注入到元数据 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-collections</groupId>\n            <artifactId>commons-collections</artifactId>\n            <version>3.2.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.squareup.okhttp3</groupId>\n            <artifactId>okhttp</artifactId>\n            <version>3.11.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.5.13</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n\n    </dependencies>\n</project>"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/dto/Request.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.dto;\n\nimport lombok.Data;\nimport org.springframework.http.HttpHeaders;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 13:48\n * @since JDK 1.8\n */\n@Data\npublic class Request\n{\n    public static final int POST = 0;\n    public static final int JSON = 1;\n\n    /**\n     * 请求uri\n     */\n    private String uri;\n    /**\n     * 返回值类型\n     */\n    private Class responseType;\n    /**\n     * 请求参数\n     */\n    private Object params;\n    /**\n     * 执行方式：0普通请求，1.JSON请求\n     */\n    private int method;\n\n    /**\n     * 执行请求的ID，用于重复请求更新操作\n     */\n    private Long requestId;\n\n    /**\n     * 自定义请求头\n     */\n    private HttpHeaders headers;\n\n    /**\n     * url变量\n     */\n    private Object uriVariables;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/interceptor/RestInterceptor.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.interceptor;\n\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.dto.HttpRequestLog;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.util.ThreadLocalUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpRequest;\nimport org.springframework.http.client.ClientHttpRequestExecution;\nimport org.springframework.http.client.ClientHttpRequestInterceptor;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.http.client.support.HttpRequestWrapper;\n\nimport java.io.IOException;\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: restTemplate 拦截\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/23 16:47\n * @since JDK 1.8\n */\n@Slf4j\npublic class RestInterceptor implements ClientHttpRequestInterceptor\n{\n    /**\n     * Intercept the given request, and return a response. The given {@link ClientHttpRequestExecution} allows\n     * the interceptor to pass on the request and response to the next entity in the chain.\n     *\n     * <p>A typical implementation of this method would follow the following pattern:\n     * <ol>\n     * <li>Examine the {@linkplain HttpRequest request} and body</li>\n     * <li>Optionally {@linkplain HttpRequestWrapper wrap} the request to filter HTTP attributes.</li>\n     * <li>Optionally modify the body of the request.</li>\n     * <li><strong>Either</strong>\n     * <ul>\n     * <li>execute the request using {@link ClientHttpRequestExecution#execute(HttpRequest, byte[])},</li>\n     * <strong>or</strong>\n     * <li>do not execute the request to block the execution altogether.</li>\n     * </ul>\n     * <li>Optionally wrap the response to filter HTTP attributes.</li>\n     * </ol>\n     *\n     * @param request the request, containing method, URI, and headers\n     * @param body the body of the request\n     * @param execution the request execution\n     * @return the response\n     * @exception IOException in case of I/O errors\n     */\n    @Override\n    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)\n            throws IOException\n    {\n        HttpRequestLog requestLog = (HttpRequestLog) ThreadLocalUtil.get(HttpRequestLog.REQUEST_LOG);\n        if (null != requestLog)\n        {\n            requestLog.setMethod(request.getMethod().name());\n            requestLog.setRequestTime(new Timestamp(System.currentTimeMillis()));\n        }\n\n        ClientHttpResponse response = execution.execute(request, body);\n\n        if (null != requestLog)\n        {\n            requestLog.setHttpStatus(response.getStatusCode().value());\n            requestLog.setResponseTime(new Timestamp(System.currentTimeMillis()));\n        }\n        return response;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/log/annotation/RequestLog.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.log.annotation;\n\nimport java.lang.annotation.*;\n\nimport static java.lang.annotation.RetentionPolicy.RUNTIME;\n\n/**\n * [简要描述]: 请HTTP求日志注解\n * [详细描述]:\n * Retention 注解会在class字节码文件中存在，在运行时可以通过反射获取到\n * Inherited 说明子类可以继承父类中的该注解\n * Target 既可以在方法上，也可以在类上\n * Documented说明该注解将被包含在javadoc中\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 11:40\n * @since JDK 1.8\n */\n@Retention(RUNTIME)\n@Inherited\n@Target(ElementType.METHOD)\n@Documented\npublic @interface RequestLog\n{\n    String value() default \"\";\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/log/annotation/RequestLogAspect.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.log.annotation;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.dto.Request;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.dto.HttpRequestLog;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.service.HttpRequestLogService;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.util.ThreadLocalUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 请求日志切面\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 11:39\n * @since JDK 1.8\n */\n@Aspect\n@Component\n@Slf4j\npublic class RequestLogAspect\n{\n\n    /**\n     * 请求响应最大长度\n     */\n    private static final int MAX_PARAMS_LENGTH = 256;\n\n    /**\n     * 日志服务\n     */\n    @Autowired(required = false)\n    private HttpRequestLogService httpRequestLogService;\n\n    /**\n     * [简要描述]:定义一个annotation切入点<br/>\n     * [详细描述]:切入点<br/>\n     * llxiao  2018/9/2 - 17:02\n     **/\n    @Pointcut(\"@annotation(com.xiao.springcloud.rest.stater.autoconfig.common.log.annotation.RequestLog)\")\n    public void logAnnotatison()\n    {\n\n    }\n\n    /**\n     * [简要描述]:around 切面强化<br/>\n     * [详细描述]:<br/>\n     *\n     * @param joinPoint :\n     * @return Object\n     * llxiao  2019/11/27 - 19:10\n     **/\n    @Around(\"logAnnotatison()\")\n    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable\n    {\n        HttpRequestLog requestLog = null;\n        Object retrunobj = null;\n        Object[] args = joinPoint.getArgs();\n        if (args.length > 0)\n        {\n\n            Object params = args[0];\n            if (params instanceof Request)\n            {\n                Request request = (Request) params;\n                Long requestId = request.getRequestId();\n                if (null == requestId)\n                {\n                    requestLog = new HttpRequestLog();\n                    requestLog.setCreateTime(new Timestamp(System.currentTimeMillis()));\n                    requestLog.setRequest(subParams(JSONObject.toJSONString(request)));\n                    requestLog.setUri(request.getUri());\n                    requestLog.setParams(subParams(JSONObject.toJSONString(request.getParams())));\n                    requestLog.setResponseType(request.getResponseType().getName());\n                }\n                ThreadLocalUtil.put(HttpRequestLog.REQUEST_LOG, requestLog);\n            }\n\n        }\n\n        try\n        {\n            retrunobj = joinPoint.proceed(args);\n            if (null != requestLog)\n            {\n                requestLog.setResponse(subParams(JSONObject.toJSONString(retrunobj)));\n            }\n        }\n        catch (Throwable e)\n        {\n            if (null != requestLog)\n            {\n                requestLog.setErrorMsg(e.getMessage());\n            }\n            log.error(\"Http 请求执行错误: \", e);\n            throw e;\n        }\n        finally\n        {\n            //删除当前线程保存数据，防止内存溢出\n            ThreadLocalUtil.remove();\n            if (null != httpRequestLogService)\n            {\n                httpRequestLogService.saveRequestLog(requestLog);\n            }\n            else\n            {\n                log.info(\"Http 执行日志：{}\", JSONObject.toJSONString(requestLog));\n            }\n\n        }\n\n        return retrunobj;\n    }\n\n    /**\n     * [简要描述]:参数截取，参数太长超过2000直接用*号代替<br/>\n     * [详细描述]:<br/>\n     *\n     * @param toJsonString :\n     * @return java.lang.String\n     * llxiao  2019/8/8 - 11:43\n     **/\n    private String subParams(String toJsonString)\n    {\n        String params = \"\";\n        if (StringUtils.isNotEmpty(toJsonString))\n        {\n            if (toJsonString.length() > MAX_PARAMS_LENGTH)\n            {\n                params = toJsonString.substring(0, MAX_PARAMS_LENGTH);\n            }\n            else\n            {\n                params = toJsonString;\n            }\n        }\n        return params;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/log/dto/HttpRequestLog.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.log.dto;\n\nimport lombok.Data;\n\nimport java.sql.Timestamp;\n\n/**\n * [简要描述]: 请求日志，以此来做请求补偿，请求日志记录等等\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 10:00\n * @since JDK 1.8\n */\n@Data\npublic class HttpRequestLog\n{\n    public static final String REQUEST_LOG = \"HttpRequestLog\";\n\n    /**\n     * 主键ID\n     */\n    private Long id;\n    /**\n     * 请求Url\n     */\n    private String uri;\n    /**\n     * 请求方式\n     */\n    private String method;\n    /**\n     * JSON键值对header\n     */\n    private String header;\n    /**\n     * 请求参数，JSON数据\n     */\n    private String params;\n    /**\n     * 响应参数，JSON数据\n     */\n    private String response;\n    /**\n     * 响应参数需要转换的类型\n     */\n    private String responseType;\n    /**\n     * http状态\n     */\n    private int httpStatus;\n    /**\n     * 请求最终状态\n     */\n    private int status;\n\n    /**\n     * 尝试次数\n     */\n    private int tryNum;\n\n    /**\n     * 整个请求request-JSON串\n     */\n    private String request;\n\n    /**\n     * 错误消息\n     */\n    private String errorMsg;\n\n    /**\n     * 请求时间\n     */\n    private Timestamp requestTime;\n    /**\n     * 响应时间\n     */\n    private Timestamp responseTime;\n\n    private Timestamp createTime;\n    private Timestamp updateTime;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/log/service/HttpRequestLogService.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.log.service;\n\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.dto.HttpRequestLog;\n\n/**\n * [简要描述]: http 请求日志记录\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/29 15:33\n * @since JDK 1.8\n */\npublic interface HttpRequestLogService\n{\n    /**\n     * [简要描述]:保存日志信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param requestLog :\n     * llxiao  2019/4/24 - 14:42\n     **/\n    void saveRequestLog(HttpRequestLog requestLog);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/service/HttpClientService.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.service;\n\nimport com.xiao.springcloud.rest.stater.autoconfig.common.dto.Request;\nimport org.springframework.http.ResponseEntity;\n\n/**\n * [简要描述]: http服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/23 19:53\n * @since JDK 1.8\n */\npublic interface HttpClientService\n{\n    /**\n     * [简要描述]:发起post请求<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request : 请求参数\n     * @return T\n     * llxiao  2019/4/23 - 19:56\n     **/\n    <T> T doForObject(Request request);\n\n    <T> T doRequest(Request request);\n\n    <T> T getForObject(Request request);\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return org.springframework.http.ResponseEntity<T>\n     * llxiao  2019/8/26 - 16:33\n     **/\n    <T> ResponseEntity<T> postFormData(Request request);\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/service/impl/HttpClientServiceImpl.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.dto.Request;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.annotation.RequestLog;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.service.HttpClientService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.client.RestTemplate;\nimport org.springframework.web.util.UriComponentsBuilder;\n\nimport java.util.Map;\n\n/**\n * [简要描述]: http服务\n * [详细描述]:\n * 重试机制注解说明（https://blog.csdn.net/u011116672/article/details/77823867）：\n * EnableRetry注解：\n * 能否重试，proxyTargetClass属性为true时（默认false），使用CGLIB代理\n * <p>\n * Retryable注解：注解需要被重试的方法\n * include 指定处理的异常类。默认为空\n * exclude指定不需要处理的异常。默认为空\n * vaue指定要重试的异常。默认为空\n * maxAttempts 最大重试次数。默认3次\n * backoff 重试等待策略。默认使用@Backoff注解\n * <p>\n * Backoff注解：重试回退策略（立即重试还是等待一会再重试）\n * 不设置参数时，默认使用FixedBackOffPolicy，重试等待1000ms\n * 只设置delay()属性时，使用FixedBackOffPolicy，重试等待指定的毫秒数\n * 当设置delay()和maxDealy()属性时，重试等待在这两个值之间均态分布\n * 使用delay()，maxDealy()和multiplier()属性时，使用ExponentialBackOffPolicy\n * 当设置multiplier()属性不等于0时，同时也设置了random()属性时，使用ExponentialRandomBackOffPolicy\n * <p>\n * Recover注解: 用于方法。\n * 用于@Retryable失败时的“兜底”处理方法。 @Recover注释的方法必须要与@Retryable注解的方法“签名”保持一致，第一入参为要重试的异常，其他参数与@Retryable保持一致，返回值也要一样，否则无法执行！\n * <p>\n * CircuitBreaker注解：用于方法，实现熔断模式。\n * include 指定处理的异常类。默认为空\n * exclude指定不需要处理的异常。默认为空\n * vaue指定要重试的异常。默认为空\n * maxAttempts 最大重试次数。默认3次\n * openTimeout 配置熔断器打开的超时时间，默认5s，当超过openTimeout之后熔断器电路变成半打开状态（只要有一次重试成功，则闭合电路）\n * resetTimeout 配置熔断器重新闭合的超时时间，默认20s，超过这个时间断路器关闭\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 09:25\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class HttpClientServiceImpl implements HttpClientService\n{\n    private static final String JSON_UTF_8 = \"application/json; charset=UTF-8\";\n    private static final String HEADER_ACCEPT = \"Accept\";\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    /**\n     * [简要描述]: 发起post请求<br/>\n     * [详细描述]: @Retryable默认重试 等待1000ms 3次\n     *\n     * @param request : 请求参数\n     * @return T\n     * llxiao  2019/4/23 - 19:56\n     **/\n    @Override\n    @RequestLog\n    public <T> T doForObject(Request request)\n    {\n        ResponseEntity<T> entity = null;\n        if (null != request)\n        {\n            String uri = request.getUri();\n            Object params = request.getParams();\n            int method = request.getMethod();\n            Class responseType = request.getResponseType();\n            HttpHeaders headers = request.getHeaders();\n            Object uriVariables = request.getUriVariables();\n\n            if (Request.POST == method)\n            {\n                entity = restTemplate.postForEntity(uri, params, responseType, uriVariables);\n            }\n            else if (Request.JSON == method)\n            {\n                if (null == headers)\n                {\n                    headers = new HttpHeaders();\n                    headers.setContentType(MediaType.parseMediaType(JSON_UTF_8));\n                    headers.add(HEADER_ACCEPT, MediaType.APPLICATION_JSON.toString());\n                }\n                HttpEntity<String> formEntity = new HttpEntity<>(JSONObject.toJSONString(params), headers);\n                entity = restTemplate.postForEntity(uri, formEntity, responseType, uriVariables);\n            }\n            else\n            {\n                log.error(\"当期请求暂不支持的操作，请求参数：{}\", JSONObject.toJSONString(request));\n            }\n        }\n        return null == entity ? null : entity.getBody();\n    }\n\n    @Override\n    @RequestLog\n    public <T> T doRequest(Request request)\n    {\n        return (T) restTemplate.postForObject(request.getUri(), request.getParams(), request.getResponseType());\n    }\n\n    /**\n     * [简要描述]: 不进行encode编码的get请求\n     * [详细描述]: 请求参数中的url必须进行手动encode编码\n     *\n     * @param request : 请求参数\n     * @return T\n     * mjye  2019/10/23 - 11:32\n     **/\n    @Override\n    @RequestLog\n    public <T> T getForObject(Request request)\n    {\n        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(request.getUri());\n        return (T) restTemplate.getForObject(builder.build(true).toUri(), request.getResponseType());\n    }\n\n    /**\n     * [简要描述]:formdata 获取请求Response<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request :\n     * @return org.springframework.http.ResponseEntity<T>\n     * llxiao  2019/8/26 - 16:33\n     **/\n    @Override\n    @RequestLog\n    public <T> ResponseEntity<T> postFormData(Request request)\n    {\n        HttpEntity httpEntity = null;\n        Object params = request.getParams();\n        // 请求参数为httpEntity直接发送请求\n        if (params instanceof HttpEntity)\n        {\n            httpEntity = (HttpEntity) params;\n        }\n        // 需要重新组装 HttpEntity\n        else if (params instanceof MultiValueMap)\n        {\n            MultiValueMap multiValueMap = (MultiValueMap) params;\n            httpEntity = new HttpEntity<>(multiValueMap, request.getHeaders());\n        }\n        else if (params instanceof Map)\n        {\n            Map<String, String> parmasMap = (Map<String, String>) params;\n            MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();\n            for (Map.Entry<String, String> entry : parmasMap.entrySet())\n            {\n                multiValueMap.add(entry.getKey(), entry.getValue());\n            }\n            httpEntity = new HttpEntity<>(multiValueMap, request.getHeaders());\n        }\n        else\n        {\n            log.error(\"当亲请求暂不支持的操作请求，请求数据：{}\", JSONObject.toJSONString(request));\n        }\n        if (null != httpEntity)\n        {\n            return restTemplate.postForEntity(request.getUri(), httpEntity, request.getResponseType());\n        }\n        else\n        {\n            log.error(\"请求异常，无法识别请求数据，请求数据：{}\", JSONObject.toJSONString(request));\n            return null;\n        }\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/common/util/ThreadLocalUtil.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.common.util;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]: ThreadLocalUtil\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/4/24 09:25\n * @since JDK 1.8\n */\npublic class ThreadLocalUtil\n{\n    private static final ThreadLocal<Map<String, Object>> context = ThreadLocal.withInitial(() -> new HashMap<>());\n\n    public static Map<String, Object> getThreadLocal()\n    {\n        return context.get();\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal中获取一个线程变量<br/>\n     * [详细描述]:不存在，返回null<br/>\n     *\n     * @param key :\n     * @return java.lang.Object\n     * llxiao  2019/4/24 - 9:43\n     **/\n    public static Object get(String key)\n    {\n        Map<String, Object> map = context.get();\n        if (null != map)\n        {\n            return map.get(key);\n        }\n        return null;\n    }\n\n    /**\n     * [简要描述]:设置一个键值对到ThreadLocal中<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @param value :\n     * llxiao  2019/4/24 - 9:42\n     **/\n    public static void put(String key, Object value)\n    {\n        Map<String, Object> map = context.get();\n        if (null == map)\n        {\n            map = new HashMap<>();\n            context.set(map);\n        }\n        map.put(key, value);\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal的当前线程中删除一个key<br/>\n     * [详细描述]:<br/>\n     *\n     * @param key :\n     * @return void\n     * llxiao  2019/4/24 - 9:41\n     **/\n    public static void remove(String key)\n    {\n        Map<String, Object> map = context.get();\n        if (null != map)\n        {\n            map.remove(key);\n        }\n    }\n\n    /**\n     * [简要描述]:从ThreadLocal中移除当前线程的变量<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/4/24 - 9:41\n     **/\n    public static void remove()\n    {\n        context.remove();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/config/RestTemplateConfiguration.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.config;/**\n * [简要描述]:\n * [详细描述]:\n *\n * @since JDK 1.8\n */\n\nimport com.xiao.springcloud.rest.stater.autoconfig.common.interceptor.RestInterceptor;\nimport com.xiao.springcloud.rest.stater.autoconfig.config.properties.HttpPoolProperties;\nimport com.xiao.springcloud.rest.stater.autoconfig.config.properties.OkHttpProperties;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.config.Registry;\nimport org.apache.http.config.RegistryBuilder;\nimport org.apache.http.conn.socket.ConnectionSocketFactory;\nimport org.apache.http.conn.socket.PlainConnectionSocketFactory;\nimport org.apache.http.conn.ssl.SSLConnectionSocketFactory;\nimport org.apache.http.impl.client.HttpClientBuilder;\nimport org.apache.http.impl.conn.PoolingHttpClientConnectionManager;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.client.ClientHttpRequestFactory;\nimport org.springframework.http.client.ClientHttpResponse;\nimport org.springframework.http.client.HttpComponentsClientHttpRequestFactory;\nimport org.springframework.http.client.OkHttp3ClientHttpRequestFactory;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.web.client.ResponseErrorHandler;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Collections;\n\n/**\n * [简要描述]: 初始化rest template\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:43\n * @since JDK 1.8\n */\n@Configuration\n@ComponentScan(\"com.xiao.springcloud.rest.stater.autoconfig\")\n@Slf4j\npublic class RestTemplateConfiguration\n{\n\n    @Bean\n    @ConditionalOnProperty(value = \"rest.okhttp.enable\", havingValue = \"true\")\n    @ConditionalOnMissingBean(ClientHttpRequestFactory.class)\n    public ClientHttpRequestFactory okHttpHttpRequestFactory(OkHttpProperties okHttpProperties)\n    {\n        log.info(\"Init request factory for okHttp\");\n        ClientHttpRequestFactory clientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory();\n        //连接超时\n        ((OkHttp3ClientHttpRequestFactory) clientHttpRequestFactory)\n                .setConnectTimeout(okHttpProperties.getConnectionTimeout());\n        //读超时\n        ((OkHttp3ClientHttpRequestFactory) clientHttpRequestFactory).setReadTimeout(okHttpProperties.getReadTimeout());\n        //写超时\n        ((OkHttp3ClientHttpRequestFactory) clientHttpRequestFactory)\n                .setWriteTimeout(okHttpProperties.getWriteTimeout());\n        return clientHttpRequestFactory;\n    }\n\n    @Bean\n    @ConditionalOnProperty(value = \"rest.pool.enable\", havingValue = \"true\")\n    @ConditionalOnMissingBean(ClientHttpRequestFactory.class)\n    public ClientHttpRequestFactory httpPoolRequestFactory(HttpPoolProperties httpPoolProperties)\n    {\n        log.info(\"Init request factory for http pool\");\n        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()\n                .register(\"http\", PlainConnectionSocketFactory.getSocketFactory())\n                .register(\"https\", SSLConnectionSocketFactory.getSocketFactory()).build();\n        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);\n        connectionManager.setMaxTotal(httpPoolProperties.getMaxTotal());\n        connectionManager.setDefaultMaxPerRoute(httpPoolProperties.getDefaultMaxPerRoute());\n        connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());\n        RequestConfig requestConfig = RequestConfig.custom()\n                //服务器返回数据(response)的时间，超过抛出read timeout\n                .setSocketTimeout(httpPoolProperties.getSocketTimeout())\n                //连接上服务器(握手成功)的时间，超出抛出connect timeout\n                .setConnectTimeout(httpPoolProperties.getConnectTimeout())\n                //从连接池中获取连接的超时时间，超时间未拿到可用连接，会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool\n                .setConnectionRequestTimeout(httpPoolProperties.getConnectionRequestTimeout()).build();\n        return new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create()\n                .setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager).build());\n    }\n\n    @Bean\n    @ConditionalOnBean(ClientHttpRequestFactory.class)\n    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory)\n    {\n        log.info(\"Init rest template!\");\n        RestTemplate restTemplate = new RestTemplate();\n        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));\n        restTemplate.setRequestFactory(clientHttpRequestFactory);\n\n        //异常处理\n        restTemplate.setErrorHandler(new ResponseErrorHandler()\n        {\n            @Override\n            public boolean hasError(ClientHttpResponse response) throws IOException\n            {\n                return response.getStatusCode().value() != 200;\n            }\n\n            @Override\n            public void handleError(ClientHttpResponse response) throws IOException\n            {\n                log.error(\"Request error:\");\n                log.error(\"Response status code:\" + response.getStatusCode().value());\n            }\n        });\n\n        // 拦截\n        restTemplate.setInterceptors(Collections.singletonList(new RestInterceptor()));\n        return restTemplate;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/config/properties/HttpPoolProperties.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.config.properties;\n\nimport lombok.Data;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: http 连接池参数配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 11:09\n * @since JDK 1.8\n */\n@Component\n@ConfigurationProperties(prefix = \"rest.pool\")\n@ConditionalOnProperty(value = \"rest.pool.enable\", havingValue = \"true\")\n@Data\npublic class HttpPoolProperties\n{\n\n    private boolean enable;\n\n    /**\n     * 最大连接数\n     */\n    private Integer maxTotal = 20;\n\n    /**\n     * 最大路由数\n     */\n    private Integer defaultMaxPerRoute = 2;\n\n    /**\n     * 连接超时时间\n     */\n    private Integer connectTimeout = 5000;\n\n    /**\n     * 请求超时时间\n     */\n    private Integer connectionRequestTimeout = 1000;\n\n    /**\n     * socket超时时间\n     */\n    private Integer socketTimeout = 6500;\n\n    /**\n     * 校验时间\n     */\n    private Integer validateAfterInactivity = 2000;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/java/com/xiao/springcloud/rest/stater/autoconfig/config/properties/OkHttpProperties.java",
    "content": "package com.xiao.springcloud.rest.stater.autoconfig.config.properties;\n\nimport lombok.Data;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: ok http 参数配置\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 11:09\n * @since JDK 1.8\n */\n@Component\n@ConfigurationProperties(\"rest.okhttp\")\n@ConditionalOnProperty(value = \"rest.okhttp.enable\", havingValue = \"true\")\n@Data\npublic class OkHttpProperties\n{\n\n    private boolean enable;\n\n    /**\n     * 连接超时时间\n     */\n    private int connectionTimeout = 12000;\n\n    /**\n     * 读超时时间\n     */\n    private int readTimeout = 300000;\n\n    /**\n     * 写超时时间\n     */\n    private int writeTimeout = 120000;\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater/src/main/resources/META-INF/spring.factories",
    "content": "org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.xiao.springcloud.rest.stater.autoconfig.config.RestTemplateConfiguration"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/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>SpringCloud-Custom-RestTemplate-Stater</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-RestTemplate-Stater-Example</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>SpringCloud-RestTemplate-Stater</artifactId>\n            <version>${project.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${project.artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/main/java/com/xiao/springcloud/rest/RestTemplateStaterApp.java",
    "content": "package com.xiao.springcloud.rest;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/12/6 11:06\n * @since JDK 1.8\n */\n@SpringBootApplication\npublic class RestTemplateStaterApp\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(RestTemplateStaterApp.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/main/java/com/xiao/springcloud/rest/log/impl/HttpLogServiceiImpl.java",
    "content": "package com.xiao.springcloud.rest.log.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.dto.HttpRequestLog;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.log.service.HttpRequestLogService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]: HTTP 日志处理实现类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:26\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class HttpLogServiceiImpl implements HttpRequestLogService\n{\n    /**\n     * [简要描述]:保存日志信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param requestLog :\n     * llxiao  2019/4/24 - 14:42\n     **/\n    @Override\n    public void saveRequestLog(HttpRequestLog requestLog)\n    {\n        log.info(\"Example log : {}\", JSONObject.toJSONString(requestLog));\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/main/resources/application.yml",
    "content": "rest:\n  # okhttp 配置\n  okhttp:\n    enable: false\n    connection-timeout: 12000\n    read-timeout: 30000\n    write-timeout: 12000\n  # http pool\n  pool:\n    enable: true\n    max-total: 20\n    default-max-per-route: 2\n    validate-after-inactivity: 2000\n    connect-timeout: 10000\n    connection-request-timeout: 10000\n    socket-timeout: 10000\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n\n    <!-- 控制台Appender -->\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"ERROR\"/>\n    <logger name=\"org.apache.zookeeper\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <!-- 启动的时候一些日志屏蔽 -->\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.jmx.export.annotation.AnnotationMBeanExporter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.mvc\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.web.servlet.FilterRegistrationBean\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.config.sources.URLConfigurationSource\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.ui.freemarker.SpringTemplateLoader\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.context.annotation.AnnotationConfigApplicationContext\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.beans.factory.support.DefaultListableBeanFactory\" level=\"ERROR\"/>\n    <logger name=\"org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter\" level=\"ERROR\"/>\n\n    <logger name=\"com.purcotton.omni.rest.stater\" level=\"debug\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"/>\n    </logger>\n\n    <root level=\"INFO\">\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n\n\n</configuration>"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/test/java/com/xiao/springcloud/rest/RestTemplateStarterAppTest.java",
    "content": "package com.xiao.springcloud.rest;\n\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:30\n * @since JDK 1.8\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class RestTemplateStarterAppTest\n{\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/SpringCloud-RestTemplate-Stater-Example/src/test/java/com/xiao/springcloud/rest/httpclient/HttpClientTest.java",
    "content": "package com.xiao.springcloud.rest.httpclient;\n\nimport com.xiao.springcloud.rest.RestTemplateStarterAppTest;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.dto.Request;\nimport com.xiao.springcloud.rest.stater.autoconfig.common.service.HttpClientService;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * [简要描述]: HTTP client测试\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/11/30 10:32\n * @since JDK 1.8\n */\npublic class HttpClientTest extends RestTemplateStarterAppTest\n{\n    @Autowired\n    private HttpClientService httpClientService;\n\n    @Test\n    public void testHttpGet()\n    {\n        Request request = new Request();\n        request.setResponseType(String.class);\n        request.setUri(\"http://www.baidu.com\");\n        String forObject = httpClientService.getForObject(request);\n        System.out.println(forObject);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Custom-RestTemplate-Stater/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Custom-RestTemplate-Stater</artifactId>\n    <packaging>pom</packaging>\n    <modules>\n        <module>SpringCloud-RestTemplate-Stater</module>\n        <module>SpringCloud-RestTemplate-Stater-Example</module>\n    </modules>\n\n\n</project>"
  },
  {
    "path": "SpringCloud-Demo-Doc/ES/es索引创建1.1.jmx",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jmeterTestPlan version=\"1.2\" properties=\"3.2\" jmeter=\"3.3 r1808647\">\n  <hashTree>\n    <TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"测试计划\" enabled=\"true\">\n      <stringProp name=\"TestPlan.comments\"></stringProp>\n      <boolProp name=\"TestPlan.functional_mode\">false</boolProp>\n      <boolProp name=\"TestPlan.serialize_threadgroups\">false</boolProp>\n      <elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\" guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n        <collectionProp name=\"Arguments.arguments\"/>\n      </elementProp>\n      <stringProp name=\"TestPlan.user_define_classpath\"></stringProp>\n    </TestPlan>\n    <hashTree>\n      <ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"创建ES索引和Mapping\" enabled=\"true\">\n        <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n        <elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\" guiclass=\"LoopControlPanel\" testclass=\"LoopController\" testname=\"循环控制器\" enabled=\"true\">\n          <boolProp name=\"LoopController.continue_forever\">false</boolProp>\n          <stringProp name=\"LoopController.loops\">1</stringProp>\n        </elementProp>\n        <stringProp name=\"ThreadGroup.num_threads\">1</stringProp>\n        <stringProp name=\"ThreadGroup.ramp_time\">1</stringProp>\n        <longProp name=\"ThreadGroup.start_time\">1516344477000</longProp>\n        <longProp name=\"ThreadGroup.end_time\">1516344477000</longProp>\n        <boolProp name=\"ThreadGroup.scheduler\">false</boolProp>\n        <stringProp name=\"ThreadGroup.duration\"></stringProp>\n        <stringProp name=\"ThreadGroup.delay\"></stringProp>\n      </ThreadGroup>\n      <hashTree>\n        <ConfigTestElement guiclass=\"HttpDefaultsGui\" testclass=\"ConfigTestElement\" testname=\"服务器端口设置  \" enabled=\"true\">\n          <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n            <collectionProp name=\"Arguments.arguments\"/>\n          </elementProp>\n          <stringProp name=\"HTTPSampler.domain\">172.16.250.52</stringProp>\n          <stringProp name=\"HTTPSampler.port\">9200</stringProp>\n          <stringProp name=\"HTTPSampler.protocol\">http</stringProp>\n          <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n          <stringProp name=\"HTTPSampler.path\"></stringProp>\n          <stringProp name=\"TestPlan.comments\">dev 172.16.80.181   test 172.16.250.52</stringProp>\n          <stringProp name=\"HTTPSampler.concurrentPool\">6</stringProp>\n          <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n          <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n        </ConfigTestElement>\n        <hashTree/>\n        <HeaderManager guiclass=\"HeaderPanel\" testclass=\"HeaderManager\" testname=\"请求消息头设置\" enabled=\"true\">\n          <collectionProp name=\"HeaderManager.headers\">\n            <elementProp name=\"\" elementType=\"Header\">\n              <stringProp name=\"Header.name\">Content-Type</stringProp>\n              <stringProp name=\"Header.value\">application/json</stringProp>\n            </elementProp>\n          </collectionProp>\n        </HeaderManager>\n        <hashTree/>\n        <Arguments guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"索引名称和type设置\" enabled=\"true\">\n          <collectionProp name=\"Arguments.arguments\">\n            <elementProp name=\"indexName\" elementType=\"Argument\">\n              <stringProp name=\"Argument.name\">indexName</stringProp>\n              <stringProp name=\"Argument.value\">purcotton</stringProp>\n              <stringProp name=\"Argument.desc\">索引名称</stringProp>\n              <stringProp name=\"Argument.metadata\">=</stringProp>\n            </elementProp>\n            <elementProp name=\"type\" elementType=\"Argument\">\n              <stringProp name=\"Argument.name\">type</stringProp>\n              <stringProp name=\"Argument.value\">purcotton</stringProp>\n              <stringProp name=\"Argument.desc\">索引Type</stringProp>\n              <stringProp name=\"Argument.metadata\">=</stringProp>\n            </elementProp>\n          </collectionProp>\n        </Arguments>\n        <hashTree/>\n        <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"索引创建删除\" enabled=\"true\"/>\n        <hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"创建索引\" enabled=\"true\">\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n              <collectionProp name=\"Arguments.arguments\"/>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}</stringProp>\n            <stringProp name=\"HTTPSampler.method\">PUT</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">true</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-1534991152\">&quot;acknowledged&quot;:true</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">2</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"创建mapping\" enabled=\"true\">\n            <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">{&quot;${type}&quot;: {&#xd;\n\t&quot;properties&quot;: {&#xd;\n\t\t&quot;commoNo&quot;: {&quot;type&quot;: &quot;keyword&quot;},&#xd;\n\t\t&quot;defProdNo&quot;: {\t&quot;type&quot;: &quot;keyword&quot;},&#xd;\n\t\t&quot;prodPicUrl&quot;: {&quot;type&quot;: &quot;keyword&quot;},&#xd;\n\t\t&quot;commoCatNo&quot;: {&quot;type&quot;: &quot;keyword&quot;},&#xd;\n\t\t&quot;oprtCatNo&quot;: {\t&quot;type&quot;: &quot;text&quot;,&quot;analyzer&quot;: &quot;ik_max_word&quot;,&quot;search_analyzer&quot;: &quot;ik_max_word&quot;},&#xd;\n\t\t&quot;title&quot;: {&quot;type&quot;: &quot;text&quot;},&#xd;\n\t\t&quot;subTitle&quot;: {&quot;type&quot;: &quot;text&quot;},&#xd;\n\t\t&quot;price&quot;: {&quot;type&quot;: &quot;float&quot;},&#xd;\n\t\t&quot;keyWords&quot;: {&quot;type&quot;: &quot;text&quot;},&#xd;\n\t\t&quot;salesTagName&quot;: {&quot;type&quot;: &quot;text&quot;,&quot;analyzer&quot;: &quot;ik_max_word&quot;,&quot;search_analyzer&quot;: &quot;ik_max_word&quot;},&#xd;\n\t\t&quot;listTime&quot;: {&quot;type&quot;: &quot;date&quot;},&#xd;\n\t\t&quot;discountRate&quot;: {&quot;type&quot;: &quot;keyword&quot;},&#xd;\n\t\t&quot;newly&quot;: {&quot;type&quot;: &quot;long&quot;},&#xd;\n\t\t&quot;hasStock&quot;: {&quot;type&quot;: &quot;long&quot;},&#xd;\n\t\t&quot;salesVolume&quot;: {&quot;type&quot;: &quot;long&quot;},&#xd;\n\t\t&quot;comments&quot;: {&quot;type&quot;: &quot;long&quot;}&#xd;\n\t}&#xd;\n}&#xd;\n}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\">utf-8</stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}/${type}/_mapping</stringProp>\n            <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <boolProp name=\"HTTPSampler.BROWSER_COMPATIBLE_MULTIPART\">true</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-113726808\">{&quot;acknowledged&quot;:true}</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">2</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"查看mapping信息\" enabled=\"false\">\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n              <collectionProp name=\"Arguments.arguments\"/>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}/_mapping</stringProp>\n            <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-898787913\">${indexName}</stringProp>\n                <stringProp name=\"1222623756\">${type}</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">34</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"删除索引\" enabled=\"false\">\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n              <collectionProp name=\"Arguments.arguments\"/>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}</stringProp>\n            <stringProp name=\"HTTPSampler.method\">DELETE</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-113726808\">{&quot;acknowledged&quot;:true}</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">1</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <ResultCollector guiclass=\"ViewResultsFullVisualizer\" testclass=\"ResultCollector\" testname=\"察看结果树\" enabled=\"true\">\n            <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n            <objProp>\n              <name>saveConfig</name>\n              <value class=\"SampleSaveConfiguration\">\n                <time>true</time>\n                <latency>true</latency>\n                <timestamp>true</timestamp>\n                <success>true</success>\n                <label>true</label>\n                <code>true</code>\n                <message>true</message>\n                <threadName>true</threadName>\n                <dataType>true</dataType>\n                <encoding>false</encoding>\n                <assertions>true</assertions>\n                <subresults>true</subresults>\n                <responseData>false</responseData>\n                <samplerData>false</samplerData>\n                <xml>false</xml>\n                <fieldNames>true</fieldNames>\n                <responseHeaders>false</responseHeaders>\n                <requestHeaders>false</requestHeaders>\n                <responseDataOnError>false</responseDataOnError>\n                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n                <assertionsResultsToSave>0</assertionsResultsToSave>\n                <bytes>true</bytes>\n                <sentBytes>true</sentBytes>\n                <threadCounts>true</threadCounts>\n                <idleTime>true</idleTime>\n                <connectTime>true</connectTime>\n              </value>\n            </objProp>\n            <stringProp name=\"filename\"></stringProp>\n          </ResultCollector>\n          <hashTree/>\n        </hashTree>\n        <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"pinyin测试\" enabled=\"false\"/>\n        <hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"创建索引\" enabled=\"false\">\n            <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">{&#xd;\n   &quot;index&quot; : {&#xd;\n        &quot;number_of_shards&quot; : &quot;3&quot;,&#xd;\n        &quot;number_of_replicas&quot; : &quot;1&quot;,&#xd;\n        &quot;analysis&quot; : {&#xd;\n          &quot;analyzer&quot; : {&#xd;\n            &quot;default&quot; : {&#xd;\n              &quot;tokenizer&quot; : &quot;ik_max_word&quot;&#xd;\n            },&#xd;\n            &quot;pinyin_analyzer&quot; : {&#xd;\n              &quot;tokenizer&quot; : &quot;my_pinyin&quot;&#xd;\n            }&#xd;\n          },&#xd;\n          &quot;tokenizer&quot; : {&#xd;\n            &quot;my_pinyin&quot; : {&#xd;\n              &quot;keep_separate_first_letter&quot; : &quot;false&quot;,&#xd;\n              &quot;lowercase&quot; : &quot;true&quot;,&#xd;\n              &quot;type&quot; : &quot;pinyin&quot;,&#xd;\n              &quot;limit_first_letter_length&quot; : &quot;16&quot;,&#xd;\n              &quot;keep_original&quot; : &quot;true&quot;,&#xd;\n              &quot;keep_full_pinyin&quot; : &quot;true&quot;&#xd;\n            }&#xd;\n          }&#xd;\n        }&#xd;\n      }&#xd;\n}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}</stringProp>\n            <stringProp name=\"HTTPSampler.method\">PUT</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">true</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-1534991152\">&quot;acknowledged&quot;:true</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">2</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"创建mapping\" enabled=\"false\">\n            <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">{&#xd;\n\t&quot;${type}&quot;: {&#xd;\n\t\t&quot;properties&quot;: {&#xd;\n\t\t\t&quot;commoNo&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;keyword&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;defProdNo&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;keyword&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;prodPicUrl&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;keyword&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;commoCatNo&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;keyword&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;oprtCatNo&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;text&quot;,&#xd;\n\t\t\t\t&quot;analyzer&quot;: &quot;ik_max_word&quot;,&#xd;\n\t\t\t\t&quot;search_analyzer&quot;: &quot;ik_max_word&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;title&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;text&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;subTitle&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;text&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;price&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;float&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;keyWords&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;text&quot;,&#xd;\n\t\t\t\t &quot;fields&quot;: {&#xd;\n\t                    &quot;pinyin&quot;: {&#xd;\n\t                        &quot;type&quot;: &quot;text&quot;,&#xd;\n\t                        &quot;term_vector&quot;: &quot;with_positions_offsets&quot;,&#xd;\n\t                        &quot;analyzer&quot;: &quot;pinyin_analyzer&quot;,&#xd;\n\t                        &quot;boost&quot;: 10.0&#xd;\n\t                    }&#xd;\n                \t}&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;listTime&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;date&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;discountRate&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;keyword&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;newly&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;long&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;hasStock&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;long&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;salesVolume&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;long&quot;&#xd;\n\t\t\t},&#xd;\n\t\t\t&quot;comments&quot;: {&#xd;\n\t\t\t\t&quot;type&quot;: &quot;long&quot;&#xd;\n\t\t\t}&#xd;\n\t\t}&#xd;\n\t}&#xd;\n}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\">utf-8</stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}/${type}/_mapping</stringProp>\n            <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <boolProp name=\"HTTPSampler.BROWSER_COMPATIBLE_MULTIPART\">true</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-113726808\">{&quot;acknowledged&quot;:true}</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">2</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"测试分词分词器\" enabled=\"false\">\n            <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">{&#xd;\n\t&quot;text&quot;:[&quot;刘德华&quot;],&#xd;\n\t&quot;analyzer&quot;:&quot;pinyin_analyzer&quot;&#xd;\n}</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}/_analyze</stringProp>\n            <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <boolProp name=\"HTTPSampler.BROWSER_COMPATIBLE_MULTIPART\">true</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree/>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"删除索引\" enabled=\"false\">\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\" guiclass=\"HTTPArgumentsPanel\" testclass=\"Arguments\" testname=\"用户定义的变量\" enabled=\"true\">\n              <collectionProp name=\"Arguments.arguments\"/>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}</stringProp>\n            <stringProp name=\"HTTPSampler.method\">DELETE</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree>\n            <ResponseAssertion guiclass=\"AssertionGui\" testclass=\"ResponseAssertion\" testname=\"响应断言\" enabled=\"true\">\n              <collectionProp name=\"Asserion.test_strings\">\n                <stringProp name=\"-113726808\">{&quot;acknowledged&quot;:true}</stringProp>\n              </collectionProp>\n              <stringProp name=\"Assertion.test_field\">Assertion.response_data</stringProp>\n              <boolProp name=\"Assertion.assume_success\">false</boolProp>\n              <intProp name=\"Assertion.test_type\">1</intProp>\n            </ResponseAssertion>\n            <hashTree/>\n          </hashTree>\n          <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"pinyin搜索\" enabled=\"true\">\n            <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n            <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n              <collectionProp name=\"Arguments.arguments\">\n                <elementProp name=\"\" elementType=\"HTTPArgument\">\n                  <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n                  <stringProp name=\"Argument.value\">{&#xd;\n    &quot;query&quot;: {&quot;match_phrase&quot;: {&#xd;\n      &quot;keyWords.pinyin&quot;: &quot;maojin&quot;&#xd;\n    }}&#xd;\n  }</stringProp>\n                  <stringProp name=\"Argument.metadata\">=</stringProp>\n                </elementProp>\n              </collectionProp>\n            </elementProp>\n            <stringProp name=\"HTTPSampler.domain\"></stringProp>\n            <stringProp name=\"HTTPSampler.port\"></stringProp>\n            <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n            <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n            <stringProp name=\"HTTPSampler.path\">${indexName}/${type}/_search</stringProp>\n            <stringProp name=\"HTTPSampler.method\">GET</stringProp>\n            <boolProp name=\"HTTPSampler.follow_redirects\">true</boolProp>\n            <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n            <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n            <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n            <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n            <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n            <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n          </HTTPSamplerProxy>\n          <hashTree/>\n          <ResultCollector guiclass=\"ViewResultsFullVisualizer\" testclass=\"ResultCollector\" testname=\"察看结果树\" enabled=\"true\">\n            <boolProp name=\"ResultCollector.error_logging\">false</boolProp>\n            <objProp>\n              <name>saveConfig</name>\n              <value class=\"SampleSaveConfiguration\">\n                <time>true</time>\n                <latency>true</latency>\n                <timestamp>true</timestamp>\n                <success>true</success>\n                <label>true</label>\n                <code>true</code>\n                <message>true</message>\n                <threadName>true</threadName>\n                <dataType>true</dataType>\n                <encoding>false</encoding>\n                <assertions>true</assertions>\n                <subresults>true</subresults>\n                <responseData>false</responseData>\n                <samplerData>false</samplerData>\n                <xml>false</xml>\n                <fieldNames>true</fieldNames>\n                <responseHeaders>false</responseHeaders>\n                <requestHeaders>false</requestHeaders>\n                <responseDataOnError>false</responseDataOnError>\n                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>\n                <assertionsResultsToSave>0</assertionsResultsToSave>\n                <bytes>true</bytes>\n                <sentBytes>true</sentBytes>\n                <threadCounts>true</threadCounts>\n                <idleTime>true</idleTime>\n                <connectTime>true</connectTime>\n              </value>\n            </objProp>\n            <stringProp name=\"filename\"></stringProp>\n          </ResultCollector>\n          <hashTree/>\n        </hashTree>\n      </hashTree>\n    </hashTree>\n    <WorkBench guiclass=\"WorkBenchGui\" testclass=\"WorkBench\" testname=\"工作台\" enabled=\"true\">\n      <boolProp name=\"WorkBench.save\">true</boolProp>\n    </WorkBench>\n    <hashTree/>\n  </hashTree>\n</jmeterTestPlan>\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/docker/batch_del.sh",
    "content": "#!/bin/bash\n#author wxd\n## 删除15天以前的数据\n## 索引名称： app-log-2020.06.27\n## Linux定时任务执行:\n##最后linux crontab 设置如下：\n##00 00 * * * /bin/bash ${WORK_PATH}/batch_del.sh del >> ${WORK_PATH}/del-elkOverDateIndex-running.log\n## link: https://blog.csdn.net/weixin_38920212/article/details/98184115\n\nPARAMETER=$1\nES_URL=\"your-es-url\" #es对外http连接地址\nES_USER=\"your-name\"  #es用户名\nES_PASSWORD=\"your-password\" #es用户密码\nAPP_INDEX_START=app-log-\n\nbefore7day=$(date -d '-7days' +'%Y%m%d')\nbefore15day=$(date -d '-15days' +'%Y%m%d')\nbefore30day=$(date -d '-30days' +'%Y%m%d')\n\nusage() {\n    echo -e \"\\033[46;31mUsage\\033[0m: Please use \\e[0;35m$0 del \\e[0m\"\n    exit 1;\n}\n\n#1 app-log日志  获取app-log-索引开头的 日志后缀 如：2020.06.07\napp_log_datetime=$(curl -s -u $ES_USER:$ES_PASSWORD $ES_URL/_cat/indices | awk '{print $3}' | grep $APP_INDEX_START | sort -n | sed -r 's/app-log-(.*)/\\1/')\nclose_delete_app_log_index(){\n    echo \"start match app_log_datetime\"\n    for i in `echo $app_log_datetime`;do\n      # 转日期 2020.06.07\n      indexOriDate=$(echo $i | head -n 1)\n      # 转成 20200607\n      indexFormatDate=$(echo $i | head -n 1 | sed 's/\\.//g')\n      # 组成索引名称 app-log-2020.06.07\n      apm_overDateIndex=\"$APP_INDEX_START$indexOriDate\"\n      ## 15以前的数据\n      if [[ $before15day -ge $indexFormatDate ]]; then\n        echo -e \"\\n$(date '+%Y-%m-%d %H:%M:%S')   es_index match successful,当前索引：\\e[0;35m$apm_overDateIndex\\e[0m\"\n        curl -XPOST -u $ES_USER:$ES_PASSWORD \"$ES_URL/$apm_overDateIndex/_close\"\n        echo -e \"$(date '+%Y-%m-%d %H:%M:%S')   索引\\e[0;35m$apm_overDateIndex\\e[0m, 关闭完成\"\n        if [[ ` echo $? ` == 0 ]];then\n          curl -XDELETE -u $ES_USER:$ES_PASSWORD \"$ES_URL/$apm_overDateIndex\"\n          echo -e \"$(date '+%Y-%m-%d %H:%M:%S')   索引\\e[0;35m$apm_overDateIndex\\e[0m, 删除完成\"\n        else\n          echo -e \"$(date '+%Y-%m-%d %H:%M:%S')   索引\\e[0;35m$apm_overDateIndex\\e[0m, 关闭失败，无法进行删除\"\n        fi\n      else\n        echo -e \"\\n$(date '+%Y-%m-%d %H:%M:%S')   es_index match fail,当前索引：\\e[0;35m$apm_overDateIndex\\e[0m\"\n        echo -e \"$(date '+%Y-%m-%d %H:%M:%S')   索引\\e[0;35m$apm_overDateIndex\\e[0m, 没有过期,不需要关闭，over..\"\n      fi\n    done\n}\n\nif [ -n \"$PARAMETER\" ]; then\n   case \"$PARAMETER\" in\n    del)\n\t\techo -e \"开始删除 APP LOG 历史索引\"\n\t\tclose_delete_app_log_index\n\n\t\techo -e \"-----------------------------------------------删除完毕!-----------------------------------------------\"\n        ;;\n    *)\n        usage\n        exit\n        ;;\n    esac\nelse\n    echo -e \"\\033[46;31merror\\033[0m: please input parameter\"\nfi\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/docker/docker-build.sh",
    "content": "#!/bin/bash\n\n#### docker 构建脚本\n##背景：jenkins部署在容器中，无法利用docker执行操作，通过ssh将jar包和当前路径下的dockerfile推送到指定服务器目录上，使用脚本进行构建\n# 1. 本地已安装docker，docker push的前提需要当前服务器已经登陆到容器私服如harbor(docker login)\n# 2. 同级目录下必须存在Dockerfile文件和需要打包的springboot服务jar包\n# 参数说明 $1服务jar名称,$2镜像版本号\n## 执行示例： ./docker-build.sh product-service latest\n\nservice_name=$1\n# 镜像私服仓库/项目，使用harbor作为私服仓库\nregistry_name=myharbor.com:8088/project\nimage_tag=$2\njar_file=$service_name.jar\nimage_info=$registry_name/$service_name:$image_tag\n\n#echo $service_name\n#echo $jar_file\n#echo $image_info\n\necho \"开始执行镜像构建...\"\n# 执行docker 构建镜像\nbuild_result=$(docker build -t $image_info --build-arg JAR_FILE=$jar_file .)\n\n# 判断是否构建成功\n#echo $build_result\nif [[ $build_result =~ \"Successfully\" ]]; then\n  echo \"构建成功，镜像信息如下：\"\n  echo `docker images |grep $service_name`\n  echo \"开始执行镜像推送到私服仓库...\"\n  push_result=$(docker push $image_info)\n  if [[ $push_result =~ \"latest: digest\" ]]; then\n    echo \"推送镜像成功：\"$image_info\n    exit 0\n  else\n    echo \"推送镜像失败，失败信息如下：\"\n    echo $push_result\n    exit 1\n  fi\nelse\n  echo \"构建失败，失败信息如下：\"\n  echo $build_result\n  exit 1\nfi"
  },
  {
    "path": "SpringCloud-Demo-Doc/docker/docker-monitor.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_INFLUX\",\n      \"label\": \"influx\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"influxdb\",\n      \"pluginName\": \"InfluxDB\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"4.2.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"influxdb\",\n      \"name\": \"InfluxDB\",\n      \"version\": \"1.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": []\n  },\n  \"editable\": true,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"hideControls\": false,\n  \"id\": 2,\n  \"links\": [],\n  \"refresh\": \"5s\",\n  \"rows\": [\n    {\n      \"collapse\": false,\n      \"height\": 250,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": \"influx\",\n          \"fill\": 1,\n          \"id\": 1,\n          \"interval\": \"\",\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": true,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"span\": 6,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"alias\": \"Memory {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$__interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"memory_usage\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"query\": \"SELECT \\\"value\\\" FROM \\\"memory_usage\\\" WHERE \\\"container_name\\\" =~ /^$container$/ AND \\\"machine\\\" =~ /^$host$/ AND $timeFilter\",\n              \"rawQuery\": false,\n              \"refId\": \"A\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                }\n              ]\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeShift\": null,\n          \"title\": \"Memory\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"decbytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ]\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": \"influx\",\n          \"fill\": 1,\n          \"id\": 2,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"total\": true,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"span\": 6,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"alias\": \"CPU {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"cpu_usage_total\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"refId\": \"A\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  },\n                  {\n                    \"params\": [\n                      \"10s\"\n                    ],\n                    \"type\": \"derivative\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                }\n              ]\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeShift\": null,\n          \"title\": \"CPU\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"hertz\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ]\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": false,\n      \"title\": \"Dashboard Row\",\n      \"titleSize\": \"h6\"\n    },\n    {\n      \"collapse\": false,\n      \"height\": 250,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": \"influx\",\n          \"fill\": 1,\n          \"id\": 3,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"total\": true,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"span\": 6,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"alias\": \"Usage {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"fs_usage\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"refId\": \"A\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                }\n              ]\n            },\n            {\n              \"alias\": \"Limit {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"fs_limit\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"refId\": \"B\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                }\n              ]\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeShift\": null,\n          \"title\": \"File System\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"decbytes\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ]\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": \"influx\",\n          \"fill\": 1,\n          \"id\": 4,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"total\": true,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"percentage\": false,\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"span\": 6,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"alias\": \"RX {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"rx_bytes\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"refId\": \"A\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  },\n                  {\n                    \"params\": [\n                      \"10s\"\n                    ],\n                    \"type\": \"derivative\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                }\n              ]\n            },\n            {\n              \"alias\": \"TX {host: $tag_machine, container: $tag_container_name}\",\n              \"dsType\": \"influxdb\",\n              \"groupBy\": [\n                {\n                  \"params\": [\n                    \"$interval\"\n                  ],\n                  \"type\": \"time\"\n                },\n                {\n                  \"params\": [\n                    \"container_name\"\n                  ],\n                  \"type\": \"tag\"\n                },\n                {\n                  \"params\": [\n                    \"machine\"\n                  ],\n                  \"type\": \"tag\"\n                }\n              ],\n              \"measurement\": \"tx_bytes\",\n              \"orderByTime\": \"ASC\",\n              \"policy\": \"default\",\n              \"refId\": \"B\",\n              \"resultFormat\": \"time_series\",\n              \"select\": [\n                [\n                  {\n                    \"params\": [\n                      \"value\"\n                    ],\n                    \"type\": \"field\"\n                  },\n                  {\n                    \"params\": [],\n                    \"type\": \"mean\"\n                  },\n                  {\n                    \"params\": [\n                      \"10s\"\n                    ],\n                    \"type\": \"derivative\"\n                  }\n                ]\n              ],\n              \"tags\": [\n                {\n                  \"key\": \"machine\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$host$/\"\n                },\n                {\n                  \"condition\": \"AND\",\n                  \"key\": \"container_name\",\n                  \"operator\": \"=~\",\n                  \"value\": \"/^$container$*/\"\n                }\n              ]\n            }\n          ],\n          \"thresholds\": [],\n          \"timeFrom\": null,\n          \"timeShift\": null,\n          \"title\": \"Network\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"buckets\": null,\n            \"mode\": \"time\",\n            \"name\": null,\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"Bps\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"label\": null,\n              \"logBase\": 1,\n              \"max\": null,\n              \"min\": null,\n              \"show\": true\n            }\n          ]\n        }\n      ],\n      \"repeat\": null,\n      \"repeatIteration\": null,\n      \"repeatRowId\": null,\n      \"showTitle\": false,\n      \"title\": \"Dashboard Row\",\n      \"titleSize\": \"h6\"\n    }\n  ],\n  \"schemaVersion\": 14,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allValue\": \"\",\n        \"current\": {\n          \"text\": \"backbox.corde.org\",\n          \"value\": \"backbox.corde.org\"\n        },\n        \"datasource\": \"influx\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Host\",\n        \"multi\": false,\n        \"name\": \"host\",\n        \"options\": [],\n        \"query\": \"show tag values with key = \\\"machine\\\"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"text\": \"/\",\n          \"value\": \"/\"\n        },\n        \"datasource\": \"influx\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Container\",\n        \"multi\": false,\n        \"name\": \"container\",\n        \"options\": [],\n        \"query\": \"show tag values with key = \\\"container_name\\\" WHERE machine =~ /^$host$/\",\n        \"refresh\": 1,\n        \"regex\": \"/([^.]+)/\",\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"cAdvisor\",\n  \"version\": 2\n}"
  },
  {
    "path": "SpringCloud-Demo-Doc/docker/docker-monitor.yml",
    "content": "# cAdvisor+InfluxDB+Grafana\nversion: \"3.4\"\n\nservices:\n  influx:\n    #image: influxdb\n    image: tutum/influxdb:0.9\n    ports:\n      - \"8083:8083\"\n      - \"8086:8086\"\n    volumes:\n      - influx:/var/lib/influxdb\n    deploy:\n      replicas: 1\n      restart_policy:\n        condition: on-failure\n      placement:\n        constraints:\n          - node.role == manager\n    environment:\n      - PRE_CREATE_DB=cadvisor\n\n  cadvisor:\n    image: google/cadvisor\n    hostname: '{{.Node.Hostname}}'\n    command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086\n    ports:\n      - \"8180:8180\"\n    volumes:\n      - /:/rootfs:ro\n      - /var/run:/var/run:rw\n      - /sys:/sys:ro\n      - /var/lib/docker/:/var/lib/docker:ro\n    depends_on:\n      - influx\n    deploy:\n      mode: global\nvolumes:\n  influx:\n    driver: local\n  grafana:\n    driver: local"
  },
  {
    "path": "SpringCloud-Demo-Doc/docker/docker-swarm-springcloud.md",
    "content": "**docker swarm 部署 springcloud**   \n-\n\n_前提已经安装好docker swarm集群_<br>\n_在swarm主节点上创建了网络``docker network create --driver overlay springcloud-overlay``_<br>\n_主要注意容器内网络，swarm集群内部可以通过services的name做dns使用_<br>\n\n\n- 标准版的spring cloud项目包含4部分``eureka、gateway、provider、consumer``<br>\n- 请求流程：``client请求-->gateway-->consumer(feign)-->provider``\n- 在swarm manager节点上，执行``docker stack deploy -c XXXX.yml stack_name`` 部署上述四个服务\n\n1. eureka-server配置\n  * application.yml配置：\n    ```yaml\n    # 容器环境变量\n    docker:\n      env:\n        eureka:\n          ## 通过容器指定参数\n          host: ${EUREKA_HOST}\n          port: ${EUREKA_PORT}\n          hostname: ${INSTANCE_NAME:localhost}\n    eureka:\n      instance:\n        hostname: ${docker.env.eureka.hostname}\n        instance-id: ${eureka.instance.hostname}:${server.port}\n      client:\n        fetch-registry: true\n        register-with-eureka: true\n        service-url:\n          #defaultZone: http://localhost:8888/eureka\n          defaultZone: http://${docker.env.eureka.host}:${docker.env.eureka.port}/eureka\n      server:\n        enable-self-preservation: false\n    ```\n  * 对应EUREKA-HA相互注册的eureka的 stack脚本，springcloud-eureka-ha.yml:\n    ```yaml\n    version: \"3.4\"\n\n    # eureka\n    services:\n      swarm-eureka1:\n        image: 私服仓库/项目/springcloud-swarm-eureka:latest\n        deploy:\n          replicas: 1\n          restart_policy:\n            condition: on-failure\n        volumes:\n          - /tmp:/tmp\n        networks:\n          springcloud-overlay:\n            aliases:\n              # 该网络内取一个别名，即DNS，只要在springcloud-overlay网络内就可以通过swarm-eureka:8888可以访问注册中心\n              - swarm-eureka\n        ports:\n          # 对外暴露端口:容器内部端口\n          - \"9888:8888\"\n        environment:\n          # 注册到swarm-eureka2的注册中心\n          - EUREKA_HOST=swarm-eureka2\n          # 相互注册，使用容器内的8888端口并非暴露的 9888端口\n          - EUREKA_PORT=8888\n          # 注册到eureka的实例 ID名称，取当前服务的名称：swarm-eureka1，内网通过服务名称做dns服务发现\n          - INSTANCE_NAME=swarm-eureka1\n      swarm-eureka2:\n        image: 私服仓库/项目/mall/springcloud-swarm-eureka:latest\n        volumes:\n          - /tmp:/tmp\n        networks:\n          springcloud-overlay:\n            aliases:\n              - swarm-eureka\n        ports:\n          - \"9889:8888\"\n        environment:\n          - EUREKA_HOST=swarm-eureka1\n          - EUREKA_PORT=8888\n          - INSTANCE_NAME=swarm-eureka2\n    # 需要先创建网络：docker network create --driver overlay springcloud-overlay\n    networks:\n      springcloud-overlay:\n        external: true\n    ```\n    执行``docker stack deploy -c springcloud-eureka-ha.yml springcloud-eureka``\n\n2. eureka client端配置，gateway、provider、consumer端的 eureka配置都一样\n    ```yaml\n    # docker 环境变量设置\n    docker:\n      env:\n        eureka:\n          host: ${EUREKA_HOST:localhost}\n          port: ${EUREKA_PORT:8888}\n          username: ${EUREKA_USERNAME}\n          password: ${EUREKA_PASSWORD}\n          hostname: ${INSTANCE_NAME:localhost}\n          fetch: ${EUREKA_FETCH:true}\n          register: ${EUREKA_REGISTER:true}\n          # 版本号支持\n          metadata:\n            version: ${SERVICE_VERSION:v1}\n    eureka:\n      client:\n        register-with-eureka: ${docker.env.eureka.register}\n        fetch-registry: ${docker.env.eureka.fetch}\n        service-url:\n          #defaultZone: http://localhost:8888/eureka\n          ## 通过容器指定参数\n          defaultZone: http://${docker.env.eureka.host}:${docker.env.eureka.port}/eureka\n          #defaultZone: http://${docker.env.eureka.username}:${docker.env.eureka.password}@${docker.eureka.host}:${docker.eureka.port}/eureka\n      instance:\n        # 使用docker 编排里面的service name，即定义的service名称\n        hostname: ${docker.env.eureka.hostname}\n        ## 元数据\n        metadata-map:\n          version: ${docker.env.eureka.metadata.version}\n          #weight: 10\n        # 使用ip注册\n        #prefer-ip-address: true\n        #instance-id: ${spring.cloud.client.ip-address}:${server.port}\n        instance-id: ${eureka.instance.hostname}:${server.port}\n        ## 心跳和续约\n        lease-expiration-duration-in-seconds: 60\n        lease-renewal-interval-in-seconds: 10\n    ```\n\n3. 部署脚本springcloud-gateway.yml\n    ```yaml\n    version: \"3.4\"\n\n    # gateway\n    services:\n      springncloud-gateway:\n        # 私服仓库拉取镜像，前提是集群内所有节点都需要先使用docker login登陆到私服\n        image: 私服仓库/项目/mall/springcloud-swarm-gateway:latest\n        ports:\n          - \"9082:9082\"\n        networks:\n          springcloud-overlay:\n            aliases:\n              - springncloud-gateway\n        ## 内部eureka instance_id 使用SERVICE_NAME变量，变量的值为 service的名称，docker集群内部使用dns\n        environment:\n          # 使用注册中心定义的别名为注册中心的host\n          - EUREKA_HOST=swarm-eureka\n          - EUREKA_PORT=8888\n          #  划重点：使用service name定义的名称作为instance_id，同集群网络内通过service name做dns相互调用\n          - INSTANCE_NAME=springncloud-gateway\n        # 该部分仅 stack deploy的时候有效\n        deploy:\n          replicas: 1\n          # 重启策略\n          restart_policy:\n            condition: on-failure\n          # 资源限制\n          resources:\n            limits:\n              cpus: '1'\n              memory: 1024M\n            reservations:\n              cpus: '0.2'\n              memory: 150M\n        volumes:\n          - /tmp:/tmp\n\n    # 需要先创建网络：docker network create --driver overlay springcloud-overlay\n    networks:\n      springcloud-overlay:\n        external: true\n    ```\n    执行``docker stack deploy -c springcloud-gateway.yml springcloud-gateway``\n\n4. provider和consumer的stack 部署脚本springcloud-service.yml\n    ```yaml\n    version: \"3.4\"\n\n    # springcloud service\n    services:\n      springcloud-consumer:\n        image: 私服仓库/项目/mall/springcloud-swarm-consumer:latest\n        ports:\n          - \"8087:8087\"\n        networks:\n          springcloud-overlay:\n            aliases:\n              - springcloud-consumer\n        ## 内部eureka instance_id 使用SERVICE_NAME变量，变量的值为 service的名称，docker集群内部使用dns\n        environment:\n          - EUREKA_HOST=swarm-eureka\n          - EUREKA_PORT=8888\n          - INSTANCE_NAME=springcloud-consumer\n        deploy:\n          replicas: 1\n          restart_policy:\n            condition: on-failure\n          resources:\n            limits:\n              cpus: '0.5'\n              memory: 512M\n            reservations:\n              cpus: '0.2'\n              memory: 200M\n        volumes:\n          - /tmp:/tmp\n\n      springcloud-privoder:\n        image: 私服仓库/项目/mall/springcloud-swarm-provider:latest\n        ports:\n          - \"8880:8880\"\n        networks:\n          springcloud-overlay:\n            aliases:\n              - springcloud-privoder\n        ## 内部eureka instance_id 使用SERVICE_NAME变量，变量的值为 service的名称，docker集群内部使用dns，\n        # eureka端口使用容器内的8888端口非开放的端口\n        environment:\n          - EUREKA_HOST=swarm-eureka\n          - EUREKA_PORT=8888\n          - INSTANCE_NAME=springcloud-privoder\n        deploy:\n          replicas: 1\n          restart_policy:\n            condition: on-failure\n          resources:\n            limits:\n              cpus: '1'\n              memory: 512M\n            reservations:\n              cpus: '0.2'\n              memory: 200M\n        volumes:\n          - /tmp:/tmp\n    networks:\n      springcloud-overlay:\n        external:\n          name: springcloud-overlay\n    ```\n    执行``docker stack deploy -c springcloud-service.yml springcloud-service``\n 5. 最终部署成功效果\n ![stack 查看部署结果](_v_images/20200529221222655_20777.png)\n![portainer查看部署情况](_v_images/20200529221255620_17137.png)\n6. 镜像制作\n   * dockerfile制作镜像脚本\n    ```html\n    #FROM java:8\n    # 根据容器限制自动计算堆的值,Fabric8社区提供的基础Docker镜像,用50％的可用内存作为上限\n    FROM fabric8/java-jboss-openjdk8-jdk\n\n    VOLUME /tmp\n\n    # 参数设置，通过pom打包设置或执行 docker build -t image-name:tag --build-arg JAR_FILE= 设置jar路径\n    ARG JAR_FILE\n    #ARG SERVER_PORT\n\n    ## 拷贝文件内容\n    ADD $JAR_FILE /mall-pms.jar\n    #RUN bash -c 'touch /mall-pms.jar'\n    #ENV TZ=Asia/Shanghai\n    #RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\n    ## 开放端口\n    #EXPOSE ${SERVER_PORT}\n\n    # 环境变量，可在stack中通过environment指令设置\n    ENV JVM_OPTS=\"-Xmx512m -Xms512m\"\n    ENV JVM_GC_INFO=\"-XX:+PrintFlagsFinal -XX:+PrintGCDetails\"\n    ENV JVM_UNLOCK=\"-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap\"\n\n    ## 容器启动后第一个命令\n    #ENTRYPOINT [\"java\",\"-Xmx512m -Xms512m\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/mall-pms.jar\"]\n    #ENTRYPOINT [ \"sh\", \"-c\", \"java -server $JVM_OPTS -Djava.security.egd=file:/dev/./urandom -jar /mall-pms.jar\" ]\n    CMD java -server $JVM_UNLOCK $JVM_OPTS -jar /mall-pms.jar\n\n    ```\n    * 使用maven构建打包镜像的pom.xml中容器相关配置，执行``mvn dockerfile:build``：\n    \n    ```html\n       <build>\n         <plugins>\n            <finalName>${project.artifactId}</finalName>\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>dockerfile-maven-plugin</artifactId>\n                <version>1.4.13</version>\n                <!-- 绑定maven阶段自动触发dockerfile build操作 -->\n                <!--        <executions>-->\n                <!--          <execution>-->\n                <!--            <id>default</id>-->\n                <!--            <phase>package</phase>-->\n                <!--            <goals>-->\n                <!--              <goal>build</goal>-->\n                <!--            </goals>-->\n                <!--          </execution>-->\n                <!--        </executions>-->\n                <configuration>\n                  <!-- 上下文配置，设置项目跟路径，读取Dockerfile -->\n                  <contextDirectory>${project.basedir}</contextDirectory>\n                  <!-- 使用setting配置账号密码 -->\n                  <useMavenSettingsForAuth>true</useMavenSettingsForAuth>\n                  <!--上传路径/镜像构建名： Harbor地址/Harbor项目名/springboot项目名-->\n                  <repository>私服镜像仓库/私服仓库项目/${project.artifactId}</repository>\n                  <!--指定tag -->\n                  <tag>镜像tag(latest)</tag>\n                  <buildArgs>\n                    <!--指定参数jar-->\n                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>\n                    <!-- <SERVER_PORT>8888</SERVER_PORT> -->\n                  </buildArgs>\n                </configuration>\n              </plugin>\n          </plugins>\n       </build>\n    ```"
  },
  {
    "path": "SpringCloud-Demo-Doc/gitlab/gitlab-ci.yml",
    "content": "variables:\r\n  SCRIPT_PATH: $CI_PROJECT_DIR/ci #环境变量，获取当前构建的项目路径\r\n  \r\nbefore_script:\r\n    - chmod -R 755 $SCRIPT_PATH  #给可执行权限(git-runner用户)\r\n    - dos2unix $SCRIPT_PATH/*    #转成unix格式\r\n\r\nsonar_preview:\r\n  stage: deploy\r\n  script:\r\n    #- chmod -R 755 $SCRIPT_PATH  #给脚本目录所有文件可执行权限\r\n    #- dos2unix $SCRIPT_PATH/*  #将所有.sh脚本 转成unix格式\r\n    - ci/sonar_preview.sh\r\n  except:\r\n    - master\r\n  tags:\r\n    - shared\r\n\r\nsonar_analyze:\r\n  stage: deploy\r\n  script:\r\n    - ci/sonar_analyze.sh\r\n  only:\r\n    - master\r\n  tags:\r\n    - shared\r\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/gitlab/sonar_analyze.sh",
    "content": "#!/bin/bash\r\n\r\nmvn --batch-mode sonar:sonar \\\r\n    -Dsonar.host.url=http://ip:9000/sonarqube \\\r\n    -Dsonar.login=admin \\\r\n    -Dsonar.password=admin \\\r\n    -Dsonar.issuesReport.html.enable=true \\\r\n    -Dsonar.analysis.mode=preview \\\r\n    -Dsonar.preview.excludePlugins=issueassign,scmstats\r\n\r\nif [ $? -eq 0 ]; then\r\n    echo \"sonarqube code-analyze over.\"\r\nfi\r\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/gitlab/sonar_preview.sh",
    "content": "#!/bin/bash\r\n\r\nmvn --batch-mode verify sonar:sonar \\\r\n    -Dsonar.host.url=http://ip:9000/sonarqube \\\r\n    -Dsonar.login=admin \\\r\n    -Dsonar.password=admin \\\r\n    -Dsonar.analysis.mode=preview \\\r\n    -Dsonar.gitlab.project_id=$CI_PROJECT_ID \\\r\n    -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \\\r\n    -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \\\r\n    -Dsonar.gitlab.url=http://39.108.36.134\r\n    -Dsonar.gitlab.user_token=9sxq9ZutmrQmf4EKV-wW\r\n\r\nif [ $? -eq 0 ]; then\r\n    echo \"sonarqube code-analyze-preview over.\"\r\nfi\r\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/CronJob.yaml",
    "content": "# 定时任务\n## 通用linux cron任务\n## 会先创建job，在创建Pod\n## 正常情况只会创建一个pod，但也可能是两个，需要保证幂等性(业务逻辑)\n## 如果未创建，需要保证下一次执行任务必须是上一次任务执行完后的(业务逻辑)\n\napiVersion: batch/v1beta1\nkind: CronJob\nmetadata:\n  name: cron-job\nspec:\n  schedule: \"0,15,30,45 * * * *\"  ## 定时任务表达式，参考linux cron\n  startingDeadlineSeconds: 15     #延迟15s开始运行()\n  jobTemplate:                      ## 任务模板\n    spec:\n      template:                      ## pod模板\n        metadata:\n          labels:\n            app: cron-job\n        spec:\n          restartPolicy: OnFailure   #重启策略\n          containers:\n            - name: main\n              image: luksa/batch-job  # 镜像"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/DaemonSet.yaml",
    "content": "# DaemonSet DS\n## RS 和RC都是用于K8S运行特定的POD数量，而 DS保证在每个节点上运行一个Pod，比如日志收集、监控、守护进程等\n\n## 创建DS：kubectl create -f DaemonSet.yaml\n## 查看DS：kubectl get ds\n\napiVersion: apps/v1beat2\nkind: DaemonSet\nmetadata:\n  name: service-monitor\nspec:\n  selector:\n    matchLabels:\n      app: monitor\n  template:\n    metadata:\n      labels:\n        app: app-monitor\n    sepc:\n      nodeSelector:   #模板包含一个节点选择器选择label包含app的标签节点\n        label: app\n      containers:\n        - name: main\n          image: luksa/app-monitor\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/Job.yaml",
    "content": "# Job\n## 容器启动内部进程成功结束后， 不再重启容器，即Pod处于已完成状态\n## 创建：kubectl create -f Job.yaml\n## 查询：kubectl get jobs\n## 命令更改parallelism属性：kubectl scale job batch-job --replicas 3\n\napiVersion: batch/v1  #batchApi组 v1版本\nkind: Job\nmetadata:\n  name: batch-job\nspec:\n  completions: 5  # 顺序运行5个pod，串行\n  parallelism: 2  # 并行，这里指定最多2个pod并行\n  activeDeadlineSeconds: 10 #限制pod时间\n  backoffLimit: 6 #失败重试次数，默认6次\n  template:    ##使用模板创建pod\n    metadata:\n      labels:\n        app: batch-job   #依据模板中的标签 app=batch-job来创建\n    spec:\n      restartPolicy: OnFailure  # 不能指定Always为默认重启策略(容器结束时K8S做什么，默认Always),Job不需要限期运行，可设置OnFailure/Never\n      containers:\n        - name: main\n          image: luksa/batch-job"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/Pod.yaml",
    "content": "## Pod定义\n# Pod 一组容器定义，K8S中的基本构建模块\n# 主要包括：\n## metadata(命名空间、名称、标签以及容器其他信息)\n## spec(容器实际说明，容器、卷、其他数据)\n## status 容器状态\n## kubectl create -f Pod.yml  创建一个pod\n## kubectl get po podName -o -yaml 获取pod yaml定义\n\n# 查看pod日志(pod被删后日志也会被删除)\n## kubectl logs podName (输出pod内多个容器日志合并信息)\n## kubectl logs podName -c containerName (输出pod内指定容器的日志信息)\n## kubectl port-forward podName 8081:8080 (转发本地端口8081到pod端口8080，一般仅做调试使用)\n\n# Pod标签，类似分类，后续很多操作都可以以标签来做相关操作(如：金丝雀发布)\n## 添加标签: kubectl label pod podName labelName=labelValue1\n## 显示所有Pod标签信息: kubectl get pods --show-labels\n## 将指定标签做列展示: kubectl get po -L app,env\n## 修改标签: kubectl label pod podName labelName=labelValue2 --overwrite(一定要覆盖，否则仅警告不会修改标签)\n## 列出标签env=prod的pod: kubectl get po -l env=prod\n## 列出包含env标签的所有pod: kubectl get po -l env\n## 列出不包含env标签的所有pod: kubectl get po -l '!env'\n## 删除Pod: kubectl delete po podName\n## 按标签删除Pod: kubectl delete po -l env=prod\n## 命名空间删除Pod: kubectl delete ns custom-manager\n\n# 命名空间-资源分组、多租户\n## 列出命名空间: kubectl get -ns\n## 列出指定命名空间的Pod: kubectl get po --n(namespace) name\n## 创建命名空间: kubectl create namespace custom-manager\n## 为Pod添加命名空间: kubectl create -f pod.yml -n custom-manager\n\n# 存活探针\n## 主要有三种： HTTP GET、TCP、Exec(命令)，主要用户RC资源来判断Pod是否存活\n## 一些其他属性： delay 延迟、timeout 超时时间、period 周期、failure 失败次数\n\napiVersion: v1  # k8s api版本\nkind: Pod   #资源类型为Pod\nmetadata:\n  name: kubia-name  # Pod名称\n  labels:   #添加两个标签\n    app: manual\n    env: prod\n  namespace: custom-manager #指定命名空间\nspec:\n  #nodeSelector:\n    #gpu: \"true\" # 节点选择器仅pod部署到包含gpu=true的节点上\n  containers:\n    - image: luksa/kubia  #镜像路径\n      name: kubia # 容器名称\n      ports:\n        - containerPort: 8080 # 容器指定开放端口\n          protocal: TCP #交互协议\n      livenessProbe:  #存活探针\n        httpGet:   # HTTP GET\n          path: /  # 请求路径，尽可能返回，类似health健康检查\n          port: 8080  # 端口\n        initialDelaySeconds: 15  # 启动延迟15S启用存活探针，防止RC已启动就检测pod存活而导致不断重启"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/ReplicaSet.yaml",
    "content": "# ReplicaSet(RS)\n## RS与RC功能类似，但比RC更强大，比如在标签控制方面(env=*)，RC也即将被遗弃，一般通常创建更高层及的Deployment资源时会自动创建RS\n## 创建 kubectl create -f ReplicaSet.yaml\n## 查看 kubectl get/describe rs\n\n\napiVersion: apps/v1bate2  # apps组v1bate2版本，RS不是api v1版本中的功能\nkind: ReplicaSet\nmetadata:\n  name: kubia\nspec:\n  replicas: 3\n  selector:\n    #matchLabels:  # 使用matchLabels 简单选择器\n      #app: kubia\n    matchExpressions:  ## 标表达式选择器 ,可以有多个表达式\n      - key: app  #要求该pod包含标签app，且标签的值必须是kubia\n        operator: In  #运算符：In NotIn Exists DoesNotExists\n        values:\n          - kubia\n  template:\n    metadata:\n      lables:\n        app: kubia  # 标签\n    spec:\n      containers:\n        - name: kubia\n          image: luksa/kubia #镜像\n          ports:\n            - containerPort: 8080\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/ReplicationController.yaml",
    "content": "# k8s RC(ReplicationController) example\n## RC 由三个关键部：Pod标签选择器、副本数量、Pod模板(Pod)\n## 创建RC：kubectl create -f ReplicationController.yml\n## 查看kubia RC的基本信息：kubectl describe rc kubia\n## 编辑RC配置：kubectl edit rc kubia\n## 扩容缩容：kubectl scale rc kubia --replicas=10  或者使用kubectl edit rc 来修改spec.replicas数量\n## 删除：kubectl delete rc kubia (--cascade==false 删除rc保留pod运行)\n\napiVersion: v1  #k8s api 版本\nkind: ReplicationController   #指定资源为 RC\nmetadata:\n  name: kubiaRC # RC资源名称\nspec:\n  replicas: 3  # pod实例数量,RC会始终保持该值指定的pod实例\n  selector:\n    app: kubia # RC的标签选择器，选择kubia标签的pod\n  template:  #pod模板定义\n    metadata:\n      labels:\n        app: kubia  #定义标签 app=kubia\n    spec:\n      containers:\n      - name: kubia  # pod名称\n        image: luksa/kubia  # 所需镜像\n        ports:  #对外部指定的端口\n          - containerPort: 8080"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/k8s-master-bootstrap.sh",
    "content": "#!/bin/bash\n\nCMD=$1\n\nshowHelp(){\n\techo \"start  ---- Start k8s cluster\"\n\techo \"stop   ---- Stop k8s cluster\"\n    echo \"status ---- Show k8s cluster status\"\n\texit 1\n}\n \nexecuteCommand(){\n\techo \"---------- $CMD etcd --------\"\n\tsystemctl $CMD etcd\n\techo \"---------- $CMD: docker --------\"\n\tsystemctl $CMD docker\n\techo \"---------- $CMD: kube-apiserver --------\"\n\tsystemctl $CMD kube-apiserver\n\techo \"---------- $CMD: kube-controller-manager --------\"\n\tsystemctl $CMD kube-controller-manager\n\techo \"---------- $CMD: kube-scheduler --------\"\n\tsystemctl $CMD kube-scheduler\n\techo \"---------- $CMD: kubelet--------\"\n\tsystemctl $CMD kubelet\n\techo \"---------- $CMD: kube-proxy--------\"\n\tsystemctl $CMD kube-proxy\n\texit 1\n}\n \nshowGift(){\n\techo \" ___                     ___              \n     /  /\\      ___          /  /\\             \n    /  /:/_    /  /\\        /  /:/_            \n   /  /:/ /\\  /  /:/       /  /:/ /\\           \n  /  /:/ /:/ /__/::\\      /  /:/ /::\\          \n /__/:/ /:/  \\__\\/\\:\\__  /__/:/ /:/\\:\\         \n \\  \\:\\/:/      \\  \\:\\/\\ \\  \\:\\/:/~/:/         \n  \\  \\::/        \\__\\::/  \\  \\::/ /:/          \n   \\  \\:\\        /__/:/    \\__\\/ /:/           \n    \\  \\:\\       \\__\\/       /__/:/            \n     \\__\\/                   \\__\\/  \"\n}\n\ncheckParams(){\n\tif [ -z $CMD ]\n\tthen\n\t\techo \"Exe command not null!\"\n\t\tshowHelp\n\t\texit 1\n\tfi\n\tif [ \"$CMD\" != \"start\" ] && [ \"$CMD\" != \"stop\" ] && [ \"$CMD\" != \"status\" ]\n\tthen\n\t\techo \"Not support command!\"\n\t\tshowHelp\n\t\texit 1\n\tfi\n}\n\ncheckParams\nshowGift\nexecuteCommand\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/k8s/k8s-node-bootstrap.sh",
    "content": "#!/bin/bash\n\nCMD=$1\n\nshowHelp(){\n\techo \"start  ---- Start k8s cluster node\"\n\techo \"stop   ---- Stop k8s cluster node\"\n    echo \"status ---- Show k8s cluster node status\"\n\texit 1\n}\n \nexecuteCommand(){\n\techo \"---------- $CMD: docker --------\"\n\tsystemctl $CMD docker\n\techo \"---------- $CMD: flanneld --------\"\n\tsystemctl $CMD flanneld\n\techo \"---------- $CMD: kubelet--------\"\n\tsystemctl $CMD kubelet\n\techo \"---------- $CMD: kube-proxy--------\"\n\tsystemctl $CMD kube-proxy\n\texit 1\n}\n \nshowGift(){\n\techo \" ___                     ___              \n     /  /\\      ___          /  /\\             \n    /  /:/_    /  /\\        /  /:/_            \n   /  /:/ /\\  /  /:/       /  /:/ /\\           \n  /  /:/ /:/ /__/::\\      /  /:/ /::\\          \n /__/:/ /:/  \\__\\/\\:\\__  /__/:/ /:/\\:\\         \n \\  \\:\\/:/      \\  \\:\\/\\ \\  \\:\\/:/~/:/         \n  \\  \\::/        \\__\\::/  \\  \\::/ /:/          \n   \\  \\:\\        /__/:/    \\__\\/ /:/           \n    \\  \\:\\       \\__\\/       /__/:/            \n     \\__\\/                   \\__\\/  \"\n}\n\ncheckParams(){\n\tif [ -z $CMD ]\n\tthen\n\t\techo \"Exe command not null!\"\n\t\tshowHelp\n\t\texit 1\n\tfi\n\tif [ \"$CMD\" != \"start\" ] && [ \"$CMD\" != \"stop\" ] && [ \"$CMD\" != \"status\" ]\n\tthen\n\t\techo \"Not support command!\"\n\t\tshowHelp\n\t\texit 1\n\tfi\n}\n\ncheckParams\nshowGift\nexecuteCommand\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/kafka+elk/ELK日志logstash解析JSON嵌套.md",
    "content": "1. logstash配置\n```\ninput {\n    kafka {\n        #kafka集群\n        bootstrap_servers => [\"ip1:port1,ip2:port2,ip3:port3\"]\n        # 5个线程消费\n        consumer_threads => 5\n        # 主题\n        topics => [\"omniLogstash\"]\n        group_id => \"omniLogstash\"\n        client_id => \"omniLogstash\"\n        # 每次从最后位置开始读取\n        auto_offset_reset => \"latest\"\n        decorate_events => true\n        type => \"bhy\"\n    }\n}\nfilter {\n    # 日志中不包含该条件的，不进行处理，直接删除（过滤一些不必要的日志）\n    if ([message] =~  \"^(?!.*?clsName).*$\") {\n        drop {}\n    }\n    # 第一层解析，需要保留message\n    json {\n      source => \"message\"\n      #remove_field => [\"message\"]\n    }\n    # 第二次嵌套解析，解析后删除message\n    json {\n      source => \"message\"\n      remove_field => [\"message\"]\n    }\n    # 删除多余字段\n    mutate {\n        remove_field => \"kafkaServer\"\n        remove_field => \"logger\"\n        remove_field => \"kafkaLogTopic\"\n        remove_field => \"level\"\n        remove_field => \"@version\"\n        remove_field => \"X-Span-Export\"\n        remove_field => \"X-B3-SpanId\"\n        remove_field => \"X-B3-ParentSpanId\"\n        remove_field => \"X-B3-TraceId\"\n        remove_field => \"levelVal\"\n    }\n}\noutput {\n    # 输出到es\n    elasticsearch {\n        hosts => [\"192.168.206.203:9200\"]\n        index => \"logstash-kafka-%{+YYYY-MM-dd}\"\n    }\n    # 控制台打印调试\n    stdout { codec => rubydebug }\n}\n```\n2. 日志格式对比<br>\n 解析前:<br>\n```\n{\n          \"type\" => \"bhy\",\n      \"@version\" => \"1\",\n       \"message\" => \"{\\\"@timestamp\\\":\\\"2018-09-27T10:41:55.575+08:00\\\",\\\"@version\\\":1,\\\"message\\\":\\\"{\\\\\\\"clientHost\\\\\\\":\\\\\\\"172.16.80.194\\\\\\\",\\\\\\\"clientIp\\\\\\\":\\\\\\\"172.16.80.194\\\\\\\",\\\\\\\"clientPort\\\\\\\":56722,\\\\\\\"clsName\\\\\\\":\\\\\\\"com.purcotton.omni.content.management.commdity.api.rest.MpcCommodityRestService\\\\\\\",\\\\\\\"costTime\\\\\\\":141,\\\\\\\"errorCode\\\\\\\":0,\\\\\\\"methodName\\\\\\\":\\\\\\\"queryMpCommodityDetail\\\\\\\",\\\\\\\"params\\\\\\\":[\\\\\\\"10000\\\\\\\",\\\\\\\"10000\\\\\\\"],\\\\\\\"requestTime\\\\\\\":1538016115418,\\\\\\\"requestUri\\\\\\\":\\\\\\\"/commodity/mp/detail\\\\\\\",\\\\\\\"responseTime\\\\\\\":1538016115562,\\\\\\\"result\\\\\\\":{\\\\\\\"brandId\\\\\\\":1,\\\\\\\"brandName\\\\\\\":\\\\\\\"\\\\u5168\\\\u68C9\\\\u65F6\\\\u4EE31\\\\\\\",\\\\\\\"brandNo\\\\\\\":\\\\\\\"10000\\\\\\\",\\\\\\\"categoryId\\\\\\\":12,\\\\\\\"categoryName\\\\\\\":\\\\\\\"\\\\u53E3\\\\u7EA2\\\\\\\",\\\\\\\"categoryNo\\\\\\\":\\\\\\\"100010202\\\\\\\",\\\\\\\"commodityNo\\\\\\\":\\\\\\\"10000\\\\\\\",\\\\\\\"commodityTitle\\\\\\\":\\\\\\\"\\\\u53E4\\\\u9F99\\\\u9999\\\\u6C34300ml\\\\\\\",\\\\\\\"freight\\\\\\\":0,\\\\\\\"goodsDtos\\\\\\\":[{\\\\\\\"goodsNo\\\\\\\":\\\\\\\"1000010\\\\\\\",\\\\\\\"specification\\\\\\\":\\\\\\\"500ml\\\\\\\"},{\\\\\\\"goodsNo\\\\\\\":\\\\\\\"1000011\\\\\\\",\\\\\\\"specification\\\\\\\":\\\\\\\"300ml\\\\\\\"}],\\\\\\\"goodsNo\\\\\\\":\\\\\\\"1000011\\\\\\\",\\\\\\\"haitao\\\\\\\":0,\\\\\\\"labels\\\\\\\":[{\\\\\\\"id\\\\\\\":1,\\\\\\\"labelColor\\\\\\\":\\\\\\\"#C0FF3E\\\\\\\",\\\\\\\"labelName\\\\\\\":\\\\\\\"\\\\u62A4\\\\u80A4\\\\\\\",\\\\\\\"labelNo\\\\\\\":\\\\\\\"100\\\\\\\",\\\\\\\"status\\\\\\\":1},{\\\\\\\"id\\\\\\\":2,\\\\\\\"labelColor\\\\\\\":\\\\\\\"#AB82FF\\\\\\\",\\\\\\\"labelName\\\\\\\":\\\\\\\"\\\\u4FDD\\\\u6E7F\\\\\\\",\\\\\\\"labelNo\\\\\\\":\\\\\\\"101\\\\\\\",\\\\\\\"status\\\\\\\":1},{\\\\\\\"id\\\\\\\":3,\\\\\\\"labelColor\\\\\\\":\\\\\\\"#8FBC8F\\\\\\\",\\\\\\\"labelName\\\\\\\":\\\\\\\"\\\\u5973\\\\u58EB\\\\\\\",\\\\\\\"labelNo\\\\\\\":\\\\\\\"102\\\\\\\",\\\\\\\"status\\\\\\\":1}],\\\\\\\"orgPrice\\\\\\\":88.05,\\\\\\\"salPrice\\\\\\\":59.99,\\\\\\\"salesPoint\\\\\\\":\\\\\\\"\\\\u70ED\\\\u5356\\\\u5546\\\\u54C1\\\\\\\",\\\\\\\"shopCode\\\\\\\":\\\\\\\"10000\\\\\\\",\\\\\\\"specification\\\\\\\":\\\\\\\"300ml\\\\\\\",\\\\\\\"taxation\\\\\\\":0.00,\\\\\\\"zPicUrl\\\\\\\":[\\\\\\\"http://omni-test.oss-cn-shenzhen.aliyuncs.com//omni/commdity/picture/commdity/SP5484/JL10001_z_01.jpg\\\\\\\",\\\\\\\"http://omni-test.oss-cn-shenzhen.aliyuncs.com//omni/commdity/picture/commdity/SP5484/JL10001_z_01.jpg\\\\\\\"]},\\\\\\\"serverHost\\\\\\\":\\\\\\\"1000-LLXIAO\\\\\\\",\\\\\\\"serverIp\\\\\\\":\\\\\\\"172.16.80.194\\\\\\\",\\\\\\\"serverPort\\\\\\\":7778,\\\\\\\"status\\\\\\\":0}\\\",\\\"logger\\\":\\\"com.purcotton.omni.common.aop.log.Slf4jLogService\\\",\\\"thread\\\":\\\"http-nio-7778-exec-1\\\",\\\"level\\\":\\\"INFO\\\",\\\"levelVal\\\":20000,\\\"springAppName\\\":\\\"content-management-service\\\",\\\"kafkaServer\\\":\\\"192.168.206.201:9092,192.168.206.202:9092,192.168.206.203:9092\\\",\\\"kafkaLogTopic\\\":\\\"omniLogstash\\\",\\\"X-Span-Export\\\":\\\"false\\\",\\\"X-B3-SpanId\\\":\\\"3997d1db9d4067cd\\\",\\\"X-B3-TraceId\\\":\\\"3997d1db9d4067cd\\\"}\",\n    \"@timestamp\" => 2018-09-27T02:41:55.737Z\n}\n\n```\n 解析后：<br>\n```\n{\n      \"X-B3-SpanId\" => \"e28a86370c36562b\",\n       \"requestUri\" => \"/commodity/mp/detail\",\n       \"serverHost\" => \"1000-LLXIAO\",\n         \"serverIp\" => \"172.16.80.194\",\n           \"logger\" => \"com.purcotton.omni.common.aop.log.Slf4jLogService\",\n            \"level\" => \"INFO\",\n          \"clsName\" => \"com.purcotton.omni.content.management.commdity.api.rest.MpcCommodityRestService\",\n     \"responseTime\" => 1538016255932,\n       \"serverPort\" => 7778,\n     \"X-B3-TraceId\" => \"e28a86370c36562b\",\n       \"clientHost\" => \"172.16.80.194\",\n      \"kafkaServer\" => \"192.168.206.201:9092,192.168.206.202:9092,192.168.206.203:9092\",\n      \"requestTime\" => 1538016255856,\n    \"kafkaLogTopic\" => \"omniLogstash\",\n           \"status\" => 0,\n        \"errorCode\" => 0,\n       \"methodName\" => \"queryMpCommodityDetail\",\n       \"@timestamp\" => 2018-09-27T02:44:15.933Z,\n           \"thread\" => \"http-nio-7778-exec-6\",\n         \"clientIp\" => \"172.16.80.194\",\n         \"@version\" => 1,\n             \"type\" => \"bhy\",\n       \"clientPort\" => 57050,\n    \"X-Span-Export\" => \"false\",\n           \"params\" => [\n        [0] \"10000\",\n        [1] \"10000\"\n    ],\n    \"springAppName\" => \"content-management-service\",\n         \"levelVal\" => 20000,\n         \"costTime\" => 76,\n           \"result\" => {\n             \"brandName\" => \"全棉时代1\",\n               \"goodsNo\" => \"1000011\",\n        \"commodityTitle\" => \"古龙香水300ml\",\n                \"haitao\" => 0,\n            \"salesPoint\" => \"热卖商品\",\n               \"brandId\" => 1,\n           \"commodityNo\" => \"10000\",\n              \"orgPrice\" => 88.05,\n          \"categoryName\" => \"口红\",\n              \"shopCode\" => \"10000\",\n         \"specification\" => \"300ml\",\n               \"brandNo\" => \"10000\",\n            \"categoryNo\" => \"100010202\",\n            \"categoryId\" => 12,\n               \"freight\" => 0,\n              \"salPrice\" => 59.99\n    }\n}\n```\n\n3. 遇到的坑：<br>\n太相信ToStringBuilder的 Json格式，导致多次配置json都解析失败，最终使用fast.JSON做日志打印<br>\n更多配置参考[common](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Common)和[elk](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Kafka-Elk)工程代码\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/kafka+elk/使用logback-kafka导致服务之间调用多1分钟之坑.md",
    "content": "1. 背景： <br>\n `使用logback+kafka+elk 进行日志监控`<br>\n2. 问题：<br>\n  `服务之间调用，始终发现有多1分钟的时间消耗，如：A调用B服务，需要消耗1分钟才返回给A`<br>\n3. 原因：<br>\n  `最终发现的是，logback写入kafka日志，而kafka的配置是单机且是个不可用的服务问题所导致`<br>\n4. 分析：<br>\n  `debug跟踪源码，发现即使kafka的服务配置是错误的，也依旧能创建成功cluster和producer，最终在producer进行send的时候触发\n  Metadata的更新，二者之间的version不一致，循环更新并调用Object.wait(timeout)方法阻塞直到超时`<br>\n  超时源码部分：org.apache.kafka.clients.Metadata.awaitUpdate<br>\n  ``` \n           long remainingWaitMs = maxWaitMs;\n           while (this.version <= lastVersion) {\n               if (remainingWaitMs != 0)\n                   wait(remainingWaitMs);\n               long elapsed = System.currentTimeMillis() - begin;\n               if (elapsed >= maxWaitMs)\n                   throw new TimeoutException(\"Failed to update metadata after \" + maxWaitMs + \" ms.\");\n               remainingWaitMs = maxWaitMs - elapsed;\n           }\n   ```\n   remainingWaitMs的超时间取的是默认的max.block.ms时间 60000ms<br>\n5. 建议解决方法： <br>\n >>*`5.1: 使用logbach的异步输出，防止kafka不可用时阻塞主线程日志(本案暂时采用)`<br>\n >>*`5.2: 缩短wait的超时时间，通过配置metadata.fetch.timeout.ms`<br>\n >>*`5.3: 保证kafka的高可用`<br>\n >>*`5.4: 更换方案，直接读取日志文件`<br>\n6. 疑惑：<br>\n   `其实很不明白，为啥我明明给的是一个不可用的broker地址，为啥还可以创建cluster和producer成功，猜测应该是保证高可用`<br>\n7. elk+kafka配置参考：[SpringCloud-Kafka-Elk项目配置](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Kafka-Elk)<br>\n8. [kafka的metadata更新策略](https://blog.csdn.net/chunlongyu/article/details/52622422)<br>\n   \n"
  },
  {
    "path": "SpringCloud-Demo-Doc/linux/Linux-netstat命令.md",
    "content": "**Linux之netstat命令**\n\n1. 需求：<br>\n   在停止Linux上一个进程之前，需要该进程无客户端连接，才能停止该服务<br>\n   比如：``kill -15 pid``，不过这个命令还是不保险<br>\n   最终还是选择用linux的netstat命令来实现该功能<br>\n2. netstat命令介绍：<br>\n   语法：<br>\n   ``netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]``<br>\n   参数说明：\n   ```$xslt\n    -a或--all 显示所有连线中的Socket。\n    -A<网络类型>或--<网络类型> 列出该网络类型连线中的相关地址。\n    -c或--continuous 持续列出网络状态。\n    -C或--cache 显示路由器配置的快取信息。\n    -e或--extend 显示网络其他相关信息。\n    -F或--fib 显示FIB。\n    -g或--groups 显示多重广播功能群组组员名单。\n    -h或--help 在线帮助。\n    -i或--interfaces 显示网络界面信息表单。\n    -l或--listening 显示监控中的服务器的Socket。\n    -M或--masquerade 显示伪装的网络连线。\n    -n或--numeric 直接使用IP地址，而不通过域名服务器。\n    -N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。\n    -o或--timers 显示计时器。\n    -p或--programs 显示正在使用Socket的程序识别码和程序名称。\n    -r或--route 显示Routing Table。\n    -s或--statistice 显示网络工作信息统计表。\n    -t或--tcp 显示TCP传输协议的连线状况。\n    -u或--udp 显示UDP传输协议的连线状况。\n    -v或--verbose 显示指令执行过程。\n    -V或--version 显示版本信息。\n    -w或--raw 显示RAW传输协议的连线状况。\n    -x或--unix 此参数的效果和指定\"-A unix\"参数相同。\n    --ip或--inet 此参数的效果和指定\"-A inet\"参数相同。\n    ```\n   参考[菜鸟教程](https://www.runoob.com/linux/linux-comm-netstat.html)<br>\n   在此处我们用到的命令：<br>\n   ``netstat -an | grep PORT``<br>\n   如下图所示，显示所有的socket连接以及连接的客户端信息：<br>\n   ![avatar](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/linux/img/netstat-np.png?raw=true)<br>\n   没有连接的情况：<br>\n   ![avatar](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/linux/img/netstat-np-no-client.png?raw=true)<br>\n3. 我们利用这个命令 结合 wc(root) 和 awk命令 获取到当前端口的客户端连接数，命令如下：<br>\n   ``netstat -an | grep 7778 |wc | awk '{print $1}'``<br>\n   无客户端连接情况：<br>\n   ![avatar](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/linux/img/netstat-awk-no-client.png?raw=true)<br>\n   有客户端连接情况：<br>\n   ![avatar](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/linux/img/netstat-awk.png?raw=true)<br>\n   借此我们可以拿到这个客户端连接数，来做**服务自动化发布时**的是否可以停止服务的条件\n   \n"
  },
  {
    "path": "SpringCloud-Demo-Doc/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n  <modelVersion>4.0.0</modelVersion>\r\n  <parent>\r\n    <groupId>com.xiao.skywalking.demo</groupId>\r\n    <artifactId>SpringCloud-Demo</artifactId>\r\n    <version>0.0.1-SNAPSHOT</version>\r\n  </parent>\r\n  <artifactId>SpringCloud-Demo-Doc</artifactId>\r\n  <packaging>pom</packaging>\r\n  <description>Demo相关学习资料文档</description>\r\n</project>"
  },
  {
    "path": "SpringCloud-Demo-Doc/rxjava/RxJavaHelloWorld.MD",
    "content": "**RxJava Hello World**<br>\n_一定要敲代码、一定要敲代码、一定要敲代码，才能深刻理解_\n1. pom引入：\n    ```$xslt\n        <dependencies>\n            <dependency>\n                <groupId>io.reactivex</groupId>\n                <artifactId>rxjava</artifactId>\n                <version>1.3.8</version>\n            </dependency>\n            <dependency>\n                <groupId>junit</groupId>\n                <artifactId>junit</artifactId>\n                <version>4.12</version>\n            </dependency>\n        </dependencies>\n    ```\n2. demo代码\n    ```$xslt\n    \n        /**\n         * rxJava hello world <br>\n         * 生产-消费(订阅) <br>\n         * Observable - Observer(Subscriber)  <br>\n         * event(事件)：<br>\n         * onNext() <br>\n         * onCompleted() 事件队列完结<br>\n         * onError() 事件队列异常<br>\n         */\n        @Test\n        public void helloWorld()\n        {\n            Observable<String> producer = Observable.create(new Observable.OnSubscribe<String>()\n            {\n                @Override\n                public void call(Subscriber<? super String> subscriber)\n                {\n                    subscriber.onNext(\"hello world!\");\n                    subscriber.onNext(\"apple!\");\n                    subscriber.onNext(\"orange!\");\n                    subscriber.onNext(\"exit\");\n                    subscriber.onCompleted();\n                }\n            });\n    \n            Subscriber<String> consumer = new Subscriber<String>()\n            {\n                @Override\n                public void onCompleted()\n                {\n                    System.out.println(\"发送完成!\");\n                }\n    \n                @Override\n                public void onError(Throwable e)\n                {\n                    System.out.println(\"接受消息错误：\" + e);\n                }\n    \n                @Override\n                public void onNext(String s)\n                {\n                    System.out.println(\"收到消息：\" + s);\n                }\n            };\n            producer.subscribe(consumer);\n        }\n    \n        /**\n         * rxJava from 操作符<br>\n         * 生产-消费(订阅)\n         */\n        @Test\n        public void from()\n        {\n            List<String> source = Arrays.asList(\"rxJava\", \"from\", \"exit\");\n            // 简写用action 代替 subscription\n            final Subscription subscribe = Observable.from(source).subscribe(new Action1<String>()\n            {\n                @Override\n                public void call(String s)\n                {\n                    System.out.println(\"From: - \" + s);\n                }\n            });\n        }\n    \n        /**\n         * [简要描述]:defer<br/>\n         * [详细描述]:只有当订阅者订阅才创建Observable<br/>\n         * 每个订阅创建一个新的Observable\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:02\n         **/\n        @Test\n        public void defer()\n        {\n            List<String> source = Arrays.asList(\"rxJava\", \"defer\", \"exit\");\n            final Observable<String> observable = Observable.defer(new Func0<Observable<String>>()\n            {\n                @Override\n                public Observable<String> call()\n                {\n                    System.out.println(\"新建一个Observale生产者\");\n                    return Observable.from(source);\n                }\n            });\n            observable.subscribe(new Action1<String>()\n            {\n                @Override\n                public void call(String s)\n                {\n                    System.out.println(\"Defer1: - \" + s);\n                }\n            });\n    \n            observable.subscribe(new Action1<String>()\n            {\n                @Override\n                public void call(String s)\n                {\n                    System.out.println(\"Defer2: - \" + s);\n                }\n            });\n        }\n    \n        /**\n         * [简要描述]:在执行onNext之前添加数据<br/>\n         * [详细描述]:<br/>\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:10\n         **/\n        @Test\n        public void startWith()\n        {\n            List<String> sources = Arrays.asList(\"rxJava\", \"startWith\", \"exit\");\n            Observable.from(sources).startWith(\"Hello\", \"World\").subscribe(new Action1<String>()\n            {\n                @Override\n                public void call(String s)\n                {\n                    System.out.println(\"Start with: - \" + s);\n                }\n            });\n        }\n    \n        /**\n         * [简要描述]:筛选数据<br/>\n         * [详细描述]:jdk 8 stream 里面的filter类似<br/>\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:15\n         **/\n        @Test\n        public void filter()\n        {\n            List<Integer> numbers = Arrays.asList(10, 2, 6, 3, 7, 5, 9, 8, 1);\n            Observable.from(numbers).filter(new Func1<Integer, Boolean>()\n            {\n                @Override\n                public Boolean call(Integer integer)\n                {\n                    return integer > 4;\n                }\n            }).subscribe(new Action1<Integer>()\n            {\n                @Override\n                public void call(Integer integer)\n                {\n                    System.out.println(\"Filter : \" + integer);\n                }\n            });\n        }\n    \n        /**\n         * [简要描述]:数据经过转换后发送给消费者<br/>\n         * [详细描述]:可以转换成一个Object对象<br/>\n         * 转成字符串输出\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:18\n         **/\n        @Test\n        public void map()\n        {\n            List<Integer> numbers = Arrays.asList(10, 2, 6, 3, 7, 5, 9, 8, 1);\n            Observable.from(numbers).map((Func1<Integer, Object>) integer -> \"[map:\" + integer + ']')\n                    .subscribe(o -> System.out.println(\"Map - > \" + o.toString()));\n        }\n    \n        /**\n         * [简要描述]:map是一个对象变成另外一个对象<br/>\n         * [详细描述]:一对多<br/>\n         * 如果 i*5,i*10,i*20\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:24\n         **/\n        @Test\n        public void flatMap()\n        {\n            List<Integer> numbers = Arrays.asList(10, 2, 6, 3, 7, 5, 9, 8, 1);\n            Observable.from(numbers).flatMap(new Func1<Integer, Observable<?>>()\n            {\n                @Override\n                public Observable<?> call(Integer integer)\n                {\n                    List<Integer> integers = Arrays.asList(integer, integer * 5, integer * 10, integer * 20);\n                    return Observable.from(integers);\n                }\n            }).subscribe(obj -> System.out.println(\"FlatMap: \" + obj.toString()));\n        }\n    \n        /**\n         * [简要描述]:接收上一次运算结果，参与下一次的计算，只输出最后一次计算结果<br/>\n         * [详细描述]:类似递归<br/>\n         * 如 1~9相乘= ?\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:32\n         **/\n        @Test\n        public void reduce()\n        {\n            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);\n            Observable.from(numbers).reduce(new Func2<Integer, Integer, Integer>()\n            {\n                @Override\n                public Integer call(Integer integer, Integer integer2)\n                {\n                    return integer * integer2;\n                }\n            }).subscribe(integer -> System.out.println(\"1-9相乘结果：\" + integer));\n        }\n    \n        /**\n         * [简要描述]:聚合函数，与reduce类似，只不过会输出每一次的计算结果<br/>\n         * [详细描述]:<br/>\n         * 如：1~9 相加 = ?\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:40\n         **/\n        @Test\n        public void scan()\n        {\n            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);\n            Observable.from(numbers).scan((integer, integer2) -> integer + integer2)\n                    .subscribe(integer -> System.out.println(\"Scan : \" + integer));\n        }\n    \n        /**\n         * [简要描述]:滑动窗口<br/>\n         * [详细描述]:<br/>\n         * 计算 两两数据之间的值，组合成一个新的数组<br>\n         * (1,2)(3,4)(5,6)(7,8)(9,10)->[3,7,11,15,19]<br>\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:46\n         **/\n        @Test\n        public void windowCount()\n        {\n            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n            // 取相邻的2个数计算，然后跳跃2个事件\n            Observable.from(numbers).window(2, 2).subscribe(new Action1<Observable<Integer>>()\n            {\n                @Override\n                public void call(Observable<Integer> integerObservable)\n                {\n                    integerObservable.reduce(new Func2<Integer, Integer, Integer>()\n                    {\n                        @Override\n                        public Integer call(Integer integer, Integer integer2)\n                        {\n                            return integer + integer2;\n                        }\n                    }).subscribe(integer -> System.out.println(\"Window ->\" + integer));\n                }\n            });\n        }\n    \n        /**\n         * [简要描述]:使用windows 一定时间内收集数据再发送出去<br/>\n         * [详细描述]:<br/>\n         * 如：将1S内收集到的数据发送出去，然后滑到第二个窗口\n         *\n         * @return void\n         * llxiao  2019/12/13 - 15:58\n         **/\n        @Test\n        public void windowTime() throws InterruptedException\n        {\n            CountDownLatch countDownLatch = new CountDownLatch(1);\n            Observable inputEventStream = Observable.create(subscriber -> subscriber.onNext(\"我是生产者..........\"));\n            // 每个1s中输出一次\n            inputEventStream.window(1000, TimeUnit.MILLISECONDS).subscribe(new Action1()\n            {\n                @Override\n                public void call(Object o)\n                {\n                    Calendar calendar = Calendar.getInstance();\n                    int i = calendar.get(Calendar.SECOND);\n                    System.out.println(i + \" -->执行\");\n                }\n            });\n    \n            //        inputEventStream.window(1000, TimeUnit.MILLISECONDS).subscribe(new Subscriber()\n            //        {\n            //            @Override\n            //            public void onCompleted()\n            //            {\n            //\n            //            }\n            //\n            //            @Override\n            //            public void onError(Throwable e)\n            //            {\n            //\n            //            }\n            //\n            //            @Override\n            //            public void onNext(Object o)\n            //            {\n            //                Calendar calendar = Calendar.getInstance();\n            //                int i = calendar.get(Calendar.SECOND);\n            //                System.out.println(i + \" -->执行\");\n            //            }\n            //        });\n            countDownLatch.await();\n        }\n    \n        /**\n         * [简要描述]:持续输入一组数字，按一定规则持续输出结果<br/>\n         * [详细描述]:滑动窗口的监控过程<br/>\n         * 按时间窗口移动输出相邻的两个数的值，以S为单位计数输出\n         *\n         * @return void\n         * llxiao  2019/12/13 - 16:27\n         **/\n        @Test\n        public void windowUltimateDemo() throws InterruptedException\n        {\n            // reduce 计算两个数字\n            Func2<Integer, Integer, Integer> publicSum = (integer, integer2) -> integer + integer2;\n    \n            // 第一次统计，结合window(2,1)将输入的数字按 1:2,3:3,6:4,10:5 规则计算\n            Func1<Observable<Integer>, Observable<Integer>> reduceFunc = integerObservable -> integerObservable\n                    .reduce(0, publicSum);\n    \n            // 第二次攻击，将1s内生成的数据进行递归结算，可使用scan函数观测每次叠加的数据\n            Func1<Observable<Integer>, Observable<Integer>> scanFunc = integerObservable -> integerObservable\n                    .reduce(0, publicSum);\n    \n            // 程序计数等待器，防止主线程完成\n            CountDownLatch countDownLatch = new CountDownLatch(1);\n    \n            // Subject可以实现一个消息向多个订阅者推送消息\n            // BehaviorSubject将数据流中的最新值推送给接受者,每次接受者只会接受最新最送的那个消息\n            // BehaviorSubject 跟 Subject 最大的不同就是 BehaviorSubject 是用来呈现当前的值，而不是单纯的发送事件。\n            // BehaviorSubject 会记住最新一次发送的元素，并把该元素当作目前的值，在使用上 BehaviorSubject 建构式需要传入一个参数来代表起始的状态\n            BehaviorSubject<Integer> behaviorSubject = BehaviorSubject.create();\n    \n            behaviorSubject\n                    // 1s作为一个基本块，进行横向滑动\n                    .window(1000, TimeUnit.MILLISECONDS)\n                    // 将flatMap汇总平铺成一个事件,然后累加成一个Observable<Integer>对象，比如说1s内有10个对象，被累加起来\n                    .flatMap(reduceFunc)\n                    //对这个对象2个发送，步长为1\n                    .window(2, 1)\n                    //对窗口里面的进行求和,用的scan, 每次累加都会打印出来\n                    .flatMap(scanFunc)\n                    .subscribe(integer -> System.out.println(Thread.currentThread().getName() + \"-每秒统计输出结果：-> \" + integer));\n    \n            for (int i = 0; i < 10000; i++)\n            {\n                behaviorSubject.onNext(i);\n                //200ms产生一个数据\n                Thread.sleep(200);\n            }\n            countDownLatch.await();\n        }\n    \n    ```\n 3. 参考文档<br>\n [Hystrix核心基础 - 滑动窗口创建过程及demo](https://www.cnblogs.com/itar/p/9013697.html)<br>\n [30 天精通 RxJS(23): Subject, BehaviorSubject, ReplaySubject, AsyncSubject](https://www.jianshu.com/p/982ea76a6bac)<br>"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/README.md",
    "content": "# spring cloud 源码原理学习，仅在此做收藏和整理成专栏\n# 各文章中带有原文链接\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/SpringCloud-FQA.md",
    "content": "1.If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active)启动异常\n``出现问题原因：\n``其实就是使用大量datasource但是又没有配置\n``解决方法：检查datasource的相关配置，如果没有用到datasource就不需要引用相关pom，如spring-boot-starter-jdbc\n\n``参考：https://blog.csdn.net/hengyunabc/article/details/78762097\n``本次遇到问题：远程配置中心异常，无法获取配置中心的配置文件导致无法获取datasource的配置项内容，实际项目用到mysql+mabytis，导致启动异常\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/Spring Cloud Config Client加载配置源码分析.md",
    "content": "**1 入口(位于spring-cloud-contenxt工程下)** <br>\n```org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize```  <br>\n1.1 该类图：<br>\n![PropertySourceBootstrapConfiguration类图](https://raw.githubusercontent.com/Xlinlin/spring-cloud-demo/master/SpringCloud-Demo-Doc/img/Spring-cloud/Config/PropertySourceBootstrapConfiguration.png)\nApplicationContextInitializer的子类，在spring boot 进行初始化的时候调用，将所有PropertySourceLocator类型的对象的locate方法都调用一遍，然后将各个渠道得到的属性值放到\ncomposite中利用insertPropertySources(propertySources, composite)设置到environment中。<br>\n1.2 代码片段\n```\n//关键看这个PropertySourceLocator\nprivate List<PropertySourceLocator> propertySourceLocators = new ArrayList<>();\n\n@Override\n\tpublic void initialize(ConfigurableApplicationContext applicationContext) {\n\t\tCompositePropertySource composite = new CompositePropertySource(\n\t\t\t\tBOOTSTRAP_PROPERTY_SOURCE_NAME);\n\t\tAnnotationAwareOrderComparator.sort(this.propertySourceLocators);\n\t\tboolean empty = true;\n\t\tConfigurableEnvironment environment = applicationContext.getEnvironment();\n\t\t//遍历所有PropertySourceLocator的实现\n\t\tfor (PropertySourceLocator locator : this.propertySourceLocators) {\n\t\t\tPropertySource<?> source = null;\n\t\t\t// **重点关注这个方法**\n\t\t\tsource = locator.locate(environment);\n\t\t\tif (source == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlogger.info(\"Located property source: \" + source);\n\t\t\tcomposite.addPropertySource(source);\n\t\t\tempty = false;\n\t\t}\n\t\tif (!empty) {\n\t\t\tMutablePropertySources propertySources = environment.getPropertySources();\n\t\t\tString logConfig = environment.resolvePlaceholders(\"${logging.config:}\");\n\t\t\tLogFile logFile = LogFile.get(environment);\n\t\t\tif (propertySources.contains(BOOTSTRAP_PROPERTY_SOURCE_NAME)) {\n\t\t\t\tpropertySources.remove(BOOTSTRAP_PROPERTY_SOURCE_NAME);\n\t\t\t}\n\t\t\tinsertPropertySources(propertySources, composite);\n\t\t\treinitializeLoggingSystem(environment, logConfig, logFile);\n\t\t\tsetLogLevels(applicationContext, environment);\n\t\t\thandleIncludedProfiles(environment);\n\t\t}\n\t}\n```\n1.3 <label style=\"color:red\">PropertySourceLocator接口的实现</label><br>\n![PropertySourceBootstrapConfiguration类图](https://raw.githubusercontent.com/Xlinlin/spring-cloud-demo/master/SpringCloud-Demo-Doc/img/Spring-cloud/Config/PropertySourceLocator-Impl.png)\n可以看到实现类有两个：config.client的实现和config.server的实现，本文仅关注client包下的实现<br>\n**2 org.springframework.cloud.config.client.ConfigServicePropertySourceLocator类** <br>\n2.1 ConfigServicePropertySourceLocator.locate()方法代码片段<br>\n```$xslt\n@Override\n\t@Retryable(interceptor = \"configServerRetryInterceptor\")\n\tpublic org.springframework.core.env.PropertySource<?> locate(\n\t\t\torg.springframework.core.env.Environment environment) {\n\t\t// copy一份ConfigClientProperties\n\t\tConfigClientProperties properties = this.defaultProperties.override(environment);\n\t\tCompositePropertySource composite = new CompositePropertySource(\"configService\");\n\t\t// 获取RestTemplate  getSecureRestTemplate方法获取\n\t\tRestTemplate restTemplate = this.restTemplate == null ? getSecureRestTemplate(properties)\n\t\t\t\t: this.restTemplate;\n\t\tException error = null;\n\t\tString errorBody = null;\n\t\tlogger.info(\"Fetching config from server at: \" + properties.getRawUri());\n\t\ttry {\n\t\t\tString[] labels = new String[] { \"\" };\n\t\t\tif (StringUtils.hasText(properties.getLabel())) {\n\t\t\t\tlabels = StringUtils.commaDelimitedListToStringArray(properties.getLabel());\n\t\t\t}\n\n\t\t\tString state = ConfigClientStateHolder.getState();\n\n\t\t\t// Try all the labels until one works\n\t\t\tfor (String label : labels) {\n\t\t\t    //restTemplate远程获取配置\n\t\t\t\tEnvironment result = getRemoteEnvironment(restTemplate,\n\t\t\t\t\t\tproperties, label.trim(), state);\n\t\t\t\tif (result != null) {\n\t\t\t\t\tlogger.info(String.format(\"Located environment: name=%s, profiles=%s, label=%s, version=%s, state=%s\",\n\t\t\t\t\t\t\tresult.getName(),\n\t\t\t\t\t\t\tresult.getProfiles() == null ? \"\" : Arrays.asList(result.getProfiles()),\n\t\t\t\t\t\t\tresult.getLabel(), result.getVersion(), result.getState()));\n                    // 将获取到的结果设置到spring的环境中\n\t\t\t\t\tif (result.getPropertySources() != null) { // result.getPropertySources() can be null if using xml\n\t\t\t\t\t\tfor (PropertySource source : result.getPropertySources()) {\n\t\t\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\t\t\tMap<String, Object> map = (Map<String, Object>) source\n\t\t\t\t\t\t\t\t\t.getSource();\n\t\t\t\t\t\t\tcomposite.addPropertySource(new MapPropertySource(source\n\t\t\t\t\t\t\t\t\t.getName(), map));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (StringUtils.hasText(result.getState()) || StringUtils.hasText(result.getVersion())) {\n\t\t\t\t\t\tHashMap<String, Object> map = new HashMap<>();\n\t\t\t\t\t\tputValue(map, \"config.client.state\", result.getState());\n\t\t\t\t\t\tputValue(map, \"config.client.version\", result.getVersion());\n\t\t\t\t\t\tcomposite.addFirstPropertySource(new MapPropertySource(\"configClient\", map));\n\t\t\t\t\t}\n\t\t\t\t\treturn composite;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (HttpServerErrorException e) {\n\t\t\terror = e;\n\t\t\tif (MediaType.APPLICATION_JSON.includes(e.getResponseHeaders()\n\t\t\t\t\t.getContentType())) {\n\t\t\t\terrorBody = e.getResponseBodyAsString();\n\t\t\t}\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\terror = e;\n\t\t}\n\t\tif (properties.isFailFast()) {\n\t\t\tthrow new IllegalStateException(\n\t\t\t\t\t\"Could not locate PropertySource and the fail fast property is set, failing\",\n\t\t\t\t\terror);\n\t\t}\n\t\tlogger.warn(\"Could not locate PropertySource: \"\n\t\t\t\t+ (errorBody == null ? error==null ? \"label not found\" : error.getMessage() : errorBody));\n\t\treturn null;\n\n\t}\n```\n2.2 RestTemplate获取，url、环境差异等配置从ConfigClientProperties中获取，而就是从spring上下文中获取对应的一些配置信息<br>\n```$xslt\n//这里，重点关注下这个ConfigClientProperties\nprivate RestTemplate getSecureRestTemplate(ConfigClientProperties client) {\n\t\tSimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();\n\t\trequestFactory.setReadTimeout((60 * 1000 * 3) + 5000); //TODO 3m5s, make configurable?\n\t\tRestTemplate template = new RestTemplate(requestFactory);\n\t\tString password = client.getPassword();\n\t\tString authorization = client.getAuthorization();\n\n\t\tif (password != null && authorization != null) {\n\t\t\tthrow new IllegalStateException(\n\t\t\t\t\t\"You must set either 'password' or 'authorization'\");\n\t\t}\n\n\t\tif (password != null) {\n\t\t\ttemplate.setInterceptors(Arrays.<ClientHttpRequestInterceptor> asList(\n\t\t\t\t\tnew BasicAuthorizationInterceptor(client.getUsername(), password)));\n\t\t}\n\t\telse if (authorization != null) {\n\t\t\ttemplate.setInterceptors(Arrays.<ClientHttpRequestInterceptor> asList(\n\t\t\t\t\tnew GenericAuthorization(authorization)));\n\t\t}\n\n\t\treturn template;\n\t}\n```\n2.3 远程请求获取配置文件<br>\n```\nprivate Environment getRemoteEnvironment(RestTemplate restTemplate, ConfigClientProperties properties,\n\t\t\t\t\t\t\t\t\t\t\t String label, String state) {\n\t\tString path = \"/{name}/{profile}\";\n\t\tString name = properties.getName();\n\t\tString profile = properties.getProfile();\n\t\tString token = properties.getToken();\n\t\tString uri = properties.getRawUri();\n\n\t\tObject[] args = new String[] { name, profile };\n\t\tif (StringUtils.hasText(label)) {\n\t\t\targs = new String[] { name, profile, label };\n\t\t\tpath = path + \"/{label}\";\n\t\t}\n\t\tResponseEntity<Environment> response = null;\n\n\t\ttry {\n\t\t\tHttpHeaders headers = new HttpHeaders();\n\t\t\tif (StringUtils.hasText(token)) {\n\t\t\t\theaders.add(TOKEN_HEADER, token);\n\t\t\t}\n\t\t\tif (StringUtils.hasText(state)) { //TODO: opt in to sending state?\n\t\t\t\theaders.add(STATE_HEADER, state);\n\t\t\t}\n\t\t\tfinal HttpEntity<Void> entity = new HttpEntity<>((Void) null, headers);\n\t\t\t// http get获取json结果转换成Environment类\n\t\t\tresponse = restTemplate.exchange(uri + path, HttpMethod.GET,\n\t\t\t\t\tentity, Environment.class, args);\n\t\t}\n\t\tcatch (HttpClientErrorException e) {\n\t\t\tif (e.getStatusCode() != HttpStatus.NOT_FOUND) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\tif (response == null || response.getStatusCode() != HttpStatus.OK) {\n\t\t\treturn null;\n\t\t}\n\t\tEnvironment result = response.getBody();\n\t\treturn result;\n\t}\n```\n**3 org.springframework.cloud.config.client.ConfigServiceBootstrapConfiguration** <br>\nSpring-cloud-config client 装载ConfigClientProperties、ConfigServicePropertySourceLocator到spring容器中。<br>\n``ConfigClientProperties用于ConfigServicePropertySourceLocator中``<br>\n``ConfigServicePropertySourceLocator用于PropertySourceBootstrapConfiguration中``<br>\n\n\n\n\n\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/Spring Cloud Config 是如何实现热更新的",
    "content": "[Spring Cloud 是如何实现热更新的](http://www.scienjus.com/spring-cloud-refresh/)\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/Spring Cloud Netflix Eureka多网卡环境下Eureka服务注册IP选择问题.md",
    "content": "#原文链接：https://blog.csdn.net/neosmith/article/details/53126924\n\n问题场景\n服务器上分别配置了eth0, eth1和eth2三块网卡，只有eth1的地址可供其它机器访问，eth0和eth2的 IP 无效。在这种情况下，服务注册时Eureka Client会自动选择eth0作为服务ip, 导致其它服务无法调用。\n\n问题原因\n由于官方并没有写明Eureka Client探测本机IP的逻辑，所以只能翻阅源代码。Eureka Client的源码在eureka-client模块下，com.netflix.appinfo包下的InstanceInfo类封装了本机信息，其中就包括了IP地址。在 Spring Cloud 环境下，Eureka Client并没有自己实现探测本机IP的逻辑，而是交给Spring的InetUtils工具类的findFirstNonLoopbackAddress()方法完成的：\n\npublic InetAddress findFirstNonLoopbackAddress() {\n        InetAddress result = null;\n        try {\n            // 记录网卡最小索引\n            int lowest = Integer.MAX_VALUE;\n            // 获取所有网卡\n            for (Enumeration<NetworkInterface> nics = NetworkInterface\n                    .getNetworkInterfaces(); nics.hasMoreElements();) {\n                NetworkInterface ifc = nics.nextElement();\n                if (ifc.isUp()) {\n                    log.trace(\"Testing interface: \" + ifc.getDisplayName());\n                    if (ifc.getIndex() < lowest || result == null) {\n                        lowest = ifc.getIndex(); // 记录索引\n                    }\n                    else if (result != null) {\n                        continue;\n                    }\n\n                    // @formatter:off\n                    if (!ignoreInterface(ifc.getDisplayName())) { // 是否是被忽略的网卡\n                        for (Enumeration<InetAddress> addrs = ifc\n                                .getInetAddresses(); addrs.hasMoreElements();) {\n                            InetAddress address = addrs.nextElement();\n                            if (address instanceof Inet4Address\n                                    && !address.isLoopbackAddress() \n                                    && !ignoreAddress(address)) { \n                                log.trace(\"Found non-loopback interface: \"\n                                        + ifc.getDisplayName());\n                                result = address;\n                            }\n                        }\n                    }\n                    // @formatter:on\n                }\n            }\n        }\n        catch (IOException ex) {\n            log.error(\"Cannot get first non-loopback address\", ex);\n        }\n\n        if (result != null) {\n            return result;\n        }\n\n        try {\n            return InetAddress.getLocalHost(); // 如果以上逻辑都没有找到合适的网卡，则使用JDK的InetAddress.getLocalhost()\n        }\n        catch (UnknownHostException e) {\n            log.warn(\"Unable to retrieve localhost\");\n        }\n\n        return null;\n    }\n通过源码可以看出，该工具类会获取所有网卡，依次进行遍历，取ip地址合理、索引值最小且不在忽略列表的网卡的ip地址作为结果。如果仍然没有找到合适的IP, 那么就将InetAddress.getLocalHost()做为最后的fallback方案。\n\n解决方案\n忽略指定网卡\n通过上面源码分析可以得知，spring cloud肯定能配置一个网卡忽略列表。通过查文档资料得知确实存在该属性：\n\nspring.cloud.inetutils.ignored-interfaces[0]=eth0 # 忽略eth0, 支持正则表达式\n因此，第一种方案就是通过配置application.properties让应用忽略无效的网卡。\n\n配置host\n当网查遍历逻辑都没有找到合适ip时会走JDK的InetAddress.getLocalHost()。该方法会返回当前主机的hostname, 然后会根据hostname解析出对应的ip。因此第二种方案就是配置本机的hostname和/etc/hosts文件，直接将本机的主机名映射到有效IP地址。\n\n手工指定IP(推荐)\n添加以下配置：\n\n指定此实例的ip\neureka.instance.ip-address=\n注册时使用ip而不是主机名\neureka.instance.prefer-ip-address=true"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/Spring Cloud Netflix Eureka源码导读与原理分析.md",
    "content": "# 原文链接：https://blog.csdn.net/neosmith/article/details/53131023\n\nSpring Cloud Netflix技术栈中，Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用，因此对Eureka还是有很大的必要进行深入研究。\n\n本文主要分为四部分，一是对项目构建的简要说明；二是对程序入口点的定位，帮助大家找到阅读源码的起点；三是对Eureka实现机制的分析；四是与使用Zookeeper相比Eureka作为注册服务的区别。\n\n1. 源码\n1.1 源码获取、构建\n我们需要分别下载 Eureka 官方源码和 Spring Cloud Netflix 适配 Eureka 的代码。可以在 https://github.com/Netflix/eureka 下载到原生 Eureka 代码，在 https://github.com/spring-cloud/spring-cloud-netflix/tree/v1.2.2.RELEASE 下载Spring Cloud针对于Eureka的Spring Cloud适配。\n\n在构建 Eureka 官方源码时一定要使用项目里自带的gradlew而不要自行下载gradle(首先要科学上网), 因为gradle早已更新到3.X版本，而Eureka用的是2.1.0版本构建的项目，新版本构建时会报错。Spring Cloud Netflix构建起来很简单，执行 mvn clean package，耐心等待即可。（我机器上是12分钟）\n\n1.2 程序构成\nEureka: \n1. 是纯正的 servlet 应用，需构建成war包部署 \n2. 使用了 Jersey 框架实现自身的 RESTful HTTP接口 \n3. peer之间的同步与服务的注册全部通过 HTTP 协议实现 \n4. 定时任务(发送心跳、定时清理过期服务、节点同步等)通过 JDK 自带的 Timer 实现 \n5. 内存缓存使用Google的guava包实现\n\n1.3 代码结构\n模块概览： \n这里写图片描述\n\neureka-core 模块包含了功能的核心实现: \n1. com.netflix.eureka.cluster - 与peer节点复制(replication)相关的功能 \n2. com.netflix.eureka.lease - 即”租约”, 用来控制注册信息的生命周期(添加、清除、续约) \n3. com.netflix.eureka.registry - 存储、查询服务注册信息 \n4. com.netflix.eureka.resources - RESTful风格中的”R”, 即资源。相当于SpringMVC中的Controller \n5. com.netflix.eureka.transport - 发送HTTP请求的客户端，如发送心跳 \n6. com.netflix.eureka.aws - 与amazon AWS服务相关的类\n\neureka-client模块: \nEureka客户端，微服务通过该客户端与Eureka进行通讯，屏蔽了通讯细节\n\neureka-server模块: \n包含了 servlet 应用的基本配置，如 web.xml。构建成功后在该模块下会生成可部署的war包。\n\n2. 代码入口\n2.1 作为纯Servlet应用的入口\n由于是Servlet应用，所以Eureka需要通过servlet的相关监听器 ServletContextListener 嵌入到 Servlet 的生命周期中。EurekaBootStrap 类实现了该接口，在servlet标准的contextInitialized()方法中完成了初始化工作：\n\n@Override\n    public void contextInitialized(ServletContextEvent event) {\n        try {\n            // 读取配置信息\n            initEurekaEnvironment(); \n            // 初始化Eureka Client(用来与其它节点进行同步)\n            // 初始化server\n            initEurekaServerContext(); \n\n            ServletContext sc = event.getServletContext();\n            sc.setAttribute(EurekaServerContext.class.getName(), serverContext);\n        } catch (Throwable e) {\n            logger.error(\"Cannot bootstrap eureka server :\", e);\n            throw new RuntimeException(\"Cannot bootstrap eureka server :\", e);\n        }\n    }\n2.2 与Spring Cloud结合的胶水代码\nEureka是一个纯正的Servlet应用，而Spring Boot使用的是嵌入式Tomcat, 因此就需要一定的胶水代码让Eureka跑在Embedded Tomcat中。这部分工作是在 EurekaServerBootstrap 中完成的。与上面提到的EurekaBootStrap相比，它的代码几乎是直接将原生代码copy过来的，虽然它并没有继承 ServletContextListener, 但是相应的生命周期方法都还在，然后添加了@Configuration注解使之能被Spring容器感知：\n\n这里写图片描述 \n原生的 EurekaBootStrap 类实现了标准的ServletContextListener接口\n\n这里写图片描述 \nSpring Cloud的EurekaServerBootstrap类没有实现servlet接口，但是保留了接口方法的完整实现\n\n我们可以推测，框架一定是在某处调用了这些方法，然后才是执行原生Eureka的启动逻辑。EurekaServerInitializerConfiguration类证实了我们的推测。该类实现了 ServletContextAware(拿到了tomcat的ServletContext对象)、SmartLifecycle(Spring容器初始化该bean时会调用相应生命周期方法)：\n\n@Configuration\n@CommonsLog\npublic class EurekaServerInitializerConfiguration\n        implements ServletContextAware, SmartLifecycle, Ordered {\n}\n1\n2\n3\n4\n5\n在 start() 方法中可以看到\n\neurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);\n1\n的调用，也就是说，在Spring容器初始化该组件时，Spring调用其生命周期方法start()从而触发了Eureka的启动。\n\n@Override\n    public void start() {\n        new Thread(new Runnable() {\n            @Override\n            public void run() {\n                try {\n                    eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext); // 调用 servlet 接口方法手工触发启动\n                    log.info(\"Started Eureka Server\");\n\n                    // ... ...\n                }\n                catch (Exception ex) {\n                    // Help!\n                    log.error(\"Could not initialize Eureka servlet context\", ex);\n                }\n            }\n        }).start();\n    }\n\n2.3 其它几个重要的代码入口\n了解以上入口信息后，我们就可以根据自己的需要自行研读相关的代码了。这里再提示几个代码入口： \n1. com.netflix.appinfo.InstanceInfo类封装了服务注册所需的全部信息 \n2. Eureka Client探测本机IP是通过org.springframework.cloud.commons.util.InetUtils工具类实现的 \n3. com.netflix.eureka.resources.ApplicationResource类相当于Spring MVC中的控制器，是服务的注册、查询功能的代码入口点\n\n3. 可能会被坑的几处原理\n3.1 Eureka的几处缓存\nEureka的wiki上有一句话，大意是一个服务启动后最长可能需要2分钟时间才能被其它服务感知到，但是文档并没有解释为什么会有这2分钟。其实这是由三处缓存 + 一处延迟造成的。\n\n首先，Eureka对HTTP响应做了缓存。在Eureka的”控制器”类ApplicationResource的109行可以看到有一行\n\nString payLoad = responseCache.get(cacheKey);\n1\n的调用，该代码所在的getApplication()方法的功能是响应客户端查询某个服务信息的HTTP请求：\n\nString payLoad = responseCache.get(cacheKey); // 从cache中拿响应数据\n\nif (payLoad != null) {\n       logger.debug(\"Found: {}\", appName);\n       return Response.ok(payLoad).build();\n} else {\n       logger.debug(\"Not Found: {}\", appName);\n       return Response.status(Status.NOT_FOUND).build();\n}\n\n上面的代码中，responseCache引用的是ResponseCache类型，该类型是一个接口，其get()方法首先会去缓存中查询数据，如果没有则生成数据返回（即真正去查询注册列表），且缓存的有效时间为30s。也就是说，客户端拿到Eureka的响应并不一定是即时的，大部分时候只是缓存信息。\n\n其次，Eureka Client对已经获取到的注册信息也做了30s缓存。即服务通过eureka客户端第一次查询到可用服务地址后会将结果缓存，下次再调用时就不会真正向Eureka发起HTTP请求了。\n\n**再次， 负载均衡组件Ribbon也有30s缓存。**Ribbon会从上面提到的Eureka Client获取服务列表，然后将结果缓存30s。\n\n最后，如果你并不是在Spring Cloud环境下使用这些组件(Eureka, Ribbon)，你的服务启动后并不会马上向Eureka注册，而是需要等到第一次发送心跳请求时才会注册。心跳请求的发送间隔也是30s。（Spring Cloud对此做了修改，服务启动后会马上注册）\n\n以上这四个30秒正是官方wiki上写服务注册最长需要2分钟的原因。\n\n3.2 服务注册信息不会被二次传播\n如果Eureka A的peer指向了B, B的peer指向了C，那么当服务向A注册时，B中会有该服务的注册信息，但是C中没有。也就是说，如果你希望只要向一台Eureka注册其它所有实例都能得到注册信息，那么就必须把其它所有节点都配置到当前Eureka的peer属性中。这一逻辑是在PeerAwareInstanceRegistryImpl#replicateToPeers()方法中实现的：\n\nprivate void replicateToPeers(Action action, String appName, String id,\n                                  InstanceInfo info /* optional */,\n                                  InstanceStatus newStatus /* optional */, boolean isReplication) {\n        Stopwatch tracer = action.getTimer().start();\n        try {\n            if (isReplication) {\n                numberOfReplicationsLastMin.increment();\n            }\n            // 如果这条注册信息是其它Eureka同步过的则不会再继续传播给自己的peer节点\n            if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {\n                return;\n            }\n\n            for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {\n                // 不要向自己发同步请求\n                if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {\n                    continue;\n                }\n                replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);\n            }\n        } finally {\n            tracer.stop();\n        }\n    }\n\n3.3 多网卡环境下的IP选择问题\n如果服务部署的机器上安装了多块网卡，它们分别对应IP地址A, B, C，此时： \nEureka会选择IP合法(标准ipv4地址)、索引值最小(eth0, eth1中eth0优先)且不在忽略列表中(可在application.properites中配置忽略哪些网卡)的网卡地址作为服务IP。 \n这个坑的详细分析见：http://blog.csdn.net/neosmith/article/details/53126924\n\n4. 作为服务注册中心，Eureka比Zookeeper好在哪里\n著名的CAP理论指出，一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的，因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。\n\n4.1 Zookeeper保证CP\n当向注册中心查询服务列表时，我们可以容忍注册中心返回的是几分钟以前的注册信息，但不能接受服务直接down掉不可用。也就是说，服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况，当master节点因为网络故障与其他节点失去联系时，剩余节点会重新进行leader选举。问题在于，选举leader的时间太长，30 ~ 120s, 且选举期间整个zk集群都是不可用的，这就导致在选举期间注册服务瘫痪。在云部署的环境下，因网络问题使得zk集群失去master节点是较大概率会发生的事，虽然服务能够最终恢复，但是漫长的选举时间导致的注册长期不可用是不能容忍的。\n\n4.2 Eureka保证AP\nEureka看明白了这一点，因此在设计时就优先保证可用性。Eureka各个节点都是平等的，几个节点挂掉不会影响正常节点的工作，剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败，则会自动切换至其它节点，只要有一台Eureka还在，就能保证注册服务可用(保证可用性)，只不过查到的信息可能不是最新的(不保证强一致性)。除此之外，Eureka还有一种自我保护机制，如果在15分钟内超过85%的节点都没有正常的心跳，那么Eureka就认为客户端与注册中心出现了网络故障，此时会出现以下几种情况： \n1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务 \n2. Eureka仍然能够接受新服务的注册和查询请求，但是不会被同步到其它节点上(即保证当前节点依然可用) \n3. 当网络稳定时，当前实例新的注册信息会被同步到其它节点中\n\n因此， Eureka可以很好的应对因网络故障导致部分节点失去联系的情况，而不会像zookeeper那样使整个注册服务瘫痪。\n\n5. 总结\nEureka作为单纯的服务注册中心来说要比zookeeper更加“专业”，因为注册服务更重要的是可用性，我们可以接受短期内达不到一致性的状况。不过Eureka目前1.X版本的实现是基于servlet的java web应用，它的极限性能肯定会受到影响。期待正在开发之中的2.X版本能够从servlet中独立出来成为单独可部署执行的服务。\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/eureka分区的深入讲解.md",
    "content": "```背景```\n用户量比较大或者用户地理位置分布范围很广的项目，一般都会有多个机房。这个时候如果上线springCloud服务的话，\n我们希望一个机房内的服务优先调用同一个机房内的服务，当同一个机房的服务不可用的时候，再去调用其它机房的服务，以达到减少延时的作用。\n\n[原文参考连接](https://segmentfault.com/a/1190000014107639)\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/spring-cloud/源码解析专栏/spring-cloud-feign源码深度解析.md",
    "content": "## 原文链接：https://segmentfault.com/a/1190000014981170\n\n\nFeign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插拔注释支持，包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持，并在Spring Web中使用默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。\n\n在介绍spring cloud feign之前，先来看看原生的feign，然后在看spring cloud feign是怎么样集成原生的feign的。\n\n一、原生的feign的用法\n\n1、引入jar\n\n<dependency>\n    <groupId>io.github.openfeign</groupId>\n    <artifactId>feign-gson</artifactId>\n    <version>9.5.0</version>\n</dependency>\n2、编写代码，以下是发送GET和POST请求方式(更多请查看)\n\npublic class FeignTest {\n    \n    interface BookService{\n        @RequestLine(\"GET /book/borrow?name={name}&timeout={timeout}\")\n        String borrow(@Param(\"name\")String name,@Param(\"timeout\")Integer timeout);\n        \n        @RequestLine(\"POST /book/post\")\n        @Headers(\"Content-Type: application/json\")\n        @Body(\"%7B\\\"id\\\": \\\"{id}\\\", \\\"name\\\": \\\"{name}\\\"%7D\")\n        String post(@Param(\"id\")String id,@Param(\"name\")String name);\n    }\n\n    public static void main(String[] args) {\n        BookService bs = Feign.builder()\n                .options(new Options(2000, 6000))\n                .target(BookService.class, \"http://localhost:2001\");\n        String result = bs.borrow(\"2w2w\",1);\n        System.out.println(result);\n        result = bs.post(\"12345\", \"spring feign\");\n        System.out.println(result);\n    }\n}\nfeign核心类介绍\n\nfeign.Feign.Builder 设置发送http请求的相关参数，比如http客户端，重试策略，编解码，超时时间等等\n\nfeign.Contract.Default 解析接口方法的元数据，构建http请求模板\nfeign.Client 发送http请求客户端，默认实现feign.Client.Default，使用的是java.net包实现的\nRetryer 重试，默认实现feign.Retryer.Default，超时延迟100ms开始重试，每隔1s重试一次，重试4次\nOptions 超时时间，默认连接超时10s，读超时60s\nfeign.codec.Encoder 编码器\nfeign.codec.Decoder 解码器\nRequestInterceptor 请求拦截器，可以在发送http请求之前执行此拦截器\nfeign.Contract 接口以及方法元数据解析器\n以上参数都可以自己扩展\nHardCodedTarget 定于目标接口和url\nReflectiveFeign 生成动态代理类，基于jdk的动态代理实现\nfeign.InvocationHandlerFactory.Default 接口方法统一拦截器创建工厂\nFeignInvocationHandler 接口统一方法拦截器\nParseHandlersByName 解析接口方法元数据\nSynchronousMethodHandler.Factory 接口方法的拦截器创建工厂\nSynchronousMethodHandler 接口方法的拦截器，真正拦截的核心，这里真正发起http请求，处理返回结果\n图片描述\n\n在上述示例代码中，到底feign给我做了哪些事情呢？下面的时序图为我们展示整个处理过程\n\n图片描述\n\n1、通过feign.Feign.Builder为我们设置http请求的相关参数，比如http客户端，重试策略，编解码，超时时间，这里都是面向接口编程实现的，我们很容易的进行扩展，比如http客户端，可以使用java原生的实现，也可以使用apache httpclient，亦可以使用okHttpClient，自己喜欢就好，其他属性亦是如此，由此看出feign的设计具有非常好的可扩展性。\n\n2、ReflectiveFeign内部使用了jdk的动态代理为目标接口生成了一个动态代理类，这里会生成一个InvocationHandler(jdk动态代理原理)统一的方法拦截器，同时为接口的每个方法生成一个SynchronousMethodHandler拦截器，并解析方法上的 元数据，生成一个http请求模板。\n\n3、当发起方法调用的时候，被统一的方法拦截器FeignInvocationHandler拦截，再根据不同的方法委托给不同的SynchronousMethodHandler拦截器处理。\n\n4、根据每次方法调用的入参生成http请求模板，如果设置了http请求拦截器，则先经历拦截器的处理，再发起真正的http请求，得到结果后会根据方法放入返回值进行反序列化，最后返回给调用方。\n\n5、如果发生了异常，会根据重试策略进行重试。\n\nfeign也整合了Hystrix，实现熔断降级的功能，其实也很简单，上面的分析我们知道了feign在方法调用的时候会经过统一方法拦截器FeignInvocationHandler的处理，而HystrixFeign则是使用了HystrixInvocationHandler代替，在方法调用的时候进行Hystrix的封装，这里需要特别说明下：\n\nHystrix有超时时间，feign本身也有超时时间，正常来说Hystrix的超时间要大于feign的超时时间，如果是小于的话，Hytrix已经超时了，feign再等待就已经没有意义了。\n再则就是feign超时的话会触发重试操作，此时要是Hytrix发生超时异常返回了，但这并不会切断feign的继续操作，什么意思呢？假设Hytrix的超时时间为1s，feign设置的超时时间为2s，而真正业务操作需要耗时3s，这时Hytrix超时异常返回，而后feign也会发生超时异常，但是feign会根据超时策略继续进行重试操作，并不会因为Hytrix的中断而中断。所以Hytrix的超时时间一般要大于feign的总超时时间，如这个例子中要设置2 5(默认重试次数4 + 1)=10s，公式就是Hytrix的超时间=feign的超时 时间 (feign的重试次数 + 1)\n以上就是原生feign的基本原理，下面我们来分析下springcloud是如何进行整合进来的，又添加了一些什么东西？\n\nspring-cloud-feign的基本用法：\n\n1、开启注解EnableFeignClients\n\n@EnableFeignClients\npublic class ApplicationStartup {\n    public static void main(String[] args) {\n        SpringApplication.run(ApplicationStartup.class, args);\n    } \n}\n2、定义接口\n\n@FeignClient(name = \"user\")\npublic interface IUserService{\n    @RequestMapping(value = \"/api/getUser\")\n    User getUser(Long id);\n}\n3、这样通过spring注入IUserService就可以使用了\n\n@Controller\npublic class UserController {\n    @Autowired\n    private IUserService userService;\n}\n使用起来非常简单，核心的两步就是开启注解，定于feignclient接口。\n\n一、开启@EnableFeignClients注解到底给我们做了什么事情呢？\n\n1、扫描EnableFeignClients注解上的配置信息，注册默认的配置类，这个配置类是对所有feignclient的都是生效的，即为全局的配置。\n\n2、扫描带有@FeignClient注解的接口，并注册配置类（此时的配置类针对当前feignclient生效）和FeignClientFactoryBean，此bean实现了FactoryBean接口，我们知道spring有两种类型的bean对象，一种是普通的bean，另一种则是工厂bean（FactoryBean），它返回的其实是getObject方法返回的对象（更多关于FactoryBean的相关信息请查看spring官方文档）。getObject方法就是集成原生feign的核心方法，当spring注入feignclient接口时，getObject方法会被调用，得到接口的代理类。\n\n备注：在FeignClient指定配置类时，切记不要被spring容器扫描到，不然会对全局生效。\n二、自动加载配置类FeignAutoConfiguration，FeignClientsConfiguration，FeignRibbonClientAutoConfiguration，这三个类为feign提供了所有的配置类，默认情况下所加载的类情况：\n\nfeign.Feign.Builder 当引入了Hytrix并开启参数feign.hystrix.enabled=true后，则会加载feign.hystrix.HystrixFeign.Builder，此时feign就具备降级熔断的功能了。\nfeign.Client 此实现类的加载分两种情况：\n\n使用url方式：feign.Client.Default，使用java原生的方式（java.net包）发起http请求，也可以自己扩展。\n使用name方式：LoadBalancerFeignClient，集成了ribbon，实现服务发现与负载均衡，但是真正发起http请求还是java原生的方式\n此处是一扩展点，当我们引入ApacheHttpClient时，http客户端就会使用apache的httpClient；当我们引入OkHttpClient时，http客户端就会使用okhttp3.OkHttpClient。\nfeign.Retryer 默认Retryer.NEVER_RETRY，不进行重试，这里也可以自己实现Retryer接口实现自己的重试策略，但是feign在集成了ribbon的情况下，最好保持默认不进行重试，因为ribbon也会有重试策略，如果feign也开启重试，容易产生混乱；其实在低版本中spring-cloud-feing重试默认并不是NEVER_RETRY，可能spring-cloud-feing也意识到这样做的问题，所以在D版中改成NEVER_RETRY了。\nfeign.Request.Options 默认设置连接超时时间是10，读超时时间是60s。这里也可以更改，分两种情况：\n\n使用url方式：必须通过这个参数来设置，才生效\n\n@Configuration\npublic class MyConfig {\n    @Bean\n    public Request.Options options(){\n        Request.Options o = new Options(1000, 1000);\n        return o;\n    }\n}\n然后在注解上@FeignClient指定：\n\n@FeignClient(name=\"\",url=\"\",configuration= {MyConfig.class})\n注意此类不能被spring容器扫描到，否则会对全局生效。你也可以通过注解@EnableFeignClients来全局指定：\n\n@EnableFeignClients(defaultConfiguration=MyConfig.class)\n使用name方式：此时已经集成了ribbon，可以使用以下配置来设置，如果你此时也配置了Options，以下配置会被覆盖\n\n# 对所有的feignclient生效\nribbon.ReadTimeout=10000\nribbon.ConnectTimeout=2000\n\n# 对指定的feignclien生效\n[feignclientName].ribbon.ReadTimeout=10000\n[feignclientName].ribbon.ConnectTimeout=2000\n如果开启Hytrix，hytrix也有超时时间设置，但是hytrix是封装在feign基础之上的，上文已有分析。\n\nhystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000\n你也可以关闭hytrix的超时时间\n\nhystrix.command.default.execution.timeout.enabled=false\nfeign.codec.Decoder 解码器，默认使用了HttpMessageConverters来实现\nfeign.codec.Encoder 编码器，默认使用了HttpMessageConverters来实现\nfeign.Contract 默认提供springmvc的注解解析，支持@RequestMapping，@RequestBody，@RequestParam，@PathVariable\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/sql/行政区域带经纬度.sql",
    "content": "DROP TABLE IF EXISTS  `t_sys_areas`;\nCREATE TABLE `t_sys_areas` (\n  `id` bigint(16) NOT NULL AUTO_INCREMENT COMMENT 'id主键',\n  `code` varchar(20) NOT NULL DEFAULT '' COMMENT '行政区划编码',\n  `parent_code` varchar(20) DEFAULT NULL COMMENT '父级行政区划编码',\n  `short_code` varchar(20) DEFAULT NULL,\n  `parent_short_code` varchar(20) DEFAULT NULL,\n  `name` varchar(128) DEFAULT NULL COMMENT '名称',\n  `province1` varchar(64) DEFAULT NULL COMMENT '省',\n  `city1` varchar(64) DEFAULT NULL COMMENT '市',\n  `district1` varchar(64) DEFAULT NULL COMMENT '县/区',\n  `grade` char(1) DEFAULT NULL COMMENT '等级 省1 市2 县3',\n  `province` varchar(64) DEFAULT NULL COMMENT '省',\n  `city` varchar(64) DEFAULT NULL COMMENT '市',\n  `district` varchar(64) DEFAULT NULL COMMENT '县/区',\n  `full_name` varchar(256) DEFAULT NULL COMMENT '行政区划全称',\n  `update_time` datetime(3) DEFAULT NULL COMMENT '更新时间',\n  `opertor_user` varchar(45) DEFAULT NULL COMMENT '操作用户',\n  `lat` decimal(10,7) DEFAULT NULL COMMENT '维度',\n  `lon` decimal(10,7) DEFAULT NULL COMMENT '经度',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=719688 DEFAULT CHARSET=utf8mb4 COMMENT='全国行政区划-省市县三级(2018最新版)';\n--  -- areas data\ninsert into `t_sys_areas`(`id`,`code`,`parent_code`,`short_code`,`parent_short_code`,`name`,`province1`,`city1`,`district1`,`grade`,`province`,`city`,`district`,`full_name`,`update_time`,`opertor_user`,`lat`,`lon`) values\n(1,'110000000000','0','11','0','北京市','北京市','','','1','北京市','','','北京市','2019-05-21 11:36:30','admin',40.2207700,116.2312800),\n(2,'110100000000','110000000000','1101','11','市辖区','','市辖区','','2','北京市','市辖区','','北京市市辖区','2019-01-02 09:32:17','admin',40.2207700,116.2312800),\n(3,'110101000000','110100000000','110101','1101','东城区','','','东城区','3','北京市','市辖区','东城区','北京市市辖区东城区','2018-10-15 19:33:24','admin',39.9285500,116.4163700),\n(203,'110102000000','110100000000','110102','1101','西城区','','','西城区','3','北京市','市辖区','西城区','北京市市辖区西城区',null,null,39.9123100,116.3661100),\n(480,'110105000000','110100000000','110105','1101','朝阳区','','','朝阳区','3','北京市','市辖区','朝阳区','北京市市辖区朝阳区',null,null,39.9219000,116.4435500),\n(1135,'110106000000','110100000000','110106','1101','丰台区','','','丰台区','3','北京市','市辖区','丰台区','北京市市辖区丰台区',null,null,39.8585600,116.2861600),\n(1546,'110107000000','110100000000','110107','1101','石景山区','','','石景山区','3','北京市','市辖区','石景山区','北京市市辖区石景山区',null,null,39.9056900,116.2229900),\n(1707,'110108000000','110100000000','110108','1101','海淀区','','','海淀区','3','北京市','市辖区','海淀区','北京市市辖区海淀区',null,null,39.9593300,116.2984500),\n(2398,'110109000000','110100000000','110109','1101','门头沟区','','','门头沟区','3','北京市','市辖区','门头沟区','北京市市辖区门头沟区',null,null,39.9404800,116.1014600),\n(2720,'110111000000','110100000000','110111','1101','房山区','','','房山区','3','北京市','市辖区','房山区','北京市市辖区房山区',null,null,39.7478800,116.1429400),\n(3364,'110112000000','110100000000','110112','1101','通州区','','','通州区','3','北京市','市辖区','通州区','北京市市辖区通州区',null,null,39.9099800,116.6571400),\n(3968,'110113000000','110100000000','110113','1101','顺义区','','','顺义区','3','北京市','市辖区','顺义区','北京市市辖区顺义区',null,null,40.1301200,116.6547700),\n(4547,'110114000000','110100000000','110114','1101','昌平区','','','昌平区','3','北京市','市辖区','昌平区','北京市市辖区昌平区',null,null,40.2207700,116.2312800),\n(5106,'110115000000','110100000000','110115','1101','大兴区','','','大兴区','3','北京市','市辖区','大兴区','北京市市辖区大兴区',null,null,39.7268400,116.3415900),\n(5883,'110116000000','110100000000','110116','1101','怀柔区','','','怀柔区','3','北京市','市辖区','怀柔区','北京市市辖区怀柔区',null,null,40.3160000,116.6317700),\n(6221,'110117000000','110100000000','110117','1101','平谷区','','','平谷区','3','北京市','市辖区','平谷区','北京市市辖区平谷区',null,null,40.1406200,117.1214100),\n(6552,'110118000000','110100000000','110118','1101','密云区','','','密云区','3','北京市','市辖区','密云区','北京市市辖区密云区',null,null,40.3762500,116.8431700),\n(7007,'110119000000','110100000000','110119','1101','延庆区','','','延庆区','3','北京市','市辖区','延庆区','北京市市辖区延庆区',null,null,40.4567800,115.9750300),\n(7448,'120000000000','0','12','0','天津市','天津市','','','1','天津市','','','天津市','2018-09-21 17:04:34','1810',39.7175500,117.3098300),\n(7449,'120100000000','120000000000','1201','12','市辖区','','市辖区','','2','天津市','市辖区','','天津市市辖区',null,null,39.7175500,117.3098300),\n(7450,'120101000000','120100000000','120101','1201','和平区','','','和平区','3','天津市','市辖区','和平区','天津市市辖区和平区',null,null,39.1171200,117.2147000),\n(7520,'120102000000','120100000000','120102','1201','河东区','','','河东区','3','天津市','市辖区','河东区','天津市市辖区河东区',null,null,39.1282700,117.2522800),\n(7697,'120103000000','120100000000','120103','1201','河西区','','','河西区','3','天津市','市辖区','河西区','天津市市辖区河西区',null,null,39.1095400,117.2233600),\n(7853,'120104000000','120100000000','120104','1201','南开区','','','南开区','3','天津市','市辖区','南开区','天津市市辖区南开区',null,null,39.1381500,117.1501100),\n(8045,'120105000000','120100000000','120105','1201','河北区','','','河北区','3','天津市','市辖区','河北区','天津市市辖区河北区',null,null,39.1478400,117.1967400),\n(8170,'120106000000','120100000000','120106','1201','红桥区','','','红桥区','3','天津市','市辖区','红桥区','天津市市辖区红桥区',null,null,39.1673400,117.1516100),\n(8381,'120110000000','120100000000','120110','1201','东丽区','','','东丽区','3','天津市','市辖区','东丽区','天津市市辖区东丽区',null,null,39.0865200,117.3142800),\n(8651,'120111000000','120100000000','120111','1201','西青区','','','西青区','3','天津市','市辖区','西青区','天津市市辖区西青区',null,null,39.1411100,117.0073900),\n(8932,'120112000000','120100000000','120112','1201','津南区','','','津南区','3','天津市','市辖区','津南区','天津市市辖区津南区',null,null,38.9375000,117.3571000),\n(9210,'120113000000','120100000000','120113','1201','北辰区','','','北辰区','3','天津市','市辖区','北辰区','天津市市辖区北辰区',null,null,39.2239300,117.1354400),\n(9488,'120114000000','120100000000','120114','1201','武清区','','','武清区','3','天津市','市辖区','武清区','天津市市辖区武清区',null,null,39.3832600,117.0441200),\n(10255,'120115000000','120100000000','120115','1201','宝坻区','','','宝坻区','3','天津市','市辖区','宝坻区','天津市市辖区宝坻区',null,null,39.7175500,117.3098300),\n(11095,'120116000000','120100000000','120116','1201','滨海新区','','','滨海新区','3','天津市','市辖区','滨海新区','天津市市辖区滨海新区',null,null,39.0032000,117.7107100),\n(11585,'120117000000','120100000000','120117','1201','宁河区','','','宁河区','3','天津市','市辖区','宁河区','天津市市辖区宁河区',null,null,39.3309100,117.8247800),\n(11928,'120118000000','120100000000','120118','1201','静海区','','','静海区','3','天津市','市辖区','静海区','天津市市辖区静海区',null,null,38.9473700,116.9742800),\n(12384,'120119000000','120100000000','120119','1201','蓟州区','','','蓟州区','3','天津市','市辖区','蓟州区','天津市市辖区蓟州区',null,null,40.0457700,117.4082900),\n(13400,'130000000000','0','13','0','河北省','河北省','','','1','河北省','','','河北省','2018-09-21 17:04:37','1810',null,null),\n(13401,'130100000000','130000000000','1301','13','石家庄市','','石家庄市','','2','河北省','石家庄市','','河北省石家庄市',null,null,38.0364700,114.5395200),\n(13402,'130101000000','130100000000','130101','1301','市辖区','','','市辖区','3','河北省','石家庄市','市辖区','河北省石家庄市市辖区',null,null,38.0364700,114.5395200),\n(13403,'130102000000','130100000000','130102','1301','长安区','','','长安区','3','河北省','石家庄市','长安区','河北省石家庄市长安区',null,null,38.0364700,114.5395200),\n(13577,'130104000000','130100000000','130104','1301','桥西区','','','桥西区','3','河北省','石家庄市','桥西区','河北省石家庄市桥西区',null,null,38.0040700,114.4610400),\n(13736,'130105000000','130100000000','130105','1301','新华区','','','新华区','3','河北省','石家庄市','新华区','河北省石家庄市新华区',null,null,38.0509000,114.4631200),\n(13863,'130107000000','130100000000','130107','1301','井陉矿区','','','井陉矿区','3','河北省','石家庄市','井陉矿区','河北省石家庄市井陉矿区',null,null,38.0649900,114.0623000),\n(13923,'130108000000','130100000000','130108','1301','裕华区','','','裕华区','3','河北省','石家庄市','裕华区','河北省石家庄市裕华区',null,null,38.0061000,114.5312200),\n(14035,'130109000000','130100000000','130109','1301','藁城区','','','藁城区','3','河北省','石家庄市','藁城区','河北省石家庄市藁城区',null,null,38.0216600,114.8467600),\n(14288,'130110000000','130100000000','130110','1301','鹿泉区','','','鹿泉区','3','河北省','石家庄市','鹿泉区','河北省石家庄市鹿泉区',null,null,38.0858700,114.3134400),\n(14523,'130111000000','130100000000','130111','1301','栾城区','','','栾城区','3','河北省','石家庄市','栾城区','河北省石家庄市栾城区',null,null,37.9002500,114.6483900),\n(14708,'130121000000','130100000000','130121','1301','井陉县','','','井陉县','3','河北省','石家庄市','井陉县','河北省石家庄市井陉县',null,null,38.0322500,114.1453200),\n(15048,'130123000000','130100000000','130123','1301','正定县','','','正定县','3','河北省','石家庄市','正定县','河北省石家庄市正定县',null,null,38.1461800,114.5709600),\n(15246,'130125000000','130100000000','130125','1301','行唐县','','','行唐县','3','河北省','石家庄市','行唐县','河北省石家庄市行唐县',null,null,38.4384800,114.5529400),\n(15593,'130126000000','130100000000','130126','1301','灵寿县','','','灵寿县','3','河北省','石家庄市','灵寿县','河北省石家庄市灵寿县',null,null,38.3086400,114.3826500),\n(15893,'130127000000','130100000000','130127','1301','高邑县','','','高邑县','3','河北省','石家庄市','高邑县','河北省石家庄市高邑县',null,null,37.6149300,114.6114800),\n(16006,'130128000000','130100000000','130128','1301','深泽县','','','深泽县','3','河北省','石家庄市','深泽县','河北省石家庄市深泽县',null,null,38.1841700,115.2009400),\n(16139,'130129000000','130100000000','130129','1301','赞皇县','','','赞皇县','3','河北省','石家庄市','赞皇县','河北省石家庄市赞皇县',null,null,37.6657900,114.3859200),\n(16364,'130130000000','130100000000','130130','1301','无极县','','','无极县','3','河北省','石家庄市','无极县','河北省石家庄市无极县',null,null,38.1791500,114.9763800),\n(16593,'130131000000','130100000000','130131','1301','平山县','','','平山县','3','河北省','石家庄市','平山县','河北省石家庄市平山县',null,null,38.2599800,114.1860500),\n(17334,'130132000000','130100000000','130132','1301','元氏县','','','元氏县','3','河北省','石家庄市','元氏县','河北省石家庄市元氏县',null,null,37.7664600,114.5254700),\n(17563,'130133000000','130100000000','130133','1301','赵县','','','赵县','3','河北省','石家庄市','赵县','河北省石家庄市赵县',null,null,37.7563100,114.7761600),\n(17856,'130171000000','130100000000','130171','1301','石家庄高新技术产业开发区','','','石家庄高新技术产业开发区','3','河北省','石家庄市','石家庄高新技术产业开发区','河北省石家庄市石家庄高新技术产业开发区',null,null,38.0424230,114.6481700),\n(17901,'130172000000','130100000000','130172','1301','石家庄循环化工园区','','','石家庄循环化工园区','3','河北省','石家庄市','石家庄循环化工园区','河北省石家庄市石家庄循环化工园区',null,null,37.9967380,114.6934510),\n(17916,'130181000000','130100000000','130181','1301','辛集市','','','辛集市','3','河北省','石家庄市','辛集市','河北省石家庄市辛集市',null,null,37.9431600,115.2179200),\n(18292,'130183000000','130100000000','130183','1301','晋州市','','','晋州市','3','河北省','石家庄市','晋州市','河北省石家庄市晋州市',null,null,38.0335600,115.0441000),\n(18527,'130184000000','130100000000','130184','1301','新乐市','','','新乐市','3','河北省','石家庄市','新乐市','河北省石家庄市新乐市',null,null,38.3433800,114.6838400),\n(18710,'130200000000','130000000000','1302','13','唐山市','','唐山市','','2','河北省','唐山市','','河北省唐山市',null,null,39.2731300,118.4602300),\n(18711,'130201000000','130200000000','130201','1302','市辖区','','','市辖区','3','河北省','唐山市','市辖区','河北省唐山市市辖区',null,null,39.2731300,118.4602300),\n(18712,'130202000000','130200000000','130202','1302','路南区','','','路南区','3','河北省','唐山市','路南区','河北省唐山市路南区',null,null,39.6252700,118.1547400),\n(18882,'130203000000','130200000000','130203','1302','路北区','','','路北区','3','河北省','唐山市','路北区','河北省唐山市路北区',null,null,39.6242900,118.2012700),\n(19135,'130204000000','130200000000','130204','1302','古冶区','','','古冶区','3','河北省','唐山市','古冶区','河北省唐山市古冶区',null,null,39.7161200,118.4588500),\n(19347,'130205000000','130200000000','130205','1302','开平区','','','开平区','3','河北省','唐山市','开平区','河北省唐山市开平区',null,null,39.6713200,118.2617400),\n(19534,'130207000000','130200000000','130207','1302','丰南区','','','丰南区','3','河北省','唐山市','丰南区','河北省唐山市丰南区',null,null,39.5748700,118.0850500),\n(20035,'130208000000','130200000000','130208','1302','丰润区','','','丰润区','3','河北省','唐山市','丰润区','河北省唐山市丰润区',null,null,39.8326900,118.1620600),\n(20586,'130209000000','130200000000','130209','1302','曹妃甸区','','','曹妃甸区','3','河北省','唐山市','曹妃甸区','河北省唐山市曹妃甸区',null,null,39.2731300,118.4602300),\n(20751,'130223000000','130200000000','130223','1302','滦县','','','滦县','3','河北省','唐山市','滦县','河北省唐山市滦县',null,null,39.7405800,118.7035100),\n(21295,'130224000000','130200000000','130224','1302','滦南县','','','滦南县','3','河北省','唐山市','滦南县','河北省唐山市滦南县',null,null,39.5039400,118.6741400),\n(21920,'130225000000','130200000000','130225','1302','乐亭县','','','乐亭县','3','河北省','唐山市','乐亭县','河北省唐山市乐亭县',null,null,39.4256400,118.9125200),\n(22424,'130227000000','130200000000','130227','1302','迁西县','','','迁西县','3','河北省','唐山市','迁西县','河北省唐山市迁西县',null,null,40.1415300,118.3146000),\n(22872,'130229000000','130200000000','130229','1302','玉田县','','','玉田县','3','河北省','唐山市','玉田县','河北省唐山市玉田县',null,null,39.9005000,117.7388100),\n(23667,'130271000000','130200000000','130271','1302','唐山市芦台经济技术开发区','','','唐山市芦台经济技术开发区','3','河北省','唐山市','唐山市芦台经济技术开发区','河北省唐山市唐山市芦台经济技术开发区',null,null,39.8062200,118.1448700),\n(23701,'130272000000','130200000000','130272','1302','唐山市汉沽管理区','','','唐山市汉沽管理区','3','河北省','唐山市','唐山市汉沽管理区','河北省唐山市唐山市汉沽管理区',null,null,39.3868640,117.9254760),\n(23741,'130273000000','130200000000','130273','1302','唐山高新技术产业开发区','','','唐山高新技术产业开发区','3','河北省','唐山市','唐山高新技术产业开发区','河北省唐山市唐山高新技术产业开发区',null,null,39.6760250,118.1777340),\n(23813,'130274000000','130200000000','130274','1302','河北唐山海港经济开发区','','','河北唐山海港经济开发区','3','河北省','唐山市','河北唐山海港经济开发区','河北省唐山市河北唐山海港经济开发区',null,null,39.2462230,118.9982070),\n(23883,'130281000000','130200000000','130281','1302','遵化市','','','遵化市','3','河北省','唐山市','遵化市','河北省唐山市遵化市',null,null,40.1892400,117.9656700),\n(24606,'130283000000','130200000000','130283','1302','迁安市','','','迁安市','3','河北省','唐山市','迁安市','河北省唐山市迁安市',null,null,39.9983600,118.7007300),\n(25194,'130300000000','130000000000','1303','13','秦皇岛市','','秦皇岛市','','2','河北省','秦皇岛市','','河北省秦皇岛市',null,null,39.8350700,119.4845800),\n(25195,'130301000000','130300000000','130301','1303','市辖区','','','市辖区','3','河北省','秦皇岛市','市辖区','河北省秦皇岛市市辖区',null,null,39.8350700,119.4845800),\n(25196,'130302000000','130300000000','130302','1303','海港区','','','海港区','3','河北省','秦皇岛市','海港区','河北省秦皇岛市海港区',null,null,39.9345000,119.6106300),\n(25594,'130303000000','130300000000','130303','1303','山海关区','','','山海关区','3','河北省','秦皇岛市','山海关区','河北省秦皇岛市山海关区',null,null,39.9789200,119.7760600),\n(25725,'130304000000','130300000000','130304','1303','北戴河区','','','北戴河区','3','河北省','秦皇岛市','北戴河区','河北省秦皇岛市北戴河区',null,null,39.8350700,119.4845800),\n(25785,'130306000000','130300000000','130306','1303','抚宁区','','','抚宁区','3','河北省','秦皇岛市','抚宁区','河北省秦皇岛市抚宁区',null,null,39.8763400,119.2444400),\n(26166,'130321000000','130300000000','130321','1303','青龙满族自治县','','','青龙满族自治县','3','河北省','秦皇岛市','青龙满族自治县','河北省秦皇岛市青龙满族自治县',null,null,40.4069200,118.9501200),\n(26593,'130322000000','130300000000','130322','1303','昌黎县','','','昌黎县','3','河北省','秦皇岛市','昌黎县','河北省秦皇岛市昌黎县',null,null,39.7128400,119.1628800),\n(27051,'130324000000','130300000000','130324','1303','卢龙县','','','卢龙县','3','河北省','秦皇岛市','卢龙县','河北省秦皇岛市卢龙县',null,null,39.8918000,118.8929400),\n(27614,'130371000000','130300000000','130371','1303','秦皇岛市经济技术开发区','','','秦皇岛市经济技术开发区','3','河北省','秦皇岛市','秦皇岛市经济技术开发区','河北省秦皇岛市秦皇岛市经济技术开发区',null,null,39.9388390,119.5319520),\n(27725,'130372000000','130300000000','130372','1303','北戴河新区','','','北戴河新区','3','河北省','秦皇岛市','北戴河新区','河北省秦皇岛市北戴河新区',null,null,39.6048930,119.2857820),\n(27790,'130400000000','130000000000','1304','13','邯郸市','','邯郸市','','2','河北省','邯郸市','','河北省邯郸市',null,null,36.6185300,114.4933900),\n(27791,'130401000000','130400000000','130401','1304','市辖区','','','市辖区','3','河北省','邯郸市','市辖区','河北省邯郸市市辖区',null,null,36.6185300,114.4933900),\n(27792,'130402000000','130400000000','130402','1304','邯山区','','','邯山区','3','河北省','邯郸市','邯山区','河北省邯郸市邯山区',null,null,36.6000000,114.4837600),\n(27994,'130403000000','130400000000','130403','1304','丛台区','','','丛台区','3','河北省','邯郸市','丛台区','河北省邯郸市丛台区',null,null,36.6185300,114.4933900),\n(28179,'130404000000','130400000000','130404','1304','复兴区','','','复兴区','3','河北省','邯郸市','复兴区','河北省邯郸市复兴区',null,null,36.6169300,114.4730900),\n(28296,'130406000000','130400000000','130406','1304','峰峰矿区','','','峰峰矿区','3','河北省','邯郸市','峰峰矿区','河北省邯郸市峰峰矿区',null,null,36.4196800,114.2130200),\n(28533,'130407000000','130400000000','130407','1304','肥乡区','','','肥乡区','3','河北省','邯郸市','肥乡区','河北省邯郸市肥乡区',null,null,36.5481100,114.8000200),\n(28808,'130408000000','130400000000','130408','1304','永年区','','','永年区','3','河北省','邯郸市','永年区','河北省邯郸市永年区',null,null,36.7777100,114.4909500),\n(29190,'130423000000','130400000000','130423','1304','临漳县','','','临漳县','3','河北省','邯郸市','临漳县','河北省邯郸市临漳县',null,null,36.3348000,114.6196800),\n(29630,'130424000000','130400000000','130424','1304','成安县','','','成安县','3','河北省','邯郸市','成安县','河北省邯郸市成安县',null,null,36.4441400,114.6699900),\n(29874,'130425000000','130400000000','130425','1304','大名县','','','大名县','3','河北省','邯郸市','大名县','河北省邯郸市大名县',null,null,36.2855800,115.1478800),\n(30546,'130426000000','130400000000','130426','1304','涉县','','','涉县','3','河北省','邯郸市','涉县','河北省邯郸市涉县',null,null,36.5854400,113.6906500),\n(30878,'130427000000','130400000000','130427','1304','磁县','','','磁县','3','河北省','邯郸市','磁县','河北省邯郸市磁县',null,null,36.3739600,114.3739200),\n(31149,'130430000000','130400000000','130430','1304','邱县','','','邱县','3','河北省','邯郸市','邱县','河北省邯郸市邱县',null,null,36.8198700,115.1764100),\n(31382,'130431000000','130400000000','130431','1304','鸡泽县','','','鸡泽县','3','河北省','邯郸市','鸡泽县','河北省邯郸市鸡泽县',null,null,36.9203100,114.8782000),\n(31561,'130432000000','130400000000','130432','1304','广平县','','','广平县','3','河北省','邯郸市','广平县','河北省邯郸市广平县',null,null,36.4834500,114.9485000),\n(31738,'130433000000','130400000000','130433','1304','馆陶县','','','馆陶县','3','河北省','邯郸市','馆陶县','河北省邯郸市馆陶县',null,null,36.5352900,115.3062900),\n(32024,'130434000000','130400000000','130434','1304','魏县','','','魏县','3','河北省','邯郸市','魏县','河北省邯郸市魏县',null,null,36.3599100,114.9388200),\n(32607,'130435000000','130400000000','130435','1304','曲周县','','','曲周县','3','河北省','邯郸市','曲周县','河北省邯郸市曲周县',null,null,36.7791800,114.9448500),\n(32960,'130471000000','130400000000','130471','1304','邯郸经济技术开发区','','','邯郸经济技术开发区','3','河北省','邯郸市','邯郸经济技术开发区','河北省邯郸市邯郸经济技术开发区',null,null,36.6752320,114.5660320),\n(33077,'130473000000','130400000000','130473','1304','邯郸冀南新区','','','邯郸冀南新区','3','河北省','邯郸市','邯郸冀南新区','河北省邯郸市邯郸冀南新区',null,null,36.4632720,114.4686050),\n(33230,'130481000000','130400000000','130481','1304','武安市','','','武安市','3','河北省','邯郸市','武安市','河北省邯郸市武安市',null,null,36.6967100,114.2037600),\n(33772,'130500000000','130000000000','1305','13','邢台市','','邢台市','','2','河北省','邢台市','','河北省邢台市',null,null,37.0678700,114.5071300),\n(33773,'130501000000','130500000000','130501','1305','市辖区','','','市辖区','3','河北省','邢台市','市辖区','河北省邢台市市辖区',null,null,37.0678700,114.5071300),\n(33774,'130502000000','130500000000','130502','1305','桥东区','','','桥东区','3','河北省','邢台市','桥东区','河北省邢台市桥东区',null,null,37.0678700,114.5071300),\n(33916,'130503000000','130500000000','130503','1305','桥西区','','','桥西区','3','河北省','邢台市','桥西区','河北省邢台市桥西区',null,null,37.0598300,114.4681600),\n(34043,'130521000000','130500000000','130521','1305','邢台县','','','邢台县','3','河北省','邢台市','邢台县','河北省邢台市邢台县',null,null,37.0862700,114.5448900),\n(34580,'130522000000','130500000000','130522','1305','临城县','','','临城县','3','河北省','邢台市','临城县','河北省邢台市临城县',null,null,37.4443000,114.4989800),\n(34809,'130523000000','130500000000','130523','1305','内丘县','','','内丘县','3','河北省','邢台市','内丘县','河北省邢台市内丘县',null,null,37.2867800,114.5120700),\n(35132,'130524000000','130500000000','130524','1305','柏乡县','','','柏乡县','3','河北省','邢台市','柏乡县','河北省邢台市柏乡县',null,null,37.4824400,114.6936300),\n(35261,'130525000000','130500000000','130525','1305','隆尧县','','','隆尧县','3','河北省','邢台市','隆尧县','河北省邢台市隆尧县',null,null,37.3502500,114.7703100),\n(35553,'130526000000','130500000000','130526','1305','任县','','','任县','3','河北省','邢台市','任县','河北省邢台市任县',null,null,37.1209200,114.6713200),\n(35757,'130527000000','130500000000','130527','1305','南和县','','','南和县','3','河北省','邢台市','南和县','河北省邢台市南和县',null,null,37.0049000,114.6837600),\n(35993,'130528000000','130500000000','130528','1305','宁晋县','','','宁晋县','3','河北省','邢台市','宁晋县','河北省邢台市宁晋县',null,null,37.6198000,114.9193200),\n(36389,'130529000000','130500000000','130529','1305','巨鹿县','','','巨鹿县','3','河北省','邢台市','巨鹿县','河北省邢台市巨鹿县',null,null,37.2210700,115.0378100),\n(36691,'130530000000','130500000000','130530','1305','新河县','','','新河县','3','河北省','邢台市','新河县','河北省邢台市新河县',null,null,37.5286700,115.2421400),\n(36867,'130531000000','130500000000','130531','1305','广宗县','','','广宗县','3','河北省','邢台市','广宗县','河北省邢台市广宗县',null,null,37.0746300,115.1426100),\n(37089,'130532000000','130500000000','130532','1305','平乡县','','','平乡县','3','河北省','邢台市','平乡县','河北省邢台市平乡县',null,null,37.0631900,115.0300700),\n(37357,'130533000000','130500000000','130533','1305','威县','','','威县','3','河北省','邢台市','威县','河北省邢台市威县',null,null,36.9754200,115.2666900),\n(37903,'130534000000','130500000000','130534','1305','清河县','','','清河县','3','河北省','邢台市','清河县','河北省邢台市清河县',null,null,37.0399300,115.6671800),\n(38241,'130535000000','130500000000','130535','1305','临西县','','','临西县','3','河北省','邢台市','临西县','河北省邢台市临西县',null,null,36.8708200,115.5010400),\n(38558,'130571000000','130500000000','130571','1305','河北邢台经济开发区','','','河北邢台经济开发区','3','河北省','邢台市','河北邢台经济开发区','河北省邢台市河北邢台经济开发区',null,null,37.0616870,114.5657270),\n(38643,'130581000000','130500000000','130581','1305','南宫市','','','南宫市','3','河北省','邢台市','南宫市','河北省邢台市南宫市',null,null,37.3579500,115.4086600),\n(39124,'130582000000','130500000000','130582','1305','沙河市','','','沙河市','3','河北省','邢台市','沙河市','河北省邢台市沙河市',null,null,36.8551600,114.5033200),\n(39401,'130600000000','130000000000','1306','13','保定市','','保定市','','2','河北省','保定市','','河北省保定市',null,null,38.8775700,115.4587500),\n(39402,'130601000000','130600000000','130601','1306','市辖区','','','市辖区','3','河北省','保定市','市辖区','河北省保定市市辖区',null,null,38.8775700,115.4587500),\n(39403,'130602000000','130600000000','130602','1306','竞秀区','','','竞秀区','3','河北省','保定市','竞秀区','河北省保定市竞秀区',null,null,38.8775700,115.4587500),\n(39573,'130606000000','130600000000','130606','1306','莲池区','','','莲池区','3','河北省','保定市','莲池区','河北省保定市莲池区',null,null,38.8835300,115.4971500),\n(39840,'130607000000','130600000000','130607','1306','满城区','','','满城区','3','河北省','保定市','满城区','河北省保定市满城区',null,null,38.9489200,115.3221700),\n(40048,'130608000000','130600000000','130608','1306','清苑区','','','清苑区','3','河北省','保定市','清苑区','河北省保定市清苑区',null,null,38.7652600,115.4898900),\n(40346,'130609000000','130600000000','130609','1306','徐水区','','','徐水区','3','河北省','保定市','徐水区','河北省保定市徐水区',null,null,39.0186500,115.6558600),\n(40691,'130623000000','130600000000','130623','1306','涞水县','','','涞水县','3','河北省','保定市','涞水县','河北省保定市涞水县',null,null,39.3942800,115.7137800),\n(41001,'130624000000','130600000000','130624','1306','阜平县','','','阜平县','3','河北省','保定市','阜平县','河北省保定市阜平县',null,null,38.8491500,114.1953100),\n(41225,'130626000000','130600000000','130626','1306','定兴县','','','定兴县','3','河北省','保定市','定兴县','河北省保定市定兴县',null,null,39.2631500,115.8079000),\n(41524,'130627000000','130600000000','130627','1306','唐县','','','唐县','3','河北省','保定市','唐县','河北省保定市唐县',null,null,38.7479000,114.9829500),\n(41913,'130628000000','130600000000','130628','1306','高阳县','','','高阳县','3','河北省','保定市','高阳县','河北省保定市高阳县',null,null,38.7000700,115.7788400),\n(42110,'130629000000','130600000000','130629','1306','容城县','','','容城县','3','河北省','保定市','容城县','河北省保定市容城县',null,null,39.0428500,115.8616400),\n(42246,'130630000000','130600000000','130630','1306','涞源县','','','涞源县','3','河北省','保定市','涞源县','河北省保定市涞源县',null,null,39.3601800,114.6942400),\n(42557,'130631000000','130600000000','130631','1306','望都县','','','望都县','3','河北省','保定市','望都县','河北省保定市望都县',null,null,38.7090000,115.1556400),\n(42720,'130632000000','130600000000','130632','1306','安新县','','','安新县','3','河北省','保定市','安新县','河北省保定市安新县',null,null,38.9353500,115.9356400),\n(42945,'130633000000','130600000000','130633','1306','易县','','','易县','3','河北省','保定市','易县','河北省保定市易县',null,null,39.3492600,115.4984600),\n(43442,'130634000000','130600000000','130634','1306','曲阳县','','','曲阳县','3','河北省','保定市','曲阳县','河北省保定市曲阳县',null,null,38.6223100,114.7450100),\n(43837,'130635000000','130600000000','130635','1306','蠡县','','','蠡县','3','河北省','保定市','蠡县','河北省保定市蠡县',null,null,38.4880600,115.5836000),\n(44089,'130636000000','130600000000','130636','1306','顺平县','','','顺平县','3','河北省','保定市','顺平县','河北省保定市顺平县',null,null,38.8375900,115.1354300),\n(44341,'130637000000','130600000000','130637','1306','博野县','','','博野县','3','河北省','保定市','博野县','河北省保定市博野县',null,null,38.4576600,115.4643900),\n(44483,'130638000000','130600000000','130638','1306','雄县','','','雄县','3','河北省','保定市','雄县','河北省保定市雄县',null,null,38.9944600,116.1087900),\n(44728,'130671000000','130600000000','130671','1306','保定高新技术产业开发区','','','保定高新技术产业开发区','3','河北省','保定市','保定高新技术产业开发区','河北省保定市保定高新技术产业开发区',null,null,38.9059180,115.4622570),\n(44769,'130672000000','130600000000','130672','1306','保定白沟新城','','','保定白沟新城','3','河北省','保定市','保定白沟新城','河北省保定市保定白沟新城',null,null,38.8775700,115.4587500),\n(44804,'130681000000','130600000000','130681','1306','涿州市','','','涿州市','3','河北省','保定市','涿州市','河北省保定市涿州市',null,null,39.4852900,115.9743900),\n(45269,'130682000000','130600000000','130682','1306','定州市','','','定州市','3','河北省','保定市','定州市','河北省保定市定州市',null,null,38.5162600,114.9902500),\n(45826,'130683000000','130600000000','130683','1306','安国市','','','安国市','3','河北省','保定市','安国市','河北省保定市安国市',null,null,38.4184500,115.3266400),\n(46045,'130684000000','130600000000','130684','1306','高碑店市','','','高碑店市','3','河北省','保定市','高碑店市','河北省保定市高碑店市',null,null,39.3265800,115.8737300),\n(46497,'130700000000','130000000000','1307','13','张家口市','','张家口市','','2','河北省','张家口市','','河北省张家口市',null,null,40.9745700,115.2826100),\n(46498,'130701000000','130700000000','130701','1307','市辖区','','','市辖区','3','河北省','张家口市','市辖区','河北省张家口市市辖区',null,null,40.9745700,115.2826100),\n(46499,'130702000000','130700000000','130702','1307','桥东区','','','桥东区','3','河北省','张家口市','桥东区','河北省张家口市桥东区',null,null,40.7884700,114.8943600),\n(46601,'130703000000','130700000000','130703','1307','桥西区','','','桥西区','3','河北省','张家口市','桥西区','河北省张家口市桥西区',null,null,40.8195600,114.8693700),\n(46671,'130705000000','130700000000','130705','1307','宣化区','','','宣化区','3','河北省','张家口市','宣化区','河北省张家口市宣化区',null,null,40.6084500,115.0992300),\n(47062,'130706000000','130700000000','130706','1307','下花园区','','','下花园区','3','河北省','张家口市','下花园区','河北省张家口市下花园区',null,null,40.5024000,115.2875100),\n(47127,'130708000000','130700000000','130708','1307','万全区','','','万全区','3','河北省','张家口市','万全区','河北省张家口市万全区',null,null,40.7669900,114.7405500),\n(47325,'130709000000','130700000000','130709','1307','崇礼区','','','崇礼区','3','河北省','张家口市','崇礼区','河北省张家口市崇礼区',null,null,40.9745700,115.2826100),\n(47553,'130722000000','130700000000','130722','1307','张北县','','','张北县','3','河北省','张家口市','张北县','河北省张家口市张北县',null,null,41.1586200,114.7198700),\n(47948,'130723000000','130700000000','130723','1307','康保县','','','康保县','3','河北省','张家口市','康保县','河北省张家口市康保县',null,null,41.8522800,114.6003500),\n(48301,'130724000000','130700000000','130724','1307','沽源县','','','沽源县','3','河北省','张家口市','沽源县','河北省张家口市沽源县',null,null,41.6696400,115.6886500),\n(48549,'130725000000','130700000000','130725','1307','尚义县','','','尚义县','3','河北省','张家口市','尚义县','河北省张家口市尚义县',null,null,41.0759900,113.9691900),\n(48742,'130726000000','130700000000','130726','1307','蔚县','','','蔚县','3','河北省','张家口市','蔚县','河北省张家口市蔚县',null,null,39.8407200,114.5889700),\n(49326,'130727000000','130700000000','130727','1307','阳原县','','','阳原县','3','河北省','张家口市','阳原县','河北省张家口市阳原县',null,null,40.1036600,114.1505700),\n(49648,'130728000000','130700000000','130728','1307','怀安县','','','怀安县','3','河北省','张家口市','怀安县','河北省张家口市怀安县',null,null,40.6743000,114.3856400),\n(49943,'130730000000','130700000000','130730','1307','怀来县','','','怀来县','3','河北省','张家口市','怀来县','河北省张家口市怀来县',null,null,40.4153800,115.5177800),\n(50261,'130731000000','130700000000','130731','1307','涿鹿县','','','涿鹿县','3','河北省','张家口市','涿鹿县','河北省张家口市涿鹿县',null,null,40.3800300,115.2196200),\n(50661,'130732000000','130700000000','130732','1307','赤城县','','','赤城县','3','河北省','张家口市','赤城县','河北省张家口市赤城县',null,null,40.9129500,115.8316600),\n(51120,'130771000000','130700000000','130771','1307','张家口市高新技术产业开发区','','','张家口市高新技术产业开发区','3','河北省','张家口市','张家口市高新技术产业开发区','河北省张家口市张家口市高新技术产业开发区',null,null,40.7755700,114.8856200),\n(51179,'130772000000','130700000000','130772','1307','张家口市察北管理区','','','张家口市察北管理区','3','河北省','张家口市','张家口市察北管理区','河北省张家口市张家口市察北管理区',null,null,41.4211390,114.9520110),\n(51210,'130773000000','130700000000','130773','1307','张家口市塞北管理区','','','张家口市塞北管理区','3','河北省','张家口市','张家口市塞北管理区','河北省张家口市张家口市塞北管理区',null,null,41.9147260,115.9187850),\n(51227,'130800000000','130000000000','1308','13','承德市','','承德市','','2','河北省','承德市','','河北省承德市',null,null,40.9591300,117.8002400),\n(51228,'130801000000','130800000000','130801','1308','市辖区','','','市辖区','3','河北省','承德市','市辖区','河北省承德市市辖区',null,null,40.9591300,117.8002400),\n(51229,'130802000000','130800000000','130802','1308','双桥区','','','双桥区','3','河北省','承德市','双桥区','河北省承德市双桥区',null,null,40.9746900,117.9434800),\n(51367,'130803000000','130800000000','130803','1308','双滦区','','','双滦区','3','河北省','承德市','双滦区','河北省承德市双滦区',null,null,40.9591300,117.8002400),\n(51465,'130804000000','130800000000','130804','1308','鹰手营子矿区','','','鹰手营子矿区','3','河北省','承德市','鹰手营子矿区','河北省承德市鹰手营子矿区',null,null,40.5464000,117.6595500),\n(51497,'130821000000','130800000000','130821','1308','承德县','','','承德县','3','河北省','承德市','承德县','河北省承德市承德县',null,null,40.7685300,118.1738200),\n(51907,'130822000000','130800000000','130822','1308','兴隆县','','','兴隆县','3','河北省','承德市','兴隆县','河北省承德市兴隆县',null,null,40.4172700,117.5007600),\n(52226,'130824000000','130800000000','130824','1308','滦平县','','','滦平县','3','河北省','承德市','滦平县','河北省承德市滦平县',null,null,40.9414500,117.3328600),\n(52461,'130825000000','130800000000','130825','1308','隆化县','','','隆化县','3','河北省','承德市','隆化县','河北省承德市隆化县',null,null,41.3138100,117.7389700),\n(52850,'130826000000','130800000000','130826','1308','丰宁满族自治县','','','丰宁满族自治县','3','河北省','承德市','丰宁满族自治县','河北省承德市丰宁满族自治县',null,null,41.2089400,116.6459100),\n(53197,'130827000000','130800000000','130827','1308','宽城满族自治县','','','宽城满族自治县','3','河北省','承德市','宽城满族自治县','河北省承德市宽城满族自治县',null,null,40.6113900,118.4853500),\n(53426,'130828000000','130800000000','130828','1308','围场满族蒙古族自治县','','','围场满族蒙古族自治县','3','河北省','承德市','围场满族蒙古族自治县','河北省承德市围场满族蒙古族自治县',null,null,41.9384600,117.7601600),\n(53787,'130871000000','130800000000','130871','1308','承德高新技术产业开发区','','','承德高新技术产业开发区','3','河北省','承德市','承德高新技术产业开发区','河北省承德市承德高新技术产业开发区',null,null,40.9243430,117.9550170),\n(53831,'130881000000','130800000000','130881','1308','平泉市','','','平泉市','3','河北省','承德市','平泉市','河北省承德市平泉市',null,null,41.0184000,118.7020200),\n(54101,'130900000000','130000000000','1309','13','沧州市','','沧州市','','2','河北省','沧州市','','河北省沧州市',null,null,38.3140400,116.8663800),\n(54102,'130901000000','130900000000','130901','1309','市辖区','','','市辖区','3','河北省','沧州市','市辖区','河北省沧州市市辖区',null,null,38.3140400,116.8663800),\n(54103,'130902000000','130900000000','130902','1309','新华区','','','新华区','3','河北省','沧州市','新华区','河北省沧州市新华区',null,null,38.3140400,116.8663800),\n(54169,'130903000000','130900000000','130903','1309','运河区','','','运河区','3','河北省','沧州市','运河区','河北省沧州市运河区',null,null,38.3107700,116.8319100),\n(54299,'130921000000','130900000000','130921','1309','沧县','','','沧县','3','河北省','沧州市','沧县','河北省沧州市沧县',null,null,38.3247400,116.6071800),\n(54838,'130922000000','130900000000','130922','1309','青县','','','青县','3','河北省','沧州市','青县','河北省沧州市青县',null,null,38.5834800,116.8031800),\n(55213,'130923000000','130900000000','130923','1309','东光县','','','东光县','3','河北省','沧州市','东光县','河北省沧州市东光县',null,null,37.8882800,116.5371000),\n(55680,'130924000000','130900000000','130924','1309','海兴县','','','海兴县','3','河北省','沧州市','海兴县','河北省沧州市海兴县',null,null,38.1432500,117.4978500),\n(55895,'130925000000','130900000000','130925','1309','盐山县','','','盐山县','3','河北省','沧州市','盐山县','河北省沧州市盐山县',null,null,38.0583000,117.2302500),\n(56362,'130926000000','130900000000','130926','1309','肃宁县','','','肃宁县','3','河北省','沧州市','肃宁县','河北省沧州市肃宁县',null,null,38.4227700,115.8299700),\n(56632,'130927000000','130900000000','130927','1309','南皮县','','','南皮县','3','河北省','沧州市','南皮县','河北省沧州市南皮县',null,null,38.0378000,116.7077400),\n(56960,'130928000000','130900000000','130928','1309','吴桥县','','','吴桥县','3','河北省','沧州市','吴桥县','河北省沧州市吴桥县',null,null,37.6277000,116.3915400),\n(57454,'130929000000','130900000000','130929','1309','献县','','','献县','3','河北省','沧州市','献县','河北省沧州市献县',null,null,38.1901800,116.1227900),\n(57987,'130930000000','130900000000','130930','1309','孟村回族自治县','','','孟村回族自治县','3','河北省','沧州市','孟村回族自治县','河北省沧州市孟村回族自治县',null,null,38.0534100,117.1041800),\n(58122,'130971000000','130900000000','130971','1309','河北沧州经济开发区','','','河北沧州经济开发区','3','河北省','沧州市','河北沧州经济开发区','河北省沧州市河北沧州经济开发区',null,null,38.2828370,116.9410480),\n(58132,'130972000000','130900000000','130972','1309','沧州高新技术产业开发区','','','沧州高新技术产业开发区','3','河北省','沧州市','沧州高新技术产业开发区','河北省沧州市沧州高新技术产业开发区',null,null,38.3382260,116.8107760),\n(58137,'130973000000','130900000000','130973','1309','沧州渤海新区','','','沧州渤海新区','3','河北省','沧州市','沧州渤海新区','河北省沧州市沧州渤海新区',null,null,38.3140400,116.8663800),\n(58222,'130981000000','130900000000','130981','1309','泊头市','','','泊头市','3','河北省','沧州市','泊头市','河北省沧州市泊头市',null,null,38.0836400,116.5782800),\n(58949,'130982000000','130900000000','130982','1309','任丘市','','','任丘市','3','河北省','沧州市','任丘市','河北省沧州市任丘市',null,null,38.7116400,116.0995400),\n(59423,'130983000000','130900000000','130983','1309','黄骅市','','','黄骅市','3','河北省','沧州市','黄骅市','河北省沧州市黄骅市',null,null,38.3713900,117.3301200),\n(59781,'130984000000','130900000000','130984','1309','河间市','','','河间市','3','河北省','沧州市','河间市','河北省沧州市河间市',null,null,38.4454800,116.0990000),\n(60445,'131000000000','130000000000','1310','13','廊坊市','','廊坊市','','2','河北省','廊坊市','','河北省廊坊市',null,null,39.5031100,116.6857200),\n(60446,'131001000000','131000000000','131001','1310','市辖区','','','市辖区','3','河北省','廊坊市','市辖区','河北省廊坊市市辖区',null,null,39.5031100,116.6857200),\n(60447,'131002000000','131000000000','131002','1310','安次区','','','安次区','3','河北省','廊坊市','安次区','河北省廊坊市安次区',null,null,39.5031100,116.6857200),\n(60765,'131003000000','131000000000','131003','1310','广阳区','','','广阳区','3','河北省','廊坊市','广阳区','河北省廊坊市广阳区',null,null,39.5228000,116.7105100),\n(60987,'131022000000','131000000000','131022','1310','固安县','','','固安县','3','河北省','廊坊市','固安县','河北省廊坊市固安县',null,null,39.4382500,116.2985200),\n(61426,'131023000000','131000000000','131023','1310','永清县','','','永清县','3','河北省','廊坊市','永清县','河北省廊坊市永清县',null,null,39.3217800,116.4990400),\n(61837,'131024000000','131000000000','131024','1310','香河县','','','香河县','3','河北省','廊坊市','香河县','河北省廊坊市香河县',null,null,39.7614200,117.0064500),\n(62161,'131025000000','131000000000','131025','1310','大城县','','','大城县','3','河北省','廊坊市','大城县','河北省廊坊市大城县',null,null,38.7046900,116.6542300),\n(62576,'131026000000','131000000000','131026','1310','文安县','','','文安县','3','河北省','廊坊市','文安县','河北省廊坊市文安县',null,null,38.8732800,116.4584800),\n(62982,'131028000000','131000000000','131028','1310','大厂回族自治县','','','大厂回族自治县','3','河北省','廊坊市','大厂回族自治县','河北省廊坊市大厂回族自治县',null,null,39.8866500,116.9895100),\n(63102,'131071000000','131000000000','131071','1310','廊坊经济技术开发区','','','廊坊经济技术开发区','3','河北省','廊坊市','廊坊经济技术开发区','河北省廊坊市廊坊经济技术开发区',null,null,39.5814970,116.7614750),\n(63128,'131081000000','131000000000','131081','1310','霸州市','','','霸州市','3','河北省','廊坊市','霸州市','河北省廊坊市霸州市',null,null,39.1258100,116.3917000),\n(63535,'131082000000','131000000000','131082','1310','三河市','','','三河市','3','河北省','廊坊市','三河市','河北省廊坊市三河市',null,null,39.9824600,117.0782200),\n(64028,'131100000000','130000000000','1311','13','衡水市','','衡水市','','2','河北省','衡水市','','河北省衡水市',null,null,37.5508500,115.5793800),\n(64029,'131101000000','131100000000','131101','1311','市辖区','','','市辖区','3','河北省','衡水市','市辖区','河北省衡水市市辖区',null,null,37.5508500,115.5793800),\n(64030,'131102000000','131100000000','131102','1311','桃城区','','','桃城区','3','河北省','衡水市','桃城区','河北省衡水市桃城区',null,null,37.7351600,115.6746600),\n(64310,'131103000000','131100000000','131103','1311','冀州区','','','冀州区','3','河北省','衡水市','冀州区','河北省衡水市冀州区',null,null,37.5508500,115.5793800),\n(64703,'131121000000','131100000000','131121','1311','枣强县','','','枣强县','3','河北省','衡水市','枣强县','河北省衡水市枣强县',null,null,37.5133700,115.7241800),\n(65274,'131122000000','131100000000','131122','1311','武邑县','','','武邑县','3','河北省','衡水市','武邑县','河北省衡水市武邑县',null,null,37.8018600,115.8875100),\n(65808,'131123000000','131100000000','131123','1311','武强县','','','武强县','3','河北省','衡水市','武强县','河北省衡水市武强县',null,null,38.0412000,115.9825300),\n(66056,'131124000000','131100000000','131124','1311','饶阳县','','','饶阳县','3','河北省','衡水市','饶阳县','河北省衡水市饶阳县',null,null,38.2353000,115.7256000),\n(66264,'131125000000','131100000000','131125','1311','安平县','','','安平县','3','河北省','衡水市','安平县','河北省衡水市安平县',null,null,38.2344700,115.5191200),\n(66505,'131126000000','131100000000','131126','1311','故城县','','','故城县','3','河北省','衡水市','故城县','河北省衡水市故城县',null,null,37.3474800,115.9658100),\n(67057,'131127000000','131100000000','131127','1311','景县','','','景县','3','河北省','衡水市','景县','河北省衡水市景县',null,null,37.6923400,116.2706000),\n(67927,'131128000000','131100000000','131128','1311','阜城县','','','阜城县','3','河北省','衡水市','阜城县','河北省衡水市阜城县',null,null,37.8688500,116.1443700),\n(68548,'131171000000','131100000000','131171','1311','河北衡水经济开发区','','','河北衡水经济开发区','3','河北省','衡水市','河北衡水经济开发区','河北省衡水市河北衡水经济开发区',null,null,37.7305790,115.6380840),\n(68672,'131172000000','131100000000','131172','1311','衡水滨湖新区','','','衡水滨湖新区','3','河北省','衡水市','衡水滨湖新区','河北省衡水市衡水滨湖新区',null,null,37.6916500,115.6784970),\n(68750,'131182000000','131100000000','131182','1311','深州市','','','深州市','3','河北省','衡水市','深州市','河北省衡水市深州市',null,null,38.0002200,115.5600100),\n(69240,'140000000000','0','14','0','山西省','山西省','','','1','山西省','','','山西省','2018-09-21 17:04:42','1810',null,null),\n(69241,'140100000000','140000000000','1401','14','太原市','','太原市','','2','山西省','太原市','','山西省太原市',null,null,37.9403600,112.4869900),\n(69242,'140101000000','140100000000','140101','1401','市辖区','','','市辖区','3','山西省','太原市','市辖区','山西省太原市市辖区',null,null,37.9403600,112.4869900),\n(69243,'140105000000','140100000000','140105','1401','小店区','','','小店区','3','山西省','太原市','小店区','山西省太原市小店区',null,null,37.7360500,112.5656600),\n(69400,'140106000000','140100000000','140106','1401','迎泽区','','','迎泽区','3','山西省','太原市','迎泽区','山西省太原市迎泽区',null,null,37.8632000,112.5634600),\n(69522,'140107000000','140100000000','140107','1401','杏花岭区','','','杏花岭区','3','山西省','太原市','杏花岭区','山西省太原市杏花岭区',null,null,37.8940300,112.5705300),\n(69682,'140108000000','140100000000','140108','1401','尖草坪区','','','尖草坪区','3','山西省','太原市','尖草坪区','山西省太原市尖草坪区',null,null,37.9403600,112.4869900),\n(69847,'140109000000','140100000000','140109','1401','万柏林区','','','万柏林区','3','山西省','太原市','万柏林区','山西省太原市万柏林区',null,null,37.8592900,112.5156200),\n(70022,'140110000000','140100000000','140110','1401','晋源区','','','晋源区','3','山西省','太原市','晋源区','山西省太原市晋源区',null,null,37.7152500,112.4777000),\n(70151,'140121000000','140100000000','140121','1401','清徐县','','','清徐县','3','山西省','太原市','清徐县','山西省太原市清徐县',null,null,37.6073600,112.3588500),\n(70361,'140122000000','140100000000','140122','1401','阳曲县','','','阳曲县','3','山西省','太原市','阳曲县','山西省太原市阳曲县',null,null,38.0582800,112.6729200),\n(70500,'140123000000','140100000000','140123','1401','娄烦县','','','娄烦县','3','山西省','太原市','娄烦县','山西省太原市娄烦县',null,null,38.0672000,111.7974500),\n(70658,'140171000000','140100000000','140171','1401','山西转型综合改革示范区','','','山西转型综合改革示范区','3','山西省','太原市','山西转型综合改革示范区','山西省太原市山西转型综合改革示范区',null,null,37.9403600,112.4869900),\n(70712,'140181000000','140100000000','140181','1401','古交市','','','古交市','3','山西省','太原市','古交市','山西省太原市古交市',null,null,37.9071400,112.1758800),\n(70912,'140200000000','140000000000','1402','14','大同市','','大同市','','2','山西省','大同市','','山西省大同市',null,null,40.2558500,113.1401300),\n(70913,'140201000000','140200000000','140201','1402','市辖区','','','市辖区','3','山西省','大同市','市辖区','山西省大同市市辖区',null,null,40.2558500,113.1401300),\n(70914,'140202000000','140200000000','140202','1402','城区','','','城区','3','山西省','大同市','城区','山西省大同市城区',null,null,40.0641600,113.2931500),\n(71066,'140203000000','140200000000','140203','1402','矿区','','','矿区','3','山西省','大同市','矿区','山西省大同市矿区',null,null,40.0054300,113.1495200),\n(71211,'140211000000','140200000000','140211','1402','南郊区','','','南郊区','3','山西省','大同市','南郊区','山西省大同市南郊区',null,null,40.0054300,113.1495200),\n(71411,'140212000000','140200000000','140212','1402','新荣区','','','新荣区','3','山西省','大同市','新荣区','山西省大同市新荣区',null,null,40.2558500,113.1401300),\n(71565,'140221000000','140200000000','140221','1402','阳高县','','','阳高县','3','山西省','大同市','阳高县','山西省大同市阳高县',null,null,40.3662700,113.7541200),\n(71856,'140222000000','140200000000','140222','1402','天镇县','','','天镇县','3','山西省','大同市','天镇县','山西省大同市天镇县',null,null,40.4203100,114.0907000),\n(72102,'140223000000','140200000000','140223','1402','广灵县','','','广灵县','3','山西省','大同市','广灵县','山西省大同市广灵县',null,null,39.7602000,114.2825700),\n(72298,'140224000000','140200000000','140224','1402','灵丘县','','','灵丘县','3','山西省','大同市','灵丘县','山西省大同市灵丘县',null,null,39.4424300,114.2342000),\n(72579,'140225000000','140200000000','140225','1402','浑源县','','','浑源县','3','山西省','大同市','浑源县','山西省大同市浑源县',null,null,39.6987300,113.6908000),\n(72922,'140226000000','140200000000','140226','1402','左云县','','','左云县','3','山西省','大同市','左云县','山西省大同市左云县',null,null,40.0134900,112.7027300),\n(73169,'140227000000','140200000000','140227','1402','大同县','','','大同县','3','山西省','大同市','大同县','山西省大同市大同县',null,null,40.0401600,113.6121700),\n(73370,'140271000000','140200000000','140271','1402','山西大同经济开发区','','','山西大同经济开发区','3','山西省','大同市','山西大同经济开发区','山西省大同市山西大同经济开发区',null,null,40.0623400,113.4028170),\n(73380,'140300000000','140000000000','1403','14','阳泉市','','阳泉市','','2','山西省','阳泉市','','山西省阳泉市',null,null,37.8473900,113.6007500),\n(73381,'140301000000','140300000000','140301','1403','市辖区','','','市辖区','3','山西省','阳泉市','市辖区','山西省阳泉市市辖区',null,null,37.8473900,113.6007500),\n(73382,'140302000000','140300000000','140302','1403','城区','','','城区','3','山西省','阳泉市','城区','山西省阳泉市城区',null,null,37.8473900,113.6007500),\n(73454,'140303000000','140300000000','140303','1403','矿区','','','矿区','3','山西省','阳泉市','矿区','山西省阳泉市矿区',null,null,37.8685100,113.5553000),\n(73517,'140311000000','140300000000','140311','1403','郊区','','','郊区','3','山西省','阳泉市','郊区','山西省阳泉市郊区',null,null,37.9413500,113.5851500),\n(73674,'140321000000','140300000000','140321','1403','平定县','','','平定县','3','山西省','阳泉市','平定县','山西省阳泉市平定县',null,null,37.7868500,113.6580400),\n(74025,'140322000000','140300000000','140322','1403','盂县','','','盂县','3','山西省','阳泉市','盂县','山西省阳泉市盂县',null,null,38.0858000,113.4123800),\n(74503,'140371000000','140300000000','140371','1403','山西阳泉经济开发区','','','山西阳泉经济开发区','3','山西省','阳泉市','山西阳泉经济开发区','山西省阳泉市山西阳泉经济开发区',null,null,37.8672180,113.5987320),\n(74528,'140400000000','140000000000','1404','14','长治市','','长治市','','2','山西省','长治市','','山西省长治市',null,null,36.2034600,113.1230300),\n(74529,'140401000000','140400000000','140401','1404','市辖区','','','市辖区','3','山西省','长治市','市辖区','山西省长治市市辖区',null,null,36.2034600,113.1230300),\n(74530,'140402000000','140400000000','140402','1404','城区','','','城区','3','山西省','长治市','城区','山西省长治市城区',null,null,36.2034600,113.1230300),\n(74624,'140411000000','140400000000','140411','1404','郊区','','','郊区','3','山西省','长治市','郊区','山西省长治市郊区',null,null,36.2243400,113.1118500),\n(74778,'140421000000','140400000000','140421','1404','长治县','','','长治县','3','山西省','长治市','长治县','山西省长治市长治县',null,null,36.0531200,113.0513500),\n(75053,'140423000000','140400000000','140423','1404','襄垣县','','','襄垣县','3','山西省','长治市','襄垣县','山西省长治市襄垣县',null,null,36.5358100,113.0530600),\n(75400,'140424000000','140400000000','140424','1404','屯留县','','','屯留县','3','山西省','长治市','屯留县','山西省长治市屯留县',null,null,36.3155300,112.8922100),\n(75713,'140425000000','140400000000','140425','1404','平顺县','','','平顺县','3','山西省','长治市','平顺县','山西省长治市平顺县',null,null,36.2000600,113.4360600),\n(75993,'140426000000','140400000000','140426','1404','黎城县','','','黎城县','3','山西省','长治市','黎城县','山西省长治市黎城县',null,null,36.5022700,113.3872200),\n(76260,'140427000000','140400000000','140427','1404','壶关县','','','壶关县','3','山西省','长治市','壶关县','山西省长治市壶关县',null,null,36.1156700,113.2073300),\n(76667,'140428000000','140400000000','140428','1404','长子县','','','长子县','3','山西省','长治市','长子县','山西省长治市长子县',null,null,36.1222200,112.8779500),\n(77088,'140429000000','140400000000','140429','1404','武乡县','','','武乡县','3','山西省','长治市','武乡县','山西省长治市武乡县',null,null,36.8378000,112.8638700),\n(77486,'140430000000','140400000000','140430','1404','沁县','','','沁县','3','山西省','长治市','沁县','山西省长治市沁县',null,null,36.7560800,112.6990700),\n(77812,'140431000000','140400000000','140431','1404','沁源县','','','沁源县','3','山西省','长治市','沁源县','山西省长治市沁源县',null,null,36.5001000,112.3376200),\n(78089,'140471000000','140400000000','140471','1404','山西长治高新技术产业园区','','','山西长治高新技术产业园区','3','山西省','长治市','山西长治高新技术产业园区','山西省长治市山西长治高新技术产业园区',null,null,36.2316210,113.1036830),\n(78100,'140481000000','140400000000','140481','1404','潞城市','','','潞城市','3','山西省','长治市','潞城市','山西省长治市潞城市',null,null,36.3341800,113.2289300),\n(78316,'140500000000','140000000000','1405','14','晋城市','','晋城市','','2','山西省','晋城市','','山西省晋城市',null,null,35.5015400,112.8535200),\n(78317,'140501000000','140500000000','140501','1405','市辖区','','','市辖区','3','山西省','晋城市','市辖区','山西省晋城市市辖区',null,null,35.5015400,112.8535200),\n(78318,'140502000000','140500000000','140502','1405','城区','','','城区','3','山西省','晋城市','城区','山西省晋城市城区',null,null,35.5015400,112.8535200),\n(78473,'140521000000','140500000000','140521','1405','沁水县','','','沁水县','3','山西省','晋城市','沁水县','山西省晋城市沁水县',null,null,35.6901500,112.1866000),\n(78739,'140522000000','140500000000','140522','1405','阳城县','','','阳城县','3','山西省','晋城市','阳城县','山西省晋城市阳城县',null,null,35.4861800,112.4149100),\n(79190,'140524000000','140500000000','140524','1405','陵川县','','','陵川县','3','山西省','晋城市','陵川县','山西省晋城市陵川县',null,null,35.7751200,113.2806100),\n(79582,'140525000000','140500000000','140525','1405','泽州县','','','泽州县','3','山西省','晋城市','泽州县','山西省晋城市泽州县',null,null,35.5004300,112.9436600),\n(80241,'140581000000','140500000000','140581','1405','高平市','','','高平市','3','山西省','晋城市','高平市','山西省晋城市高平市',null,null,35.7980700,112.9235800),\n(80726,'140600000000','140000000000','1406','14','朔州市','','朔州市','','2','山西省','朔州市','','山西省朔州市',null,null,39.5123800,112.2883200),\n(80727,'140601000000','140600000000','140601','1406','市辖区','','','市辖区','3','山西省','朔州市','市辖区','山西省朔州市市辖区',null,null,39.5123800,112.2883200),\n(80728,'140602000000','140600000000','140602','1406','朔城区','','','朔城区','3','山西省','朔州市','朔城区','山西省朔州市朔城区',null,null,39.3191800,112.4331400),\n(81096,'140603000000','140600000000','140603','1406','平鲁区','','','平鲁区','3','山西省','朔州市','平鲁区','山西省朔州市平鲁区',null,null,39.5123800,112.2883200),\n(81406,'140621000000','140600000000','140621','1406','山阴县','','','山阴县','3','山西省','朔州市','山阴县','山西省朔州市山阴县',null,null,39.5262500,112.8157200),\n(81697,'140622000000','140600000000','140622','1406','应县','','','应县','3','山西省','朔州市','应县','山西省朔州市应县',null,null,39.5543400,113.1909300),\n(82017,'140623000000','140600000000','140623','1406','右玉县','','','右玉县','3','山西省','朔州市','右玉县','山西省朔州市右玉县',null,null,39.9891300,112.4670500),\n(82329,'140624000000','140600000000','140624','1406','怀仁县','','','怀仁县','3','山西省','朔州市','怀仁县','山西省朔州市怀仁县',null,null,39.8278800,113.1001200),\n(82528,'140671000000','140600000000','140671','1406','山西朔州经济开发区','','','山西朔州经济开发区','3','山西省','朔州市','山西朔州经济开发区','山西省朔州市山西朔州经济开发区',null,null,39.3511890,112.4864960),\n(82533,'140700000000','140000000000','1407','14','晋中市','','晋中市','','2','山西省','晋中市','','山西省晋中市',null,null,37.6997800,112.7074600),\n(82534,'140701000000','140700000000','140701','1407','市辖区','','','市辖区','3','山西省','晋中市','市辖区','山西省晋中市市辖区',null,null,37.6997800,112.7074600),\n(82535,'140702000000','140700000000','140702','1407','榆次区','','','榆次区','3','山西省','晋中市','榆次区','山西省晋中市榆次区',null,null,37.6997800,112.7074600),\n(82918,'140721000000','140700000000','140721','1407','榆社县','','','榆社县','3','山西省','晋中市','榆社县','山西省晋中市榆社县',null,null,37.0708400,112.9752200),\n(83206,'140722000000','140700000000','140722','1407','左权县','','','左权县','3','山西省','晋中市','左权县','山西省晋中市左权县',null,null,37.0824300,113.3792600),\n(83429,'140723000000','140700000000','140723','1407','和顺县','','','和顺县','3','山西省','晋中市','和顺县','山西省晋中市和顺县',null,null,37.3290500,113.5697200),\n(83740,'140724000000','140700000000','140724','1407','昔阳县','','','昔阳县','3','山西省','晋中市','昔阳县','山西省晋中市昔阳县',null,null,37.6128200,113.7071800),\n(84092,'140725000000','140700000000','140725','1407','寿阳县','','','寿阳县','3','山西省','晋中市','寿阳县','山西省晋中市寿阳县',null,null,37.8949800,113.1766600),\n(84322,'140726000000','140700000000','140726','1407','太谷县','','','太谷县','3','山西省','晋中市','太谷县','山西省晋中市太谷县',null,null,37.4211900,112.5512600),\n(84551,'140727000000','140700000000','140727','1407','祁县','','','祁县','3','山西省','晋中市','祁县','山西省晋中市祁县',null,null,37.3577500,112.3350700),\n(84731,'140728000000','140700000000','140728','1407','平遥县','','','平遥县','3','山西省','晋中市','平遥县','山西省晋中市平遥县',null,null,37.1893400,112.1755700),\n(85038,'140729000000','140700000000','140729','1407','灵石县','','','灵石县','3','山西省','晋中市','灵石县','山西省晋中市灵石县',null,null,36.8478800,111.7787900),\n(85376,'140781000000','140700000000','140781','1407','介休市','','','介休市','3','山西省','晋中市','介休市','山西省晋中市介休市',null,null,37.0271000,111.9167200),\n(85649,'140800000000','140000000000','1408','14','运城市','','运城市','','2','山西省','运城市','','山西省运城市',null,null,35.0150500,110.9981700),\n(85650,'140801000000','140800000000','140801','1408','市辖区','','','市辖区','3','山西省','运城市','市辖区','山西省运城市市辖区',null,null,35.0150500,110.9981700),\n(85651,'140802000000','140800000000','140802','1408','盐湖区','','','盐湖区','3','山西省','运城市','盐湖区','山西省运城市盐湖区',null,null,35.0150500,110.9981700),\n(86079,'140821000000','140800000000','140821','1408','临猗县','','','临猗县','3','山西省','运城市','临猗县','山西省运城市临猗县',null,null,35.1447100,110.7740800),\n(86489,'140822000000','140800000000','140822','1408','万荣县','','','万荣县','3','山西省','运城市','万荣县','山西省运城市万荣县',null,null,35.4153400,110.8378100),\n(86790,'140823000000','140800000000','140823','1408','闻喜县','','','闻喜县','3','山西省','运城市','闻喜县','山西省运城市闻喜县',null,null,35.3566300,111.2247200),\n(87165,'140824000000','140800000000','140824','1408','稷山县','','','稷山县','3','山西省','运城市','稷山县','山西省运城市稷山县',null,null,35.6040100,110.9831100),\n(87377,'140825000000','140800000000','140825','1408','新绛县','','','新绛县','3','山西省','运城市','新绛县','山西省运城市新绛县',null,null,35.6162200,111.2247000),\n(87620,'140826000000','140800000000','140826','1408','绛县','','','绛县','3','山西省','运城市','绛县','山西省运城市绛县',null,null,35.6162200,111.2247000),\n(87846,'140827000000','140800000000','140827','1408','垣曲县','','','垣曲县','3','山西省','运城市','垣曲县','山西省运城市垣曲县',null,null,35.2976200,111.6702500),\n(88056,'140828000000','140800000000','140828','1408','夏县','','','夏县','3','山西省','运城市','夏县','山西省运城市夏县',null,null,35.1413600,111.2203100),\n(88329,'140829000000','140800000000','140829','1408','平陆县','','','平陆县','3','山西省','运城市','平陆县','山西省运城市平陆县',null,null,34.8346700,111.1947400),\n(88572,'140830000000','140800000000','140830','1408','芮城县','','','芮城县','3','山西省','运城市','芮城县','山西省运城市芮城县',null,null,34.6936500,110.6944200),\n(88766,'140881000000','140800000000','140881','1408','永济市','','','永济市','3','山西省','运城市','永济市','山西省运城市永济市',null,null,34.8671600,110.4477300),\n(89070,'140882000000','140800000000','140882','1408','河津市','','','河津市','3','山西省','运城市','河津市','山西省运城市河津市',null,null,35.5964300,110.7118600),\n(89251,'140900000000','140000000000','1409','14','忻州市','','忻州市','','2','山西省','忻州市','','山西省忻州市',null,null,38.4042900,112.7461900),\n(89252,'140901000000','140900000000','140901','1409','市辖区','','','市辖区','3','山西省','忻州市','市辖区','山西省忻州市市辖区',null,null,38.4042900,112.7461900),\n(89253,'140902000000','140900000000','140902','1409','忻府区','','','忻府区','3','山西省','忻州市','忻府区','山西省忻州市忻府区',null,null,38.4042900,112.7461900),\n(89679,'140921000000','140900000000','140921','1409','定襄县','','','定襄县','3','山西省','忻州市','定襄县','山西省忻州市定襄县',null,null,38.4734800,112.9572200),\n(89845,'140922000000','140900000000','140922','1409','五台县','','','五台县','3','山西省','忻州市','五台县','山西省忻州市五台县',null,null,38.7281200,113.2554000),\n(90372,'140923000000','140900000000','140923','1409','代县','','','代县','3','山西省','忻州市','代县','山西省忻州市代县',null,null,39.0668900,112.9599600),\n(90762,'140924000000','140900000000','140924','1409','繁峙县','','','繁峙县','3','山西省','忻州市','繁峙县','山西省忻州市繁峙县',null,null,39.1890400,113.2654700),\n(91188,'140925000000','140900000000','140925','1409','宁武县','','','宁武县','3','山西省','忻州市','宁武县','山西省忻州市宁武县',null,null,39.0014700,112.3045000),\n(91684,'140926000000','140900000000','140926','1409','静乐县','','','静乐县','3','山西省','忻州市','静乐县','山西省忻州市静乐县',null,null,38.3592400,111.9387500),\n(92080,'140927000000','140900000000','140927','1409','神池县','','','神池县','3','山西省','忻州市','神池县','山西省忻州市神池县',null,null,39.0905900,112.2107700),\n(92333,'140928000000','140900000000','140928','1409','五寨县','','','五寨县','3','山西省','忻州市','五寨县','山西省忻州市五寨县',null,null,38.9107100,111.8470100),\n(92596,'140929000000','140900000000','140929','1409','岢岚县','','','岢岚县','3','山西省','忻州市','岢岚县','山西省忻州市岢岚县',null,null,38.7042700,111.5729600),\n(92811,'140930000000','140900000000','140930','1409','河曲县','','','河曲县','3','山西省','忻州市','河曲县','山西省忻州市河曲县',null,null,39.3845600,111.1383700),\n(93153,'140931000000','140900000000','140931','1409','保德县','','','保德县','3','山西省','忻州市','保德县','山西省忻州市保德县',null,null,39.0226500,111.0862500),\n(93517,'140932000000','140900000000','140932','1409','偏关县','','','偏关县','3','山西省','忻州市','偏关县','山西省忻州市偏关县',null,null,39.4361300,111.5086900),\n(93777,'140971000000','140900000000','140971','1409','五台山风景名胜区','','','五台山风景名胜区','3','山西省','忻州市','五台山风景名胜区','山西省忻州市五台山风景名胜区',null,null,38.9686200,113.5907210),\n(93844,'140981000000','140900000000','140981','1409','原平市','','','原平市','3','山西省','忻州市','原平市','山西省忻州市原平市',null,null,38.7305100,112.7109200),\n(94410,'141000000000','140000000000','1410','14','临汾市','','临汾市','','2','山西省','临汾市','','山西省临汾市',null,null,36.0832900,111.5777600),\n(94411,'141001000000','141000000000','141001','1410','市辖区','','','市辖区','3','山西省','临汾市','市辖区','山西省临汾市市辖区',null,null,36.0832900,111.5777600),\n(94412,'141002000000','141000000000','141002','1410','尧都区','','','尧都区','3','山西省','临汾市','尧都区','山西省临汾市尧都区',null,null,36.0832900,111.5777600),\n(94895,'141021000000','141000000000','141021','1410','曲沃县','','','曲沃县','3','山西省','临汾市','曲沃县','山西省临汾市曲沃县',null,null,35.6410500,111.4757000),\n(95062,'141022000000','141000000000','141022','1410','翼城县','','','翼城县','3','山西省','临汾市','翼城县','山西省临汾市翼城县',null,null,35.7382300,111.7183600),\n(95291,'141023000000','141000000000','141023','1410','襄汾县','','','襄汾县','3','山西省','临汾市','襄汾县','山西省临汾市襄汾县',null,null,35.8761800,111.4418900),\n(95659,'141024000000','141000000000','141024','1410','洪洞县','','','洪洞县','3','山西省','临汾市','洪洞县','山西省临汾市洪洞县',null,null,36.2537400,111.6749600),\n(96144,'141025000000','141000000000','141025','1410','古县','','','古县','3','山西省','临汾市','古县','山西省临汾市古县',null,null,36.2666100,111.9205000),\n(96267,'141026000000','141000000000','141026','1410','安泽县','','','安泽县','3','山西省','临汾市','安泽县','山西省临汾市安泽县',null,null,36.1478100,112.2501300),\n(96381,'141027000000','141000000000','141027','1410','浮山县','','','浮山县','3','山西省','临汾市','浮山县','山西省临汾市浮山县',null,null,35.9680200,111.8495200),\n(96578,'141028000000','141000000000','141028','1410','吉县','','','吉县','3','山西省','临汾市','吉县','山西省临汾市吉县',null,null,36.0978900,110.6816200),\n(96666,'141029000000','141000000000','141029','1410','乡宁县','','','乡宁县','3','山西省','临汾市','乡宁县','山西省临汾市乡宁县',null,null,35.9705300,110.8472100),\n(96866,'141030000000','141000000000','141030','1410','大宁县','','','大宁县','3','山西省','临汾市','大宁县','山西省临汾市大宁县',null,null,36.4651100,110.7528500),\n(96957,'141031000000','141000000000','141031','1410','隰县','','','隰县','3','山西省','临汾市','隰县','山西省临汾市隰县',null,null,36.6934400,110.9404900),\n(97066,'141032000000','141000000000','141032','1410','永和县','','','永和县','3','山西省','临汾市','永和县','山西省临汾市永和县',null,null,36.7595200,110.6319800),\n(97157,'141033000000','141000000000','141033','1410','蒲县','','','蒲县','3','山西省','临汾市','蒲县','山西省临汾市蒲县',null,null,36.4117900,111.0964800),\n(97264,'141034000000','141000000000','141034','1410','汾西县','','','汾西县','3','山西省','临汾市','汾西县','山西省临汾市汾西县',null,null,36.6529500,111.5636500),\n(97400,'141081000000','141000000000','141081','1410','侯马市','','','侯马市','3','山西省','临汾市','侯马市','山西省临汾市侯马市',null,null,35.6190800,111.3721300),\n(97513,'141082000000','141000000000','141082','1410','霍州市','','','霍州市','3','山西省','临汾市','霍州市','山西省临汾市霍州市',null,null,36.5687900,111.7550500),\n(97749,'141100000000','140000000000','1411','14','吕梁市','','吕梁市','','2','山西省','吕梁市','','山西省吕梁市',null,null,37.5176100,111.1508100),\n(97750,'141101000000','141100000000','141101','1411','市辖区','','','市辖区','3','山西省','吕梁市','市辖区','山西省吕梁市市辖区',null,null,37.5176100,111.1508100),\n(97751,'141102000000','141100000000','141102','1411','离石区','','','离石区','3','山西省','吕梁市','离石区','山西省吕梁市离石区',null,null,37.5176100,111.1508100),\n(98017,'141121000000','141100000000','141121','1411','文水县','','','文水县','3','山西省','吕梁市','文水县','山西省吕梁市文水县',null,null,37.4384300,112.0285000),\n(98233,'141122000000','141100000000','141122','1411','交城县','','','交城县','3','山西省','吕梁市','交城县','山西省吕梁市交城县',null,null,37.5516500,112.1547800),\n(98396,'141123000000','141100000000','141123','1411','兴县','','','兴县','3','山西省','吕梁市','兴县','山西省吕梁市兴县',null,null,38.4624200,111.1276000),\n(98798,'141124000000','141100000000','141124','1411','临县','','','临县','3','山西省','吕梁市','临县','山西省吕梁市临县',null,null,37.9510600,110.9920800),\n(99470,'141125000000','141100000000','141125','1411','柳林县','','','柳林县','3','山西省','吕梁市','柳林县','山西省吕梁市柳林县',null,null,37.4290200,110.8893700),\n(99747,'141126000000','141100000000','141126','1411','石楼县','','','石楼县','3','山西省','吕梁市','石楼县','山西省吕梁市石楼县',null,null,36.9985700,110.8346900),\n(99892,'141127000000','141100000000','141127','1411','岚县','','','岚县','3','山西省','吕梁市','岚县','山西省吕梁市岚县',null,null,38.2793900,111.6719500),\n(100074,'141128000000','141100000000','141128','1411','方山县','','','方山县','3','山西省','吕梁市','方山县','山西省吕梁市方山县',null,null,37.8947000,111.2439600),\n(100253,'141129000000','141100000000','141129','1411','中阳县','','','中阳县','3','山西省','吕梁市','中阳县','山西省吕梁市中阳县',null,null,37.3572000,111.1795300),\n(100361,'141130000000','141100000000','141130','1411','交口县','','','交口县','3','山西省','吕梁市','交口县','山西省吕梁市交口县',null,null,36.9821700,111.1810700),\n(100465,'141181000000','141100000000','141181','1411','孝义市','','','孝义市','3','山西省','吕梁市','孝义市','山西省吕梁市孝义市',null,null,37.1453400,111.7790300),\n(100910,'141182000000','141100000000','141182','1411','汾阳市','','','汾阳市','3','山西省','吕梁市','汾阳市','山西省吕梁市汾阳市',null,null,37.2654200,111.7877700),\n(101228,'150000000000','0','15','0','内蒙古自治区','内蒙古自治区','','','1','内蒙古自治区','','','内蒙古自治区','2018-10-23 19:10:52','admin',null,null),\n(101229,'150100000000','150000000000','1501','15','呼和浩特市','','呼和浩特市','','2','内蒙古自治区','呼和浩特市','','内蒙古自治区呼和浩特市',null,null,40.8077200,111.6229900),\n(101230,'150101000000','150100000000','150101','1501','市辖区','','','市辖区','3','内蒙古自治区','呼和浩特市','市辖区','内蒙古自治区呼和浩特市市辖区',null,null,40.8077200,111.6229900),\n(101231,'150102000000','150100000000','150102','1501','新城区','','','新城区','3','内蒙古自治区','呼和浩特市','新城区','内蒙古自治区呼和浩特市新城区',null,null,40.8584400,111.6634500),\n(101320,'150103000000','150100000000','150103','1501','回民区','','','回民区','3','内蒙古自治区','呼和浩特市','回民区','内蒙古自治区呼和浩特市回民区',null,null,40.8077200,111.6229900),\n(101392,'150104000000','150100000000','150104','1501','玉泉区','','','玉泉区','3','内蒙古自治区','呼和浩特市','玉泉区','内蒙古自治区呼和浩特市玉泉区',null,null,40.7531900,111.6754300),\n(101512,'150105000000','150100000000','150105','1501','赛罕区','','','赛罕区','3','内蒙古自治区','呼和浩特市','赛罕区','内蒙古自治区呼和浩特市赛罕区',null,null,40.7919500,111.7017100),\n(101724,'150121000000','150100000000','150121','1501','土默特左旗','','','土默特左旗','3','内蒙古自治区','呼和浩特市','土默特左旗','内蒙古自治区呼和浩特市土默特左旗',null,null,40.7295700,111.1635800),\n(102071,'150122000000','150100000000','150122','1501','托克托县','','','托克托县','3','内蒙古自治区','呼和浩特市','托克托县','内蒙古自治区呼和浩特市托克托县',null,null,40.2774400,111.1942100),\n(102215,'150123000000','150100000000','150123','1501','和林格尔县','','','和林格尔县','3','内蒙古自治区','呼和浩特市','和林格尔县','内蒙古自治区呼和浩特市和林格尔县',null,null,40.3785900,111.8208300),\n(102385,'150124000000','150100000000','150124','1501','清水河县','','','清水河县','3','内蒙古自治区','呼和浩特市','清水河县','内蒙古自治区呼和浩特市清水河县',null,null,39.9089200,111.6863900),\n(102503,'150125000000','150100000000','150125','1501','武川县','','','武川县','3','内蒙古自治区','呼和浩特市','武川县','内蒙古自治区呼和浩特市武川县',null,null,41.0965000,111.4511800),\n(102620,'150171000000','150100000000','150171','1501','呼和浩特金海工业园区','','','呼和浩特金海工业园区','3','内蒙古自治区','呼和浩特市','呼和浩特金海工业园区','内蒙古自治区呼和浩特市呼和浩特金海工业园区',null,null,40.8077010,111.6136630),\n(102623,'150172000000','150100000000','150172','1501','呼和浩特经济技术开发区','','','呼和浩特经济技术开发区','3','内蒙古自治区','呼和浩特市','呼和浩特经济技术开发区','内蒙古自治区呼和浩特市呼和浩特经济技术开发区',null,null,40.8345380,111.7557600),\n(102636,'150200000000','150000000000','1502','15','包头市','','包头市','','2','内蒙古自治区','包头市','','内蒙古自治区包头市',null,null,41.7694300,109.9737200),\n(102637,'150201000000','150200000000','150201','1502','市辖区','','','市辖区','3','内蒙古自治区','包头市','市辖区','内蒙古自治区包头市市辖区',null,null,41.7694300,109.9737200),\n(102638,'150202000000','150200000000','150202','1502','东河区','','','东河区','3','内蒙古自治区','包头市','东河区','内蒙古自治区包头市东河区',null,null,40.5764300,110.0431700),\n(102765,'150203000000','150200000000','150203','1502','昆都仑区','','','昆都仑区','3','内蒙古自治区','包头市','昆都仑区','内蒙古自治区包头市昆都仑区',null,null,40.6417800,109.8385900),\n(102886,'150204000000','150200000000','150204','1502','青山区','','','青山区','3','内蒙古自治区','包头市','青山区','内蒙古自治区包头市青山区',null,null,40.6455900,109.9024100),\n(102973,'150205000000','150200000000','150205','1502','石拐区','','','石拐区','3','内蒙古自治区','包头市','石拐区','内蒙古自治区包头市石拐区',null,null,40.6720400,110.2722700),\n(103006,'150206000000','150200000000','150206','1502','白云鄂博矿区','','','白云鄂博矿区','3','内蒙古自治区','包头市','白云鄂博矿区','内蒙古自治区包头市白云鄂博矿区',null,null,41.7694300,109.9737200),\n(103013,'150207000000','150200000000','150207','1502','九原区','','','九原区','3','内蒙古自治区','包头市','九原区','内蒙古自治区包头市九原区',null,null,40.6100900,109.9671800),\n(103100,'150221000000','150200000000','150221','1502','土默特右旗','','','土默特右旗','3','内蒙古自治区','包头市','土默特右旗','内蒙古自治区包头市土默特右旗',null,null,40.5688300,110.5242100),\n(103324,'150222000000','150200000000','150222','1502','固阳县','','','固阳县','3','内蒙古自治区','包头市','固阳县','内蒙古自治区包头市固阳县',null,null,41.0341200,110.0607000),\n(103414,'150223000000','150200000000','150223','1502','达尔罕茂明安联合旗','','','达尔罕茂明安联合旗','3','内蒙古自治区','包头市','达尔罕茂明安联合旗','内蒙古自治区包头市达尔罕茂明安联合旗',null,null,41.6985400,110.4326100),\n(103513,'150271000000','150200000000','150271','1502','包头稀土高新技术产业开发区','','','包头稀土高新技术产业开发区','3','内蒙古自治区','包头市','包头稀土高新技术产业开发区','内蒙古自治区包头市包头稀土高新技术产业开发区',null,null,40.5457380,110.1298900),\n(103565,'150300000000','150000000000','1503','15','乌海市','','乌海市','','2','内蒙古自治区','乌海市','','内蒙古自治区乌海市',null,null,39.6918400,106.8226000),\n(103566,'150301000000','150300000000','150301','1503','市辖区','','','市辖区','3','内蒙古自治区','乌海市','市辖区','内蒙古自治区乌海市市辖区',null,null,39.6918400,106.8226000),\n(103567,'150302000000','150300000000','150302','1503','海勃湾区','','','海勃湾区','3','内蒙古自治区','乌海市','海勃湾区','内蒙古自治区乌海市海勃湾区',null,null,39.6918400,106.8226000),\n(103617,'150303000000','150300000000','150303','1503','海南区','','','海南区','3','内蒙古自治区','乌海市','海南区','内蒙古自治区乌海市海南区',null,null,39.4409600,106.8915700),\n(103643,'150304000000','150300000000','150304','1503','乌达区','','','乌达区','3','内蒙古自治区','乌海市','乌达区','内蒙古自治区乌海市乌达区',null,null,39.5058000,106.7260900),\n(103677,'150400000000','150000000000','1504','15','赤峰市','','赤峰市','','2','内蒙古自治区','赤峰市','','内蒙古自治区赤峰市',null,null,42.2658100,118.9592700),\n(103678,'150401000000','150400000000','150401','1504','市辖区','','','市辖区','3','内蒙古自治区','赤峰市','市辖区','内蒙古自治区赤峰市市辖区',null,null,42.2658100,118.9592700),\n(103679,'150402000000','150400000000','150402','1504','红山区','','','红山区','3','内蒙古自治区','赤峰市','红山区','内蒙古自治区赤峰市红山区',null,null,42.2658100,118.9592700),\n(103779,'150403000000','150400000000','150403','1504','元宝山区','','','元宝山区','3','内蒙古自治区','赤峰市','元宝山区','内蒙古自治区赤峰市元宝山区',null,null,42.0388800,119.2886200),\n(103905,'150404000000','150400000000','150404','1504','松山区','','','松山区','3','内蒙古自治区','赤峰市','松山区','内蒙古自治区赤峰市松山区',null,null,42.2872700,118.9330100),\n(104230,'150421000000','150400000000','150421','1504','阿鲁科尔沁旗','','','阿鲁科尔沁旗','3','内蒙古自治区','赤峰市','阿鲁科尔沁旗','内蒙古自治区赤峰市阿鲁科尔沁旗',null,null,43.8724400,120.0655600),\n(104510,'150422000000','150400000000','150422','1504','巴林左旗','','','巴林左旗','3','内蒙古自治区','赤峰市','巴林左旗','内蒙古自治区赤峰市巴林左旗',null,null,43.9709400,119.3796100),\n(104716,'150423000000','150400000000','150423','1504','巴林右旗','','','巴林右旗','3','内蒙古自治区','赤峰市','巴林右旗','内蒙古自治区赤峰市巴林右旗',null,null,43.5339100,118.6646600),\n(104900,'150424000000','150400000000','150424','1504','林西县','','','林西县','3','内蒙古自治区','赤峰市','林西县','内蒙古自治区赤峰市林西县',null,null,43.6170200,118.0558000),\n(105028,'150425000000','150400000000','150425','1504','克什克腾旗','','','克什克腾旗','3','内蒙古自治区','赤峰市','克什克腾旗','内蒙古自治区赤峰市克什克腾旗',null,null,43.2662400,117.5442100),\n(105191,'150426000000','150400000000','150426','1504','翁牛特旗','','','翁牛特旗','3','内蒙古自治区','赤峰市','翁牛特旗','内蒙古自治区赤峰市翁牛特旗',null,null,42.9348300,119.0066900),\n(105453,'150428000000','150400000000','150428','1504','喀喇沁旗','','','喀喇沁旗','3','内蒙古自治区','赤峰市','喀喇沁旗','内蒙古自治区赤峰市喀喇沁旗',null,null,41.9271800,118.7027300),\n(105641,'150429000000','150400000000','150429','1504','宁城县','','','宁城县','3','内蒙古自治区','赤峰市','宁城县','内蒙古自治区赤峰市宁城县',null,null,41.5942600,119.3430800),\n(105997,'150430000000','150400000000','150430','1504','敖汉旗','','','敖汉旗','3','内蒙古自治区','赤峰市','敖汉旗','内蒙古自治区赤峰市敖汉旗',null,null,42.2907300,119.9216800),\n(106265,'150500000000','150000000000','1505','15','通辽市','','通辽市','','2','内蒙古自治区','通辽市','','内蒙古自治区通辽市',null,null,43.6224400,122.2561500),\n(106266,'150501000000','150500000000','150501','1505','市辖区','','','市辖区','3','内蒙古自治区','通辽市','市辖区','内蒙古自治区通辽市市辖区',null,null,43.6224400,122.2561500),\n(106267,'150502000000','150500000000','150502','1505','科尔沁区','','','科尔沁区','3','内蒙古自治区','通辽市','科尔沁区','内蒙古自治区通辽市科尔沁区',null,null,43.6224400,122.2561500),\n(106762,'150521000000','150500000000','150521','1505','科尔沁左翼中旗','','','科尔沁左翼中旗','3','内蒙古自治区','通辽市','科尔沁左翼中旗','内蒙古自治区通辽市科尔沁左翼中旗',null,null,44.1265900,123.3121600),\n(107339,'150522000000','150500000000','150522','1505','科尔沁左翼后旗','','','科尔沁左翼后旗','3','内蒙古自治区','通辽市','科尔沁左翼后旗','内蒙古自治区通辽市科尔沁左翼后旗',null,null,42.9351100,122.3567400),\n(107674,'150523000000','150500000000','150523','1505','开鲁县','','','开鲁县','3','内蒙古自治区','通辽市','开鲁县','内蒙古自治区通辽市开鲁县',null,null,43.6000500,121.3189000),\n(107961,'150524000000','150500000000','150524','1505','库伦旗','','','库伦旗','3','内蒙古自治区','通辽市','库伦旗','内蒙古自治区通辽市库伦旗',null,null,42.7350400,121.8107300),\n(108167,'150525000000','150500000000','150525','1505','奈曼旗','','','奈曼旗','3','内蒙古自治区','通辽市','奈曼旗','内蒙古自治区通辽市奈曼旗',null,null,42.8672900,120.6577900),\n(108557,'150526000000','150500000000','150526','1505','扎鲁特旗','','','扎鲁特旗','3','内蒙古自治区','通辽市','扎鲁特旗','内蒙古自治区通辽市扎鲁特旗',null,null,44.5563100,120.9115900),\n(108839,'150571000000','150500000000','150571','1505','通辽经济技术开发区','','','通辽经济技术开发区','3','内蒙古自治区','通辽市','通辽经济技术开发区','内蒙古自治区通辽市通辽经济技术开发区',null,null,43.6518330,122.2490840),\n(108924,'150581000000','150500000000','150581','1505','霍林郭勒市','','','霍林郭勒市','3','内蒙古自治区','通辽市','霍林郭勒市','内蒙古自治区通辽市霍林郭勒市',null,null,45.5314100,119.6635900),\n(108961,'150600000000','150000000000','1506','15','鄂尔多斯市','','鄂尔多斯市','','2','内蒙古自治区','鄂尔多斯市','','内蒙古自治区鄂尔多斯市',null,null,39.8212700,109.9614400),\n(108962,'150601000000','150600000000','150601','1506','市辖区','','','市辖区','3','内蒙古自治区','鄂尔多斯市','市辖区','内蒙古自治区鄂尔多斯市市辖区',null,null,39.8212700,109.9614400),\n(108963,'150602000000','150600000000','150602','1506','东胜区','','','东胜区','3','内蒙古自治区','鄂尔多斯市','东胜区','内蒙古自治区鄂尔多斯市东胜区',null,null,39.8212700,109.9614400),\n(109089,'150603000000','150600000000','150603','1506','康巴什区','','','康巴什区','3','内蒙古自治区','鄂尔多斯市','康巴什区','内蒙古自治区鄂尔多斯市康巴什区',null,null,39.6083700,109.8585100),\n(109109,'150621000000','150600000000','150621','1506','达拉特旗','','','达拉特旗','3','内蒙古自治区','鄂尔多斯市','达拉特旗','内蒙古自治区鄂尔多斯市达拉特旗',null,null,40.4001600,110.0329300),\n(109285,'150622000000','150600000000','150622','1506','准格尔旗','','','准格尔旗','3','内蒙古自治区','鄂尔多斯市','准格尔旗','内蒙古自治区鄂尔多斯市准格尔旗',null,null,39.8642600,111.2398700),\n(109493,'150623000000','150600000000','150623','1506','鄂托克前旗','','','鄂托克前旗','3','内蒙古自治区','鄂尔多斯市','鄂托克前旗','内蒙古自治区鄂尔多斯市鄂托克前旗',null,null,38.1823900,107.4774300),\n(109584,'150624000000','150600000000','150624','1506','鄂托克旗','','','鄂托克旗','3','内蒙古自治区','鄂尔多斯市','鄂托克旗','内蒙古自治区鄂尔多斯市鄂托克旗',null,null,39.0898900,107.9776000),\n(109692,'150625000000','150600000000','150625','1506','杭锦旗','','','杭锦旗','3','内蒙古自治区','鄂尔多斯市','杭锦旗','内蒙古自治区鄂尔多斯市杭锦旗',null,null,39.8335200,108.7349700),\n(109792,'150626000000','150600000000','150626','1506','乌审旗','','','乌审旗','3','内蒙古自治区','鄂尔多斯市','乌审旗','内蒙古自治区鄂尔多斯市乌审旗',null,null,38.6038800,108.8176900),\n(109874,'150627000000','150600000000','150627','1506','伊金霍洛旗','','','伊金霍洛旗','3','内蒙古自治区','鄂尔多斯市','伊金霍洛旗','内蒙古自治区鄂尔多斯市伊金霍洛旗',null,null,39.5644200,109.7481100),\n(110058,'150700000000','150000000000','1507','15','呼伦贝尔市','','呼伦贝尔市','','2','内蒙古自治区','呼伦贝尔市','','内蒙古自治区呼伦贝尔市',null,null,49.2133600,119.7357200),\n(110059,'150701000000','150700000000','150701','1507','市辖区','','','市辖区','3','内蒙古自治区','呼伦贝尔市','市辖区','内蒙古自治区呼伦贝尔市市辖区',null,null,49.2133600,119.7357200),\n(110060,'150702000000','150700000000','150702','1507','海拉尔区','','','海拉尔区','3','内蒙古自治区','呼伦贝尔市','海拉尔区','内蒙古自治区呼伦贝尔市海拉尔区',null,null,49.2133600,119.7357200),\n(110124,'150703000000','150700000000','150703','1507','扎赉诺尔区','','','扎赉诺尔区','3','内蒙古自治区','呼伦贝尔市','扎赉诺尔区','内蒙古自治区呼伦贝尔市扎赉诺尔区',null,null,49.5105400,117.6699200),\n(110152,'150721000000','150700000000','150721','1507','阿荣旗','','','阿荣旗','3','内蒙古自治区','呼伦贝尔市','阿荣旗','内蒙古自治区呼伦贝尔市阿荣旗',null,null,48.1258200,123.4594400),\n(110376,'150722000000','150700000000','150722','1507','莫力达瓦达斡尔族自治旗','','','莫力达瓦达斡尔族自治旗','3','内蒙古自治区','呼伦贝尔市','莫力达瓦达斡尔族自治旗','内蒙古自治区呼伦贝尔市莫力达瓦达斡尔族自治旗',null,null,48.4771100,124.5193600),\n(110680,'150723000000','150700000000','150723','1507','鄂伦春自治旗','','','鄂伦春自治旗','3','内蒙古自治区','呼伦贝尔市','鄂伦春自治旗','内蒙古自治区呼伦贝尔市鄂伦春自治旗',null,null,50.5915800,123.7257700),\n(110925,'150724000000','150700000000','150724','1507','鄂温克族自治旗','','','鄂温克族自治旗','3','内蒙古自治区','呼伦贝尔市','鄂温克族自治旗','内蒙古自治区呼伦贝尔市鄂温克族自治旗',null,null,49.1467800,119.7554200),\n(111008,'150725000000','150700000000','150725','1507','陈巴尔虎旗','','','陈巴尔虎旗','3','内蒙古自治区','呼伦贝尔市','陈巴尔虎旗','内蒙古自治区呼伦贝尔市陈巴尔虎旗',null,null,49.3283700,119.4242900),\n(111096,'150726000000','150700000000','150726','1507','新巴尔虎左旗','','','新巴尔虎左旗','3','内蒙古自治区','呼伦贝尔市','新巴尔虎左旗','内蒙古自治区呼伦贝尔市新巴尔虎左旗',null,null,48.2181900,118.2699500),\n(111174,'150727000000','150700000000','150727','1507','新巴尔虎右旗','','','新巴尔虎右旗','3','内蒙古自治区','呼伦贝尔市','新巴尔虎右旗','内蒙古自治区呼伦贝尔市新巴尔虎右旗',null,null,48.6719100,116.8235500),\n(111248,'150781000000','150700000000','150781','1507','满洲里市','','','满洲里市','3','内蒙古自治区','呼伦贝尔市','满洲里市','内蒙古自治区呼伦贝尔市满洲里市',null,null,49.5965500,117.3783600),\n(111289,'150782000000','150700000000','150782','1507','牙克石市','','','牙克石市','3','内蒙古自治区','呼伦贝尔市','牙克石市','内蒙古自治区呼伦贝尔市牙克石市',null,null,49.2856300,120.7117400),\n(111386,'150783000000','150700000000','150783','1507','扎兰屯市','','','扎兰屯市','3','内蒙古自治区','呼伦贝尔市','扎兰屯市','内蒙古自治区呼伦贝尔市扎兰屯市',null,null,48.0136500,122.7376100),\n(111636,'150784000000','150700000000','150784','1507','额尔古纳市','','','额尔古纳市','3','内蒙古自治区','呼伦贝尔市','额尔古纳市','内蒙古自治区呼伦贝尔市额尔古纳市',null,null,50.2431500,120.1796200),\n(111712,'150785000000','150700000000','150785','1507','根河市','','','根河市','3','内蒙古自治区','呼伦贝尔市','根河市','内蒙古自治区呼伦贝尔市根河市',null,null,50.7804600,121.5204000),\n(111747,'150800000000','150000000000','1508','15','巴彦淖尔市','','巴彦淖尔市','','2','内蒙古自治区','巴彦淖尔市','','内蒙古自治区巴彦淖尔市',null,null,40.7664500,107.3868300),\n(111748,'150801000000','150800000000','150801','1508','市辖区','','','市辖区','3','内蒙古自治区','巴彦淖尔市','市辖区','内蒙古自治区巴彦淖尔市市辖区',null,null,40.7664500,107.3868300),\n(111749,'150802000000','150800000000','150802','1508','临河区','','','临河区','3','内蒙古自治区','巴彦淖尔市','临河区','内蒙古自治区巴彦淖尔市临河区',null,null,40.7664500,107.3868300),\n(111995,'150821000000','150800000000','150821','1508','五原县','','','五原县','3','内蒙古自治区','巴彦淖尔市','五原县','内蒙古自治区巴彦淖尔市五原县',null,null,41.0887900,108.2673000),\n(112155,'150822000000','150800000000','150822','1508','磴口县','','','磴口县','3','内蒙古自治区','巴彦淖尔市','磴口县','内蒙古自治区巴彦淖尔市磴口县',null,null,40.3305600,107.0086400),\n(112272,'150823000000','150800000000','150823','1508','乌拉特前旗','','','乌拉特前旗','3','内蒙古自治区','巴彦淖尔市','乌拉特前旗','内蒙古自治区巴彦淖尔市乌拉特前旗',null,null,40.7366200,108.6522400),\n(112457,'150824000000','150800000000','150824','1508','乌拉特中旗','','','乌拉特中旗','3','内蒙古自治区','巴彦淖尔市','乌拉特中旗','内蒙古自治区巴彦淖尔市乌拉特中旗',null,null,41.5674600,108.5264700),\n(112576,'150825000000','150800000000','150825','1508','乌拉特后旗','','','乌拉特后旗','3','内蒙古自治区','巴彦淖尔市','乌拉特后旗','内蒙古自治区巴彦淖尔市乌拉特后旗',null,null,41.0841400,107.0746600),\n(112643,'150826000000','150800000000','150826','1508','杭锦后旗','','','杭锦后旗','3','内蒙古自治区','巴彦淖尔市','杭锦后旗','内蒙古自治区巴彦淖尔市杭锦后旗',null,null,40.8859400,107.1511400),\n(112789,'150900000000','150000000000','1509','15','乌兰察布市','','乌兰察布市','','2','内蒙古自治区','乌兰察布市','','内蒙古自治区乌兰察布市',null,null,40.9906000,113.1240100),\n(112790,'150901000000','150900000000','150901','1509','市辖区','','','市辖区','3','内蒙古自治区','乌兰察布市','市辖区','内蒙古自治区乌兰察布市市辖区',null,null,40.9906000,113.1240100),\n(112791,'150902000000','150900000000','150902','1509','集宁区','','','集宁区','3','内蒙古自治区','乌兰察布市','集宁区','内蒙古自治区乌兰察布市集宁区',null,null,40.9906000,113.1240100),\n(112905,'150921000000','150900000000','150921','1509','卓资县','','','卓资县','3','内蒙古自治区','乌兰察布市','卓资县','内蒙古自治区乌兰察布市卓资县',null,null,40.8941700,112.5778500),\n(113034,'150922000000','150900000000','150922','1509','化德县','','','化德县','3','内蒙古自治区','乌兰察布市','化德县','内蒙古自治区乌兰察布市化德县',null,null,41.9047900,114.0108900),\n(113144,'150923000000','150900000000','150923','1509','商都县','','','商都县','3','内蒙古自治区','乌兰察布市','商都县','内蒙古自治区乌兰察布市商都县',null,null,41.5621000,113.5771800),\n(113388,'150924000000','150900000000','150924','1509','兴和县','','','兴和县','3','内蒙古自治区','乌兰察布市','兴和县','内蒙古自治区乌兰察布市兴和县',null,null,40.8719000,113.8339600),\n(113573,'150925000000','150900000000','150925','1509','凉城县','','','凉城县','3','内蒙古自治区','乌兰察布市','凉城县','内蒙古自治区乌兰察布市凉城县',null,null,40.5316500,112.5038700),\n(113727,'150926000000','150900000000','150926','1509','察哈尔右翼前旗','','','察哈尔右翼前旗','3','内蒙古自治区','乌兰察布市','察哈尔右翼前旗','内蒙古自治区乌兰察布市察哈尔右翼前旗',null,null,40.7858500,113.2109500),\n(113873,'150927000000','150900000000','150927','1509','察哈尔右翼中旗','','','察哈尔右翼中旗','3','内蒙古自治区','乌兰察布市','察哈尔右翼中旗','内蒙古自治区乌兰察布市察哈尔右翼中旗',null,null,41.2774700,112.6354400),\n(114068,'150928000000','150900000000','150928','1509','察哈尔右翼后旗','','','察哈尔右翼后旗','3','内蒙古自治区','乌兰察布市','察哈尔右翼后旗','内蒙古自治区乌兰察布市察哈尔右翼后旗',null,null,41.4358900,113.1922200),\n(114181,'150929000000','150900000000','150929','1509','四子王旗','','','四子王旗','3','内蒙古自治区','乌兰察布市','四子王旗','内蒙古自治区乌兰察布市四子王旗',null,null,41.5331600,111.7065800),\n(114332,'150981000000','150900000000','150981','1509','丰镇市','','','丰镇市','3','内蒙古自治区','乌兰察布市','丰镇市','内蒙古自治区乌兰察布市丰镇市',null,null,40.4357400,113.1105600),\n(114457,'152200000000','150000000000','1522','15','兴安盟','','兴安盟','','2','内蒙古自治区','兴安盟','','内蒙古自治区兴安盟',null,null,46.0820800,122.0381800),\n(114458,'152201000000','152200000000','152201','1522','乌兰浩特市','','','乌兰浩特市','3','内蒙古自治区','兴安盟','乌兰浩特市','内蒙古自治区兴安盟乌兰浩特市',null,null,46.0728200,122.0931600),\n(114599,'152202000000','152200000000','152202','1522','阿尔山市','','','阿尔山市','3','内蒙古自治区','兴安盟','阿尔山市','内蒙古自治区兴安盟阿尔山市',null,null,47.1771000,119.9438100),\n(114639,'152221000000','152200000000','152221','1522','科尔沁右翼前旗','','','科尔沁右翼前旗','3','内蒙古自治区','兴安盟','科尔沁右翼前旗','内蒙古自治区兴安盟科尔沁右翼前旗',null,null,46.0795500,121.9527500),\n(114958,'152222000000','152200000000','152222','1522','科尔沁右翼中旗','','','科尔沁右翼中旗','3','内蒙古自治区','兴安盟','科尔沁右翼中旗','内蒙古自治区兴安盟科尔沁右翼中旗',null,null,45.0605600,121.4769400),\n(115201,'152223000000','152200000000','152223','1522','扎赉特旗','','','扎赉特旗','3','内蒙古自治区','兴安盟','扎赉特旗','内蒙古自治区兴安盟扎赉特旗',null,null,46.7227900,122.8998000),\n(115461,'152224000000','152200000000','152224','1522','突泉县','','','突泉县','3','内蒙古自治区','兴安盟','突泉县','内蒙古自治区兴安盟突泉县',null,null,45.3828200,121.5940800),\n(115684,'152500000000','150000000000','1525','15','锡林郭勒盟','','锡林郭勒盟','','2','内蒙古自治区','锡林郭勒盟','','内蒙古自治区锡林郭勒盟',null,null,43.9332000,116.0477500),\n(115685,'152501000000','152500000000','152501','1525','二连浩特市','','','二连浩特市','3','内蒙古自治区','锡林郭勒盟','二连浩特市','内蒙古自治区锡林郭勒盟二连浩特市',null,null,43.6430500,111.9523800),\n(115703,'152502000000','152500000000','152502','1525','锡林浩特市','','','锡林浩特市','3','内蒙古自治区','锡林郭勒盟','锡林浩特市','内蒙古自治区锡林郭勒盟锡林浩特市',null,null,43.9333900,116.0860800),\n(115823,'152522000000','152500000000','152522','1525','阿巴嘎旗','','','阿巴嘎旗','3','内蒙古自治区','锡林郭勒盟','阿巴嘎旗','内蒙古自治区锡林郭勒盟阿巴嘎旗',null,null,44.0227200,114.9503400),\n(115910,'152523000000','152500000000','152523','1525','苏尼特左旗','','','苏尼特左旗','3','内蒙古自治区','锡林郭勒盟','苏尼特左旗','内蒙古自治区锡林郭勒盟苏尼特左旗',null,null,43.8592100,113.6673700),\n(115976,'152524000000','152500000000','152524','1525','苏尼特右旗','','','苏尼特右旗','3','内蒙古自治区','锡林郭勒盟','苏尼特右旗','内蒙古自治区锡林郭勒盟苏尼特右旗',null,null,42.7469400,112.6574600),\n(116063,'152525000000','152500000000','152525','1525','东乌珠穆沁旗','','','东乌珠穆沁旗','3','内蒙古自治区','锡林郭勒盟','东乌珠穆沁旗','内蒙古自治区锡林郭勒盟东乌珠穆沁旗',null,null,45.5096000,116.9721500),\n(116150,'152526000000','152500000000','152526','1525','西乌珠穆沁旗','','','西乌珠穆沁旗','3','内蒙古自治区','锡林郭勒盟','西乌珠穆沁旗','内蒙古自治区锡林郭勒盟西乌珠穆沁旗',null,null,44.5871600,117.6089900),\n(116269,'152527000000','152500000000','152527','1525','太仆寺旗','','','太仆寺旗','3','内蒙古自治区','锡林郭勒盟','太仆寺旗','内蒙古自治区锡林郭勒盟太仆寺旗',null,null,41.8773200,115.2830500),\n(116468,'152528000000','152500000000','152528','1525','镶黄旗','','','镶黄旗','3','内蒙古自治区','锡林郭勒盟','镶黄旗','内蒙古自治区锡林郭勒盟镶黄旗',null,null,42.2323200,113.8475100),\n(116539,'152529000000','152500000000','152529','1525','正镶白旗','','','正镶白旗','3','内蒙古自治区','锡林郭勒盟','正镶白旗','内蒙古自治区锡林郭勒盟正镶白旗',null,null,42.2872200,115.0307700),\n(116633,'152530000000','152500000000','152530','1525','正蓝旗','','','正蓝旗','3','内蒙古自治区','锡林郭勒盟','正蓝旗','内蒙古自治区锡林郭勒盟正蓝旗',null,null,42.2416200,115.9923900),\n(116770,'152531000000','152500000000','152531','1525','多伦县','','','多伦县','3','内蒙古自治区','锡林郭勒盟','多伦县','内蒙古自治区锡林郭勒盟多伦县',null,null,42.2030300,116.4857100),\n(116851,'152571000000','152500000000','152571','1525','乌拉盖管委会','','','乌拉盖管委会','3','内蒙古自治区','锡林郭勒盟','乌拉盖管委会','内蒙古自治区锡林郭勒盟乌拉盖管委会',null,null,45.7113300,118.8383870),\n(116879,'152900000000','150000000000','1529','15','阿拉善盟','','阿拉善盟','','2','内蒙古自治区','阿拉善盟','','内蒙古自治区阿拉善盟',null,null,38.8515300,105.7289800),\n(116880,'152921000000','152900000000','152921','1529','阿拉善左旗','','','阿拉善左旗','3','内蒙古自治区','阿拉善盟','阿拉善左旗','内蒙古自治区阿拉善盟阿拉善左旗',null,null,38.8334300,105.6662600),\n(117072,'152922000000','152900000000','152922','1529','阿拉善右旗','','','阿拉善右旗','3','内蒙古自治区','阿拉善盟','阿拉善右旗','内蒙古自治区阿拉善盟阿拉善右旗',null,null,39.2153600,101.6671100),\n(117129,'152923000000','152900000000','152923','1529','额济纳旗','','','额济纳旗','3','内蒙古自治区','阿拉善盟','额济纳旗','内蒙古自治区阿拉善盟额济纳旗',null,null,41.9544900,101.0555200),\n(117164,'152971000000','152900000000','152971','1529','内蒙古阿拉善经济开发区','','','内蒙古阿拉善经济开发区','3','内蒙古自治区','阿拉善盟','内蒙古阿拉善经济开发区','内蒙古自治区阿拉善盟内蒙古阿拉善经济开发区',null,null,39.4216770,106.6556700),\n(117170,'210000000000','0','21','0','辽宁省','辽宁省','','','1','辽宁省','','','辽宁省','2018-10-24 09:53:53','admin',null,null),\n(117171,'210100000000','210000000000','2101','21','沈阳市','','沈阳市','','2','辽宁省','沈阳市','','辽宁省沈阳市',null,null,41.8051500,123.4698700),\n(117172,'210101000000','210100000000','210101','2101','市辖区','','','市辖区','3','辽宁省','沈阳市','市辖区','辽宁省沈阳市市辖区',null,null,41.8051500,123.4698700),\n(117173,'210102000000','210100000000','210102','2101','和平区','','','和平区','3','辽宁省','沈阳市','和平区','辽宁省沈阳市和平区',null,null,41.7897800,123.4205600),\n(117293,'210103000000','210100000000','210103','2101','沈河区','','','沈河区','3','辽宁省','沈阳市','沈河区','辽宁省沈阳市沈河区',null,null,41.7960700,123.4585200),\n(117420,'210104000000','210100000000','210104','2101','大东区','','','大东区','3','辽宁省','沈阳市','大东区','辽宁省沈阳市大东区',null,null,41.8051500,123.4698700),\n(117559,'210105000000','210100000000','210105','2101','皇姑区','','','皇姑区','3','辽宁省','沈阳市','皇姑区','辽宁省沈阳市皇姑区',null,null,41.8246500,123.4416800),\n(117699,'210106000000','210100000000','210106','2101','铁西区','','','铁西区','3','辽宁省','沈阳市','铁西区','辽宁省沈阳市铁西区',null,null,41.8028300,123.3768000),\n(117911,'210111000000','210100000000','210111','2101','苏家屯区','','','苏家屯区','3','辽宁省','沈阳市','苏家屯区','辽宁省沈阳市苏家屯区',null,null,41.6647200,123.3443200),\n(118106,'210112000000','210100000000','210112','2101','浑南区','','','浑南区','3','辽宁省','沈阳市','浑南区','辽宁省沈阳市浑南区',null,null,41.7148200,123.4497200),\n(118346,'210113000000','210100000000','210113','2101','沈北新区','','','沈北新区','3','辽宁省','沈阳市','沈北新区','辽宁省沈阳市沈北新区',null,null,41.9130300,123.5842400),\n(118558,'210114000000','210100000000','210114','2101','于洪区','','','于洪区','3','辽宁省','沈阳市','于洪区','辽宁省沈阳市于洪区',null,null,41.7940700,123.3081300),\n(118767,'210115000000','210100000000','210115','2101','辽中区','','','辽中区','3','辽宁省','沈阳市','辽中区','辽宁省沈阳市辽中区',null,null,41.5168500,122.7654900),\n(119022,'210123000000','210100000000','210123','2101','康平县','','','康平县','3','辽宁省','沈阳市','康平县','辽宁省沈阳市康平县',null,null,42.7499000,123.3534900),\n(119216,'210124000000','210100000000','210124','2101','法库县','','','法库县','3','辽宁省','沈阳市','法库县','辽宁省沈阳市法库县',null,null,42.5040300,123.4083800),\n(119478,'210181000000','210100000000','210181','2101','新民市','','','新民市','3','辽宁省','沈阳市','新民市','辽宁省沈阳市新民市',null,null,41.9976700,122.8280000),\n(119880,'210200000000','210000000000','2102','21','大连市','','大连市','','2','辽宁省','大连市','','辽宁省大连市',null,null,38.9522300,121.5255000),\n(119881,'210201000000','210200000000','210201','2102','市辖区','','','市辖区','3','辽宁省','大连市','市辖区','辽宁省大连市市辖区',null,null,38.9522300,121.5255000),\n(119882,'210202000000','210200000000','210202','2102','中山区','','','中山区','3','辽宁省','大连市','中山区','辽宁省大连市中山区',null,null,38.9186400,121.6451100),\n(119945,'210203000000','210200000000','210203','2102','西岗区','','','西岗区','3','辽宁省','大连市','西岗区','辽宁省大连市西岗区',null,null,38.9147800,121.6123400),\n(119998,'210204000000','210200000000','210204','2102','沙河口区','','','沙河口区','3','辽宁省','大连市','沙河口区','辽宁省大连市沙河口区',null,null,38.9046300,121.5945100),\n(120098,'210211000000','210200000000','210211','2102','甘井子区','','','甘井子区','3','辽宁省','大连市','甘井子区','辽宁省大连市甘井子区',null,null,38.9522300,121.5255000),\n(120359,'210212000000','210200000000','210212','2102','旅顺口区','','','旅顺口区','3','辽宁省','大连市','旅顺口区','辽宁省大连市旅顺口区',null,null,38.8512900,121.2620800),\n(120479,'210213000000','210200000000','210213','2102','金州区','','','金州区','3','辽宁省','大连市','金州区','辽宁省大连市金州区',null,null,39.0501500,121.7825900),\n(120843,'210214000000','210200000000','210214','2102','普兰店区','','','普兰店区','3','辽宁省','大连市','普兰店区','辽宁省大连市普兰店区',null,null,39.3944300,121.9632300),\n(121049,'210224000000','210200000000','210224','2102','长海县','','','长海县','3','辽宁省','大连市','长海县','辽宁省大连市长海县',null,null,39.2727600,122.5886100),\n(121085,'210281000000','210200000000','210281','2102','瓦房店市','','','瓦房店市','3','辽宁省','大连市','瓦房店市','辽宁省大连市瓦房店市',null,null,39.6264400,121.9799500),\n(121441,'210283000000','210200000000','210283','2102','庄河市','','','庄河市','3','辽宁省','大连市','庄河市','辽宁省大连市庄河市',null,null,39.6803700,122.9661100),\n(121749,'210300000000','210000000000','2103','21','鞍山市','','鞍山市','','2','辽宁省','鞍山市','','辽宁省鞍山市',null,null,41.1501300,123.0295200),\n(121750,'210301000000','210300000000','210301','2103','市辖区','','','市辖区','3','辽宁省','鞍山市','市辖区','辽宁省鞍山市市辖区',null,null,41.1501300,123.0295200),\n(121751,'210302000000','210300000000','210302','2103','铁东区','','','铁东区','3','辽宁省','鞍山市','铁东区','辽宁省鞍山市铁东区',null,null,41.0899400,122.9912000),\n(121876,'210303000000','210300000000','210303','2103','铁西区','','','铁西区','3','辽宁省','鞍山市','铁西区','辽宁省鞍山市铁西区',null,null,41.1195600,122.9693900),\n(121982,'210304000000','210300000000','210304','2103','立山区','','','立山区','3','辽宁省','鞍山市','立山区','辽宁省鞍山市立山区',null,null,41.1501300,123.0295200),\n(122113,'210311000000','210300000000','210311','2103','千山区','','','千山区','3','辽宁省','鞍山市','千山区','辽宁省鞍山市千山区',null,null,41.0646200,122.9541200),\n(122183,'210321000000','210300000000','210321','2103','台安县','','','台安县','3','辽宁省','鞍山市','台安县','辽宁省鞍山市台安县',null,null,41.4126900,122.4359100),\n(122363,'210323000000','210300000000','210323','2103','岫岩满族自治县','','','岫岩满族自治县','3','辽宁省','鞍山市','岫岩满族自治县','辽宁省鞍山市岫岩满族自治县',null,null,40.2899800,123.2817100),\n(122595,'210381000000','210300000000','210381','2103','海城市','','','海城市','3','辽宁省','鞍山市','海城市','辽宁省鞍山市海城市',null,null,40.8814500,122.6846300),\n(123042,'210400000000','210000000000','2104','21','抚顺市','','抚顺市','','2','辽宁省','抚顺市','','辽宁省抚顺市',null,null,41.8530100,124.0392300),\n(123043,'210401000000','210400000000','210401','2104','市辖区','','','市辖区','3','辽宁省','抚顺市','市辖区','辽宁省抚顺市市辖区',null,null,41.8530100,124.0392300),\n(123044,'210402000000','210400000000','210402','2104','新抚区','','','新抚区','3','辽宁省','抚顺市','新抚区','辽宁省抚顺市新抚区',null,null,41.8592800,123.8741500),\n(123129,'210403000000','210400000000','210403','2104','东洲区','','','东洲区','3','辽宁省','抚顺市','东洲区','辽宁省抚顺市东洲区',null,null,41.8530100,124.0392300),\n(123252,'210404000000','210400000000','210404','2104','望花区','','','望花区','3','辽宁省','抚顺市','望花区','辽宁省抚顺市望花区',null,null,41.8532900,123.7843900),\n(123400,'210411000000','210400000000','210411','2104','顺城区','','','顺城区','3','辽宁省','抚顺市','顺城区','辽宁省抚顺市顺城区',null,null,41.8830700,123.9451300),\n(123523,'210421000000','210400000000','210421','2104','抚顺县','','','抚顺县','3','辽宁省','抚顺市','抚顺县','辽宁省抚顺市抚顺县',null,null,41.7861600,124.1959600),\n(123629,'210422000000','210400000000','210422','2104','新宾满族自治县','','','新宾满族自治县','3','辽宁省','抚顺市','新宾满族自治县','辽宁省抚顺市新宾满族自治县',null,null,41.7337100,125.0397900),\n(123839,'210423000000','210400000000','210423','2104','清原满族自治县','','','清原满族自治县','3','辽宁省','抚顺市','清原满族自治县','辽宁省抚顺市清原满族自治县',null,null,42.1003800,124.9241100),\n(124062,'210500000000','210000000000','2105','21','本溪市','','本溪市','','2','辽宁省','本溪市','','辽宁省本溪市',null,null,41.3087700,123.8169500),\n(124063,'210501000000','210500000000','210501','2105','市辖区','','','市辖区','3','辽宁省','本溪市','市辖区','辽宁省本溪市市辖区',null,null,41.3087700,123.8169500),\n(124064,'210502000000','210500000000','210502','2105','平山区','','','平山区','3','辽宁省','本溪市','平山区','辽宁省本溪市平山区',null,null,41.2213200,123.6833800),\n(124136,'210503000000','210500000000','210503','2105','溪湖区','','','溪湖区','3','辽宁省','本溪市','溪湖区','辽宁省本溪市溪湖区',null,null,41.3291900,123.7676900),\n(124231,'210504000000','210500000000','210504','2105','明山区','','','明山区','3','辽宁省','本溪市','明山区','辽宁省本溪市明山区',null,null,41.3087700,123.8169500),\n(124323,'210505000000','210500000000','210505','2105','南芬区','','','南芬区','3','辽宁省','本溪市','南芬区','辽宁省本溪市南芬区',null,null,41.1003100,123.7450900),\n(124367,'210521000000','210500000000','210521','2105','本溪满族自治县','','','本溪满族自治县','3','辽宁省','本溪市','本溪满族自治县','辽宁省本溪市本溪满族自治县',null,null,41.3027000,124.1219300),\n(124514,'210522000000','210500000000','210522','2105','桓仁满族自治县','','','桓仁满族自治县','3','辽宁省','本溪市','桓仁满族自治县','辽宁省本溪市桓仁满族自治县',null,null,41.2670600,125.3609600),\n(124653,'210600000000','210000000000','2106','21','丹东市','','丹东市','','2','辽宁省','丹东市','','辽宁省丹东市',null,null,40.1367300,124.3958200),\n(124654,'210601000000','210600000000','210601','2106','市辖区','','','市辖区','3','辽宁省','丹东市','市辖区','辽宁省丹东市市辖区',null,null,40.1367300,124.3958200),\n(124655,'210602000000','210600000000','210602','2106','元宝区','','','元宝区','3','辽宁省','丹东市','元宝区','辽宁省丹东市元宝区',null,null,40.1367300,124.3958200),\n(124708,'210603000000','210600000000','210603','2106','振兴区','','','振兴区','3','辽宁省','丹东市','振兴区','辽宁省丹东市振兴区',null,null,40.1049500,124.3604100),\n(124809,'210604000000','210600000000','210604','2106','振安区','','','振安区','3','辽宁省','丹东市','振安区','辽宁省丹东市振安区',null,null,40.1582300,124.4282000),\n(124881,'210624000000','210600000000','210624','2106','宽甸满族自治县','','','宽甸满族自治县','3','辽宁省','丹东市','宽甸满族自治县','辽宁省丹东市宽甸满族自治县',null,null,40.7313100,124.7836600),\n(125100,'210681000000','210600000000','210681','2106','东港市','','','东港市','3','辽宁省','丹东市','东港市','辽宁省丹东市东港市',null,null,39.8617200,124.1520900),\n(125361,'210682000000','210600000000','210682','2106','凤城市','','','凤城市','3','辽宁省','丹东市','凤城市','辽宁省丹东市凤城市',null,null,40.4527900,124.0660500),\n(125621,'210700000000','210000000000','2107','21','锦州市','','锦州市','','2','辽宁省','锦州市','','辽宁省锦州市',null,null,41.1172800,121.1283400),\n(125622,'210701000000','210700000000','210701','2107','市辖区','','','市辖区','3','辽宁省','锦州市','市辖区','辽宁省锦州市市辖区',null,null,41.1172800,121.1283400),\n(125623,'210702000000','210700000000','210702','2107','古塔区','','','古塔区','3','辽宁省','锦州市','古塔区','辽宁省锦州市古塔区',null,null,41.1172800,121.1283400),\n(125701,'210703000000','210700000000','210703','2107','凌河区','','','凌河区','3','辽宁省','锦州市','凌河区','辽宁省锦州市凌河区',null,null,41.1151200,121.1512600),\n(125792,'210711000000','210700000000','210711','2107','太和区','','','太和区','3','辽宁省','锦州市','太和区','辽宁省锦州市太和区',null,null,41.1089700,121.1037800),\n(125969,'210726000000','210700000000','210726','2107','黑山县','','','黑山县','3','辽宁省','锦州市','黑山县','辽宁省锦州市黑山县',null,null,41.6939100,122.1206600),\n(126323,'210727000000','210700000000','210727','2107','义县','','','义县','3','辽宁省','锦州市','义县','辽宁省锦州市义县',null,null,41.5331100,121.2391500),\n(126595,'210781000000','210700000000','210781','2107','凌海市','','','凌海市','3','辽宁省','锦州市','凌海市','辽宁省锦州市凌海市',null,null,41.1737100,121.3577100),\n(126905,'210782000000','210700000000','210782','2107','北镇市','','','北镇市','3','辽宁省','锦州市','北镇市','辽宁省锦州市北镇市',null,null,41.5946500,121.7985400),\n(127173,'210800000000','210000000000','2108','21','营口市','','营口市','','2','辽宁省','营口市','','辽宁省营口市',null,null,40.6803800,122.3796800),\n(127174,'210801000000','210800000000','210801','2108','市辖区','','','市辖区','3','辽宁省','营口市','市辖区','辽宁省营口市市辖区',null,null,40.6803800,122.3796800),\n(127175,'210802000000','210800000000','210802','2108','站前区','','','站前区','3','辽宁省','营口市','站前区','辽宁省营口市站前区',null,null,40.6729300,122.2590100),\n(127229,'210803000000','210800000000','210803','2108','西市区','','','西市区','3','辽宁省','营口市','西市区','辽宁省营口市西市区',null,null,40.6662900,122.2064600),\n(127278,'210804000000','210800000000','210804','2108','鲅鱼圈区','','','鲅鱼圈区','3','辽宁省','营口市','鲅鱼圈区','辽宁省营口市鲅鱼圈区',null,null,40.2267500,122.1216900),\n(127379,'210811000000','210800000000','210811','2108','老边区','','','老边区','3','辽宁省','营口市','老边区','辽宁省营口市老边区',null,null,40.6803800,122.3796800),\n(127445,'210881000000','210800000000','210881','2108','盖州市','','','盖州市','3','辽宁省','营口市','盖州市','辽宁省营口市盖州市',null,null,40.4005300,122.3488000),\n(127774,'210882000000','210800000000','210882','2108','大石桥市','','','大石桥市','3','辽宁省','营口市','大石桥市','辽宁省营口市大石桥市',null,null,40.6444800,122.5091700),\n(128081,'210900000000','210000000000','2109','21','阜新市','','阜新市','','2','辽宁省','阜新市','','辽宁省阜新市',null,null,42.0133200,121.6561700),\n(128082,'210901000000','210900000000','210901','2109','市辖区','','','市辖区','3','辽宁省','阜新市','市辖区','辽宁省阜新市市辖区',null,null,42.0133200,121.6561700),\n(128083,'210902000000','210900000000','210902','2109','海州区','','','海州区','3','辽宁省','阜新市','海州区','辽宁省阜新市海州区',null,null,42.0133200,121.6561700),\n(128161,'210903000000','210900000000','210903','2109','新邱区','','','新邱区','3','辽宁省','阜新市','新邱区','辽宁省阜新市新邱区',null,null,42.0874200,121.7923200),\n(128189,'210904000000','210900000000','210904','2109','太平区','','','太平区','3','辽宁省','阜新市','太平区','辽宁省阜新市太平区',null,null,42.0107200,121.6786500),\n(128239,'210905000000','210900000000','210905','2109','清河门区','','','清河门区','3','辽宁省','阜新市','清河门区','辽宁省阜新市清河门区',null,null,41.7830600,121.4161400),\n(128274,'210911000000','210900000000','210911','2109','细河区','','','细河区','3','辽宁省','阜新市','细河区','辽宁省阜新市细河区',null,null,42.0253900,121.6800800),\n(128342,'210921000000','210900000000','210921','2109','阜新蒙古族自治县','','','阜新蒙古族自治县','3','辽宁省','阜新市','阜新蒙古族自治县','辽宁省阜新市阜新蒙古族自治县',null,null,42.0651400,121.7579100),\n(128770,'210922000000','210900000000','210922','2109','彰武县','','','彰武县','3','辽宁省','阜新市','彰武县','辽宁省阜新市彰武县',null,null,42.3864900,122.5388900),\n(128995,'211000000000','210000000000','2110','21','辽阳市','','辽阳市','','2','辽宁省','辽阳市','','辽宁省辽阳市',null,null,41.2703100,123.1742400),\n(128996,'211001000000','211000000000','211001','2110','市辖区','','','市辖区','3','辽宁省','辽阳市','市辖区','辽宁省辽阳市市辖区',null,null,41.2703100,123.1742400),\n(128997,'211002000000','211000000000','211002','2110','白塔区','','','白塔区','3','辽宁省','辽阳市','白塔区','辽宁省辽阳市白塔区',null,null,41.2703100,123.1742400),\n(129081,'211003000000','211000000000','211003','2110','文圣区','','','文圣区','3','辽宁省','辽阳市','文圣区','辽宁省辽阳市文圣区',null,null,41.2677600,123.2369900),\n(129147,'211004000000','211000000000','211004','2110','宏伟区','','','宏伟区','3','辽宁省','辽阳市','宏伟区','辽宁省辽阳市宏伟区',null,null,41.2172500,123.1963700),\n(129196,'211005000000','211000000000','211005','2110','弓长岭区','','','弓长岭区','3','辽宁省','辽阳市','弓长岭区','辽宁省辽阳市弓长岭区',null,null,41.1517100,123.4205200),\n(129235,'211011000000','211000000000','211011','2110','太子河区','','','太子河区','3','辽宁省','辽阳市','太子河区','辽宁省辽阳市太子河区',null,null,41.2922500,123.1327800),\n(129316,'211021000000','211000000000','211021','2110','辽阳县','','','辽阳县','3','辽宁省','辽阳市','辽阳县','辽宁省辽阳市辽阳县',null,null,41.2054600,123.1057800),\n(129542,'211081000000','211000000000','211081','2110','灯塔市','','','灯塔市','3','辽宁省','辽阳市','灯塔市','辽宁省辽阳市灯塔市',null,null,41.4261600,123.3393000),\n(129768,'211100000000','210000000000','2111','21','盘锦市','','盘锦市','','2','辽宁省','盘锦市','','辽宁省盘锦市',null,null,41.0024700,122.0824500),\n(129769,'211101000000','211100000000','211101','2111','市辖区','','','市辖区','3','辽宁省','盘锦市','市辖区','辽宁省盘锦市市辖区',null,null,41.0024700,122.0824500),\n(129770,'211102000000','211100000000','211102','2111','双台子区','','','双台子区','3','辽宁省','盘锦市','双台子区','辽宁省盘锦市双台子区',null,null,41.1904900,122.0601700),\n(129830,'211103000000','211100000000','211103','2111','兴隆台区','','','兴隆台区','3','辽宁省','盘锦市','兴隆台区','辽宁省盘锦市兴隆台区',null,null,41.1387600,122.1055800),\n(129965,'211104000000','211100000000','211104','2111','大洼区','','','大洼区','3','辽宁省','盘锦市','大洼区','辽宁省盘锦市大洼区',null,null,41.0024700,122.0824500),\n(130174,'211122000000','211100000000','211122','2111','盘山县','','','盘山县','3','辽宁省','盘锦市','盘山县','辽宁省盘锦市盘山县',null,null,41.2426500,121.9963000),\n(130364,'211200000000','210000000000','2112','21','铁岭市','','铁岭市','','2','辽宁省','铁岭市','','辽宁省铁岭市',null,null,42.5468200,124.1591600),\n(130365,'211201000000','211200000000','211201','2112','市辖区','','','市辖区','3','辽宁省','铁岭市','市辖区','辽宁省铁岭市市辖区',null,null,42.5468200,124.1591600),\n(130366,'211202000000','211200000000','211202','2112','银州区','','','银州区','3','辽宁省','铁岭市','银州区','辽宁省铁岭市银州区',null,null,42.2862000,123.8424100),\n(130475,'211204000000','211200000000','211204','2112','清河区','','','清河区','3','辽宁省','铁岭市','清河区','辽宁省铁岭市清河区',null,null,42.5468200,124.1591600),\n(130537,'211221000000','211200000000','211221','2112','铁岭县','','','铁岭县','3','辽宁省','铁岭市','铁岭县','辽宁省铁岭市铁岭县',null,null,42.2228400,123.7278300),\n(130786,'211223000000','211200000000','211223','2112','西丰县','','','西丰县','3','辽宁省','铁岭市','西丰县','辽宁省铁岭市西丰县',null,null,42.7383500,124.7273400),\n(130992,'211224000000','211200000000','211224','2112','昌图县','','','昌图县','3','辽宁省','铁岭市','昌图县','辽宁省铁岭市昌图县',null,null,42.7861300,124.1109200),\n(131547,'211281000000','211200000000','211281','2112','调兵山市','','','调兵山市','3','辽宁省','铁岭市','调兵山市','辽宁省铁岭市调兵山市',null,null,42.4675500,123.5669000),\n(131616,'211282000000','211200000000','211282','2112','开原市','','','开原市','3','辽宁省','铁岭市','开原市','辽宁省铁岭市开原市',null,null,42.5464500,124.0382000),\n(131931,'211300000000','210000000000','2113','21','朝阳市','','朝阳市','','2','辽宁省','朝阳市','','辽宁省朝阳市',null,null,41.5997300,120.4155500),\n(131932,'211301000000','211300000000','211301','2113','市辖区','','','市辖区','3','辽宁省','朝阳市','市辖区','辽宁省朝阳市市辖区',null,null,41.5997300,120.4155500),\n(131933,'211302000000','211300000000','211302','2113','双塔区','','','双塔区','3','辽宁省','朝阳市','双塔区','辽宁省朝阳市双塔区',null,null,41.5657000,120.4537200),\n(132056,'211303000000','211300000000','211303','2113','龙城区','','','龙城区','3','辽宁省','朝阳市','龙城区','辽宁省朝阳市龙城区',null,null,41.5997300,120.4155500),\n(132159,'211321000000','211300000000','211321','2113','朝阳县','','','朝阳县','3','辽宁省','朝阳市','朝阳县','辽宁省朝阳市朝阳县',null,null,41.3678200,120.2959200),\n(132488,'211322000000','211300000000','211322','2113','建平县','','','建平县','3','辽宁省','朝阳市','建平县','辽宁省朝阳市建平县',null,null,41.4032000,119.6439600),\n(132814,'211324000000','211300000000','211324','2113','喀喇沁左翼蒙古族自治县','','','喀喇沁左翼蒙古族自治县','3','辽宁省','朝阳市','喀喇沁左翼蒙古族自治县','辽宁省朝阳市喀喇沁左翼蒙古族自治县',null,null,41.1273800,119.7404800),\n(133043,'211381000000','211300000000','211381','2113','北票市','','','北票市','3','辽宁省','朝阳市','北票市','辽宁省朝阳市北票市',null,null,41.8008000,120.7709100),\n(133379,'211382000000','211300000000','211382','2113','凌源市','','','凌源市','3','辽宁省','朝阳市','凌源市','辽宁省朝阳市凌源市',null,null,41.2454800,119.4013400),\n(133692,'211400000000','210000000000','2114','21','葫芦岛市','','葫芦岛市','','2','辽宁省','葫芦岛市','','辽宁省葫芦岛市',null,null,40.7752600,120.8690800),\n(133693,'211401000000','211400000000','211401','2114','市辖区','','','市辖区','3','辽宁省','葫芦岛市','市辖区','辽宁省葫芦岛市市辖区',null,null,40.7752600,120.8690800),\n(133694,'211402000000','211400000000','211402','2114','连山区','','','连山区','3','辽宁省','葫芦岛市','连山区','辽宁省葫芦岛市连山区',null,null,40.7752600,120.8690800),\n(133931,'211403000000','211400000000','211403','2114','龙港区','','','龙港区','3','辽宁省','葫芦岛市','龙港区','辽宁省葫芦岛市龙港区',null,null,40.7354500,120.8939300),\n(134028,'211404000000','211400000000','211404','2114','南票区','','','南票区','3','辽宁省','葫芦岛市','南票区','辽宁省葫芦岛市南票区',null,null,41.1071400,120.7498500),\n(134213,'211421000000','211400000000','211421','2114','绥中县','','','绥中县','3','辽宁省','葫芦岛市','绥中县','辽宁省葫芦岛市绥中县',null,null,40.3256500,120.3443100),\n(134545,'211422000000','211400000000','211422','2114','建昌县','','','建昌县','3','辽宁省','葫芦岛市','建昌县','辽宁省葫芦岛市建昌县',null,null,40.8240800,119.8371500),\n(134867,'211481000000','211400000000','211481','2114','兴城市','','','兴城市','3','辽宁省','葫芦岛市','兴城市','辽宁省葫芦岛市兴城市',null,null,40.6101800,120.7561900),\n(135164,'220000000000','0','22','0','吉林省','吉林省','','','1','吉林省','','','吉林省','2018-10-24 15:56:03','admin',null,null),\n(135165,'220100000000','220000000000','2201','22','长春市','','长春市','','2','吉林省','长春市','','吉林省长春市',null,null,43.8332700,125.2884500),\n(135166,'220101000000','220100000000','220101','2201','市辖区','','','市辖区','3','吉林省','长春市','市辖区','吉林省长春市市辖区',null,null,43.8332700,125.2884500),\n(135167,'220102000000','220100000000','220102','2201','南关区','','','南关区','3','吉林省','长春市','南关区','吉林省长春市南关区',null,null,43.8641400,125.3504300),\n(135246,'220103000000','220100000000','220103','2201','宽城区','','','宽城区','3','吉林省','长春市','宽城区','吉林省长春市宽城区',null,null,43.9428800,125.3261500),\n(135410,'220104000000','220100000000','220104','2201','朝阳区','','','朝阳区','3','吉林省','长春市','朝阳区','吉林省长春市朝阳区',null,null,43.8332700,125.2884500),\n(135500,'220105000000','220100000000','220105','2201','二道区','','','二道区','3','吉林省','长春市','二道区','吉林省长春市二道区',null,null,43.8649700,125.3742700),\n(135588,'220106000000','220100000000','220106','2201','绿园区','','','绿园区','3','吉林省','长春市','绿园区','吉林省长春市绿园区',null,null,43.8804100,125.2560600),\n(135676,'220112000000','220100000000','220112','2201','双阳区','','','双阳区','3','吉林省','长春市','双阳区','吉林省长春市双阳区',null,null,43.5250300,125.6646400),\n(135838,'220113000000','220100000000','220113','2201','九台区','','','九台区','3','吉林省','长春市','九台区','吉林省长春市九台区',null,null,44.1517400,125.8394900),\n(136197,'220122000000','220100000000','220122','2201','农安县','','','农安县','3','吉林省','长春市','农安县','吉林省长春市农安县',null,null,44.4319500,125.1851200),\n(136608,'220171000000','220100000000','220171','2201','长春经济技术开发区','','','长春经济技术开发区','3','吉林省','长春市','长春经济技术开发区','吉林省长春市长春经济技术开发区',null,null,43.8790130,125.4271850),\n(136650,'220172000000','220100000000','220172','2201','长春净月高新技术产业开发区','','','长春净月高新技术产业开发区','3','吉林省','长春市','长春净月高新技术产业开发区','吉林省长春市长春净月高新技术产业开发区',null,null,43.8160480,125.4450530),\n(136704,'220173000000','220100000000','220173','2201','长春高新技术产业开发区','','','长春高新技术产业开发区','3','吉林省','长春市','长春高新技术产业开发区','吉林省长春市长春高新技术产业开发区',null,null,43.9771000,125.4145050),\n(136737,'220174000000','220100000000','220174','2201','长春汽车经济技术开发区','','','长春汽车经济技术开发区','3','吉林省','长春市','长春汽车经济技术开发区','吉林省长春市长春汽车经济技术开发区',null,null,43.8790170,125.4271850),\n(136768,'220182000000','220100000000','220182','2201','榆树市','','','榆树市','3','吉林省','长春市','榆树市','吉林省长春市榆树市',null,null,44.8398900,126.5330000),\n(137201,'220183000000','220100000000','220183','2201','德惠市','','','德惠市','3','吉林省','长春市','德惠市','吉林省长春市德惠市',null,null,44.5370900,125.7055800),\n(137532,'220200000000','220000000000','2202','22','吉林市','','吉林市','','2','吉林省','吉林市','','吉林省吉林市',null,null,43.8818700,126.5743600),\n(137533,'220201000000','220200000000','220201','2202','市辖区','','','市辖区','3','吉林省','吉林市','市辖区','吉林省吉林市市辖区',null,null,43.8818700,126.5743600),\n(137534,'220202000000','220200000000','220202','2202','昌邑区','','','昌邑区','3','吉林省','吉林市','昌邑区','吉林省吉林市昌邑区',null,null,43.8818700,126.5743600),\n(137709,'220203000000','220200000000','220203','2202','龙潭区','','','龙潭区','3','吉林省','吉林市','龙潭区','吉林省吉林市龙潭区',null,null,43.9106000,126.5622300),\n(137901,'220204000000','220200000000','220204','2202','船营区','','','船营区','3','吉林省','吉林市','船营区','吉林省吉林市船营区',null,null,43.8339500,126.5411300),\n(138031,'220211000000','220200000000','220211','2202','丰满区','','','丰满区','3','吉林省','吉林市','丰满区','吉林省吉林市丰满区',null,null,43.8214200,126.5620600),\n(138133,'220221000000','220200000000','220221','2202','永吉县','','','永吉县','3','吉林省','吉林市','永吉县','吉林省吉林市永吉县',null,null,43.6725300,126.4975400),\n(138283,'220271000000','220200000000','220271','2202','吉林经济开发区','','','吉林经济开发区','3','吉林省','吉林市','吉林经济开发区','吉林省吉林市吉林经济开发区',null,null,43.9899640,126.4692230),\n(138325,'220272000000','220200000000','220272','2202','吉林高新技术产业开发区','','','吉林高新技术产业开发区','3','吉林省','吉林市','吉林高新技术产业开发区','吉林省吉林市吉林高新技术产业开发区',null,null,43.7922970,126.6015010),\n(138358,'220273000000','220200000000','220273','2202','吉林中国新加坡食品区','','','吉林中国新加坡食品区','3','吉林省','吉林市','吉林中国新加坡食品区','吉林省吉林市吉林中国新加坡食品区',null,null,43.7250710,125.9919890),\n(138377,'220281000000','220200000000','220281','2202','蛟河市','','','蛟河市','3','吉林省','吉林市','蛟河市','吉林省吉林市蛟河市',null,null,43.7239300,127.3447700),\n(138680,'220282000000','220200000000','220282','2202','桦甸市','','','桦甸市','3','吉林省','吉林市','桦甸市','吉林省吉林市桦甸市',null,null,42.9720800,126.7462700),\n(138870,'220283000000','220200000000','220283','2202','舒兰市','','','舒兰市','3','吉林省','吉林市','舒兰市','吉林省吉林市舒兰市',null,null,44.4058600,126.9653200),\n(139134,'220284000000','220200000000','220284','2202','磐石市','','','磐石市','3','吉林省','吉林市','磐石市','吉林省吉林市磐石市',null,null,42.9466200,126.0604600),\n(139451,'220300000000','220000000000','2203','22','四平市','','四平市','','2','吉林省','四平市','','吉林省四平市',null,null,43.1620800,124.4094600),\n(139452,'220301000000','220300000000','220301','2203','市辖区','','','市辖区','3','吉林省','四平市','市辖区','吉林省四平市市辖区',null,null,43.1620800,124.4094600),\n(139453,'220302000000','220300000000','220302','2203','铁西区','','','铁西区','3','吉林省','四平市','铁西区','吉林省四平市铁西区',null,null,43.1463500,124.3451500),\n(139520,'220303000000','220300000000','220303','2203','铁东区','','','铁东区','3','吉林省','四平市','铁东区','吉林省四平市铁东区',null,null,43.1620800,124.4094600),\n(139631,'220322000000','220300000000','220322','2203','梨树县','','','梨树县','3','吉林省','四平市','梨树县','吉林省四平市梨树县',null,null,43.3071700,124.3356400),\n(140001,'220323000000','220300000000','220323','2203','伊通满族自治县','','','伊通满族自治县','3','吉林省','四平市','伊通满族自治县','吉林省四平市伊通满族自治县',null,null,43.3449400,125.3053600),\n(140223,'220381000000','220300000000','220381','2203','公主岭市','','','公主岭市','3','吉林省','四平市','公主岭市','吉林省四平市公主岭市',null,null,43.5046800,124.8228000),\n(140727,'220382000000','220300000000','220382','2203','双辽市','','','双辽市','3','吉林省','四平市','双辽市','吉林省四平市双辽市',null,null,43.5184500,123.5029600),\n(140971,'220400000000','220000000000','2204','22','辽源市','','辽源市','','2','吉林省','辽源市','','吉林省辽源市',null,null,42.9015000,125.1368200),\n(140972,'220401000000','220400000000','220401','2204','市辖区','','','市辖区','3','吉林省','辽源市','市辖区','吉林省辽源市市辖区',null,null,42.9015000,125.1368200),\n(140973,'220402000000','220400000000','220402','2204','龙山区','','','龙山区','3','吉林省','辽源市','龙山区','吉林省辽源市龙山区',null,null,42.9015000,125.1368200),\n(141030,'220403000000','220400000000','220403','2204','西安区','','','西安区','3','吉林省','辽源市','西安区','吉林省辽源市西安区',null,null,42.9268900,125.1492200),\n(141068,'220421000000','220400000000','220421','2204','东丰县','','','东丰县','3','吉林省','辽源市','东丰县','吉林省辽源市东丰县',null,null,42.6770400,125.5305600),\n(141322,'220422000000','220400000000','220422','2204','东辽县','','','东辽县','3','吉林省','辽源市','东辽县','吉林省辽源市东辽县',null,null,42.9263600,124.9916200),\n(141590,'220500000000','220000000000','2205','22','通化市','','通化市','','2','吉林省','通化市','','吉林省通化市',null,null,41.7285000,125.9551300),\n(141591,'220501000000','220500000000','220501','2205','市辖区','','','市辖区','3','吉林省','通化市','市辖区','吉林省通化市市辖区',null,null,41.7285000,125.9551300),\n(141592,'220502000000','220500000000','220502','2205','东昌区','','','东昌区','3','吉林省','通化市','东昌区','吉林省通化市东昌区',null,null,41.7285000,125.9551300),\n(141655,'220503000000','220500000000','220503','2205','二道江区','','','二道江区','3','吉林省','通化市','二道江区','吉林省通化市二道江区',null,null,41.7742000,126.0426200),\n(141703,'220521000000','220500000000','220521','2205','通化县','','','通化县','3','吉林省','通化市','通化县','吉林省通化市通化县',null,null,41.6792900,125.7594000),\n(141904,'220523000000','220500000000','220523','2205','辉南县','','','辉南县','3','吉林省','通化市','辉南县','吉林省通化市辉南县',null,null,42.6849900,126.0468700),\n(142074,'220524000000','220500000000','220524','2205','柳河县','','','柳河县','3','吉林省','通化市','柳河县','吉林省通化市柳河县',null,null,42.2847000,125.7447800),\n(142327,'220581000000','220500000000','220581','2205','梅河口市','','','梅河口市','3','吉林省','通化市','梅河口市','吉林省通化市梅河口市',null,null,42.5387300,125.7121000),\n(142682,'220582000000','220500000000','220582','2205','集安市','','','集安市','3','吉林省','通化市','集安市','吉林省通化市集安市',null,null,41.1262200,126.1926900),\n(142853,'220600000000','220000000000','2206','22','白山市','','白山市','','2','吉林省','白山市','','吉林省白山市',null,null,41.9450700,126.4170000),\n(142854,'220601000000','220600000000','220601','2206','市辖区','','','市辖区','3','吉林省','白山市','市辖区','吉林省白山市市辖区',null,null,41.9450700,126.4170000),\n(142855,'220602000000','220600000000','220602','2206','浑江区','','','浑江区','3','吉林省','白山市','浑江区','吉林省白山市浑江区',null,null,41.9450700,126.4170000),\n(142966,'220605000000','220600000000','220605','2206','江源区','','','江源区','3','吉林省','白山市','江源区','吉林省白山市江源区',null,null,42.0566500,126.5908800),\n(143068,'220621000000','220600000000','220621','2206','抚松县','','','抚松县','3','吉林省','白山市','抚松县','吉林省白山市抚松县',null,null,42.3420200,127.2803600),\n(143256,'220622000000','220600000000','220622','2206','靖宇县','','','靖宇县','3','吉林省','白山市','靖宇县','吉林省白山市靖宇县',null,null,42.3887200,126.8132900),\n(143385,'220623000000','220600000000','220623','2206','长白朝鲜族自治县','','','长白朝鲜族自治县','3','吉林省','白山市','长白朝鲜族自治县','吉林省白山市长白朝鲜族自治县',null,null,41.4199700,128.2005000),\n(143482,'220681000000','220600000000','220681','2206','临江市','','','临江市','3','吉林省','白山市','临江市','吉林省白山市临江市',null,null,41.8119300,126.9179800),\n(143606,'220700000000','220000000000','2207','22','松原市','','松原市','','2','吉林省','松原市','','吉林省松原市',null,null,45.1718500,124.8169800),\n(143607,'220701000000','220700000000','220701','2207','市辖区','','','市辖区','3','吉林省','松原市','市辖区','吉林省松原市市辖区',null,null,45.1718500,124.8169800),\n(143608,'220702000000','220700000000','220702','2207','宁江区','','','宁江区','3','吉林省','松原市','宁江区','吉林省松原市宁江区',null,null,45.1718500,124.8169800),\n(143805,'220721000000','220700000000','220721','2207','前郭尔罗斯蒙古族自治县','','','前郭尔罗斯蒙古族自治县','3','吉林省','松原市','前郭尔罗斯蒙古族自治县','吉林省松原市前郭尔罗斯蒙古族自治县',null,null,45.1173000,124.8235700),\n(144115,'220722000000','220700000000','220722','2207','长岭县','','','长岭县','3','吉林省','松原市','长岭县','吉林省松原市长岭县',null,null,44.2759100,123.9673000),\n(144400,'220723000000','220700000000','220723','2207','乾安县','','','乾安县','3','吉林省','松原市','乾安县','吉林省松原市乾安县',null,null,45.0045700,124.0279700),\n(144596,'220771000000','220700000000','220771','2207','吉林松原经济开发区','','','吉林松原经济开发区','3','吉林省','松原市','吉林松原经济开发区','吉林省松原市吉林松原经济开发区',null,null,45.1313860,124.7874600),\n(144614,'220781000000','220700000000','220781','2207','扶余市','','','扶余市','3','吉林省','松原市','扶余市','吉林省松原市扶余市',null,null,44.9901400,126.0497200),\n(145047,'220800000000','220000000000','2208','22','白城市','','白城市','','2','吉林省','白城市','','吉林省白城市',null,null,45.6216000,122.8511100),\n(145048,'220801000000','220800000000','220801','2208','市辖区','','','市辖区','3','吉林省','白城市','市辖区','吉林省白城市市辖区',null,null,45.6216000,122.8511100),\n(145049,'220802000000','220800000000','220802','2208','洮北区','','','洮北区','3','吉林省','白城市','洮北区','吉林省白城市洮北区',null,null,45.6216000,122.8511100),\n(145284,'220821000000','220800000000','220821','2208','镇赉县','','','镇赉县','3','吉林省','白城市','镇赉县','吉林省白城市镇赉县',null,null,45.8482500,123.1998700),\n(145472,'220822000000','220800000000','220822','2208','通榆县','','','通榆县','3','吉林省','白城市','通榆县','吉林省白城市通榆县',null,null,44.8129600,123.0883100),\n(145691,'220871000000','220800000000','220871','2208','吉林白城经济开发区','','','吉林白城经济开发区','3','吉林省','白城市','吉林白城经济开发区','吉林省白城市吉林白城经济开发区',null,null,45.6249160,122.9314190),\n(145718,'220881000000','220800000000','220881','2208','洮南市','','','洮南市','3','吉林省','白城市','洮南市','吉林省白城市洮南市',null,null,45.3355900,122.7863500),\n(145992,'220882000000','220800000000','220882','2208','大安市','','','大安市','3','吉林省','白城市','大安市','吉林省白城市大安市',null,null,45.5071100,124.2925200),\n(146280,'222400000000','220000000000','2224','22','延边朝鲜族自治州','','延边朝鲜族自治州','','2','吉林省','延边朝鲜族自治州','','吉林省延边朝鲜族自治州',null,null,42.8911900,129.5091000),\n(146281,'222401000000','222400000000','222401','2224','延吉市','','','延吉市','3','吉林省','延边朝鲜族自治州','延吉市','吉林省延边朝鲜族自治州延吉市',null,null,42.8910700,129.5091000),\n(146437,'222402000000','222400000000','222402','2224','图们市','','','图们市','3','吉林省','延边朝鲜族自治州','图们市','吉林省延边朝鲜族自治州图们市',null,null,42.9680500,129.8439000),\n(146516,'222403000000','222400000000','222403','2224','敦化市','','','敦化市','3','吉林省','延边朝鲜族自治州','敦化市','吉林省延边朝鲜族自治州敦化市',null,null,43.3727800,128.2310900),\n(146955,'222404000000','222400000000','222404','2224','珲春市','','','珲春市','3','吉林省','延边朝鲜族自治州','珲春市','吉林省延边朝鲜族自治州珲春市',null,null,42.8624900,130.3657700),\n(147134,'222405000000','222400000000','222405','2224','龙井市','','','龙井市','3','吉林省','延边朝鲜族自治州','龙井市','吉林省延边朝鲜族自治州龙井市',null,null,42.7658700,129.4264100),\n(147243,'222406000000','222400000000','222406','2224','和龙市','','','和龙市','3','吉林省','延边朝鲜族自治州','和龙市','吉林省延边朝鲜族自治州和龙市',null,null,42.5464100,129.0107900),\n(147386,'222424000000','222400000000','222424','2224','汪清县','','','汪清县','3','吉林省','延边朝鲜族自治州','汪清县','吉林省延边朝鲜族自治州汪清县',null,null,43.3128100,129.7712500),\n(147663,'222426000000','222400000000','222426','2224','安图县','','','安图县','3','吉林省','延边朝鲜族自治州','安图县','吉林省延边朝鲜族自治州安图县',null,null,43.1116600,128.8992000),\n(147907,'230000000000','0','23','0','黑龙江省','黑龙江省','','','1','黑龙江省','','','黑龙江省','2018-10-25 15:08:12','admin',null,null),\n(147908,'230100000000','230000000000','2301','23','哈尔滨市','','哈尔滨市','','2','黑龙江省','哈尔滨市','','黑龙江省哈尔滨市',null,null,45.5477400,126.9571700),\n(147909,'230101000000','230100000000','230101','2301','市辖区','','','市辖区','3','黑龙江省','哈尔滨市','市辖区','黑龙江省哈尔滨市市辖区',null,null,45.5477400,126.9571700),\n(147910,'230102000000','230100000000','230102','2301','道里区','','','道里区','3','黑龙江省','哈尔滨市','道里区','黑龙江省哈尔滨市道里区',null,null,45.7556700,126.6168600),\n(148110,'230103000000','230100000000','230103','2301','南岗区','','','南岗区','3','黑龙江省','哈尔滨市','南岗区','黑龙江省哈尔滨市南岗区',null,null,45.7602100,126.6683700),\n(148328,'230104000000','230100000000','230104','2301','道外区','','','道外区','3','黑龙江省','哈尔滨市','道外区','黑龙江省哈尔滨市道外区',null,null,45.7920100,126.6493200),\n(148523,'230108000000','230100000000','230108','2301','平房区','','','平房区','3','黑龙江省','哈尔滨市','平房区','黑龙江省哈尔滨市平房区',null,null,45.5979900,126.6376800),\n(148580,'230109000000','230100000000','230109','2301','松北区','','','松北区','3','黑龙江省','哈尔滨市','松北区','黑龙江省哈尔滨市松北区',null,null,45.8082500,126.5627900),\n(148682,'230110000000','230100000000','230110','2301','香坊区','','','香坊区','3','黑龙江省','哈尔滨市','香坊区','黑龙江省哈尔滨市香坊区',null,null,45.7084700,126.6628700),\n(148876,'230111000000','230100000000','230111','2301','呼兰区','','','呼兰区','3','黑龙江省','哈尔滨市','呼兰区','黑龙江省哈尔滨市呼兰区',null,null,45.8889900,126.5879600),\n(149128,'230112000000','230100000000','230112','2301','阿城区','','','阿城区','3','黑龙江省','哈尔滨市','阿城区','黑龙江省哈尔滨市阿城区',null,null,45.5477400,126.9571700),\n(149336,'230113000000','230100000000','230113','2301','双城区','','','双城区','3','黑龙江省','哈尔滨市','双城区','黑龙江省哈尔滨市双城区',null,null,45.3835500,126.3122700),\n(149647,'230123000000','230100000000','230123','2301','依兰县','','','依兰县','3','黑龙江省','哈尔滨市','依兰县','黑龙江省哈尔滨市依兰县',null,null,46.3248900,129.5685900),\n(149827,'230124000000','230100000000','230124','2301','方正县','','','方正县','3','黑龙江省','哈尔滨市','方正县','黑龙江省哈尔滨市方正县',null,null,45.8525300,128.8270700),\n(149927,'230125000000','230100000000','230125','2301','宾县','','','宾县','3','黑龙江省','哈尔滨市','宾县','黑龙江省哈尔滨市宾县',null,null,45.7586400,127.4858600),\n(150135,'230126000000','230100000000','230126','2301','巴彦县','','','巴彦县','3','黑龙江省','哈尔滨市','巴彦县','黑龙江省哈尔滨市巴彦县',null,null,46.0853600,127.4035000),\n(150291,'230127000000','230100000000','230127','2301','木兰县','','','木兰县','3','黑龙江省','哈尔滨市','木兰县','黑龙江省哈尔滨市木兰县',null,null,45.9503800,128.0439200),\n(150409,'230128000000','230100000000','230128','2301','通河县','','','通河县','3','黑龙江省','哈尔滨市','通河县','黑龙江省哈尔滨市通河县',null,null,45.9901000,128.7460700),\n(150582,'230129000000','230100000000','230129','2301','延寿县','','','延寿县','3','黑龙江省','哈尔滨市','延寿县','黑龙江省哈尔滨市延寿县',null,null,45.4519000,128.3316200),\n(150733,'230183000000','230100000000','230183','2301','尚志市','','','尚志市','3','黑龙江省','哈尔滨市','尚志市','黑龙江省哈尔滨市尚志市',null,null,45.2110200,127.9602700),\n(150983,'230184000000','230100000000','230184','2301','五常市','','','五常市','3','黑龙江省','哈尔滨市','五常市','黑龙江省哈尔滨市五常市',null,null,44.9319100,127.1674600),\n(151309,'230200000000','230000000000','2302','23','齐齐哈尔市','','齐齐哈尔市','','2','黑龙江省','齐齐哈尔市','','黑龙江省齐齐哈尔市',null,null,47.1551700,123.8223400),\n(151310,'230201000000','230200000000','230201','2302','市辖区','','','市辖区','3','黑龙江省','齐齐哈尔市','市辖区','黑龙江省齐齐哈尔市市辖区',null,null,47.1551700,123.8223400),\n(151311,'230202000000','230200000000','230202','2302','龙沙区','','','龙沙区','3','黑龙江省','齐齐哈尔市','龙沙区','黑龙江省齐齐哈尔市龙沙区',null,null,47.3174200,123.9576300),\n(151359,'230203000000','230200000000','230203','2302','建华区','','','建华区','3','黑龙江省','齐齐哈尔市','建华区','黑龙江省齐齐哈尔市建华区',null,null,47.3543400,123.9554600),\n(151404,'230204000000','230200000000','230204','2302','铁锋区','','','铁锋区','3','黑龙江省','齐齐哈尔市','铁锋区','黑龙江省齐齐哈尔市铁锋区',null,null,47.3407600,123.9780700),\n(151462,'230205000000','230200000000','230205','2302','昂昂溪区','','','昂昂溪区','3','黑龙江省','齐齐哈尔市','昂昂溪区','黑龙江省齐齐哈尔市昂昂溪区',null,null,47.1551700,123.8223400),\n(151497,'230206000000','230200000000','230206','2302','富拉尔基区','','','富拉尔基区','3','黑龙江省','齐齐哈尔市','富拉尔基区','黑龙江省齐齐哈尔市富拉尔基区',null,null,47.2089000,123.6293700),\n(151548,'230207000000','230200000000','230207','2302','碾子山区','','','碾子山区','3','黑龙江省','齐齐哈尔市','碾子山区','黑龙江省齐齐哈尔市碾子山区',null,null,47.5169800,122.8877700),\n(151569,'230208000000','230200000000','230208','2302','梅里斯达斡尔族区','','','梅里斯达斡尔族区','3','黑龙江省','齐齐哈尔市','梅里斯达斡尔族区','黑龙江省齐齐哈尔市梅里斯达斡尔族区',null,null,47.3095000,123.7528100),\n(151637,'230221000000','230200000000','230221','2302','龙江县','','','龙江县','3','黑龙江省','齐齐哈尔市','龙江县','黑龙江省齐齐哈尔市龙江县',null,null,47.3373700,123.2048300),\n(151821,'230223000000','230200000000','230223','2302','依安县','','','依安县','3','黑龙江省','齐齐哈尔市','依安县','黑龙江省齐齐哈尔市依安县',null,null,47.8934900,125.3062100),\n(152000,'230224000000','230200000000','230224','2302','泰来县','','','泰来县','3','黑龙江省','齐齐哈尔市','泰来县','黑龙江省齐齐哈尔市泰来县',null,null,46.3938900,123.4173800),\n(152129,'230225000000','230200000000','230225','2302','甘南县','','','甘南县','3','黑龙江省','齐齐哈尔市','甘南县','黑龙江省齐齐哈尔市甘南县',null,null,47.9203700,123.5062400),\n(152279,'230227000000','230200000000','230227','2302','富裕县','','','富裕县','3','黑龙江省','齐齐哈尔市','富裕县','黑龙江省齐齐哈尔市富裕县',null,null,47.7753300,124.4738700),\n(152401,'230229000000','230200000000','230229','2302','克山县','','','克山县','3','黑龙江省','齐齐哈尔市','克山县','黑龙江省齐齐哈尔市克山县',null,null,48.0369400,125.8756100),\n(152570,'230230000000','230200000000','230230','2302','克东县','','','克东县','3','黑龙江省','齐齐哈尔市','克东县','黑龙江省齐齐哈尔市克东县',null,null,48.0416700,126.2487100),\n(152704,'230231000000','230200000000','230231','2302','拜泉县','','','拜泉县','3','黑龙江省','齐齐哈尔市','拜泉县','黑龙江省齐齐哈尔市拜泉县',null,null,47.5956900,126.1000500),\n(152913,'230281000000','230200000000','230281','2302','讷河市','','','讷河市','3','黑龙江省','齐齐哈尔市','讷河市','黑龙江省齐齐哈尔市讷河市',null,null,48.4841900,124.8839700),\n(153148,'230300000000','230000000000','2303','23','鸡西市','','鸡西市','','2','黑龙江省','鸡西市','','黑龙江省鸡西市',null,null,45.3369300,131.0113600),\n(153149,'230301000000','230300000000','230301','2303','市辖区','','','市辖区','3','黑龙江省','鸡西市','市辖区','黑龙江省鸡西市市辖区',null,null,45.3369300,131.0113600),\n(153150,'230302000000','230300000000','230302','2303','鸡冠区','','','鸡冠区','3','黑龙江省','鸡西市','鸡冠区','黑龙江省鸡西市鸡冠区',null,null,45.3041200,130.9808400),\n(153217,'230303000000','230300000000','230303','2303','恒山区','','','恒山区','3','黑龙江省','鸡西市','恒山区','黑龙江省鸡西市恒山区',null,null,45.2107200,130.9049900),\n(153272,'230304000000','230300000000','230304','2303','滴道区','','','滴道区','3','黑龙江省','鸡西市','滴道区','黑龙江省鸡西市滴道区',null,null,45.3487200,130.8436700),\n(153317,'230305000000','230300000000','230305','2303','梨树区','','','梨树区','3','黑龙江省','鸡西市','梨树区','黑龙江省鸡西市梨树区',null,null,45.0920300,130.6970800),\n(153346,'230306000000','230300000000','230306','2303','城子河区','','','城子河区','3','黑龙江省','鸡西市','城子河区','黑龙江省鸡西市城子河区',null,null,45.3369300,131.0113600),\n(153387,'230307000000','230300000000','230307','2303','麻山区','','','麻山区','3','黑龙江省','鸡西市','麻山区','黑龙江省鸡西市麻山区',null,null,45.2121300,130.4781700),\n(153410,'230321000000','230300000000','230321','2303','鸡东县','','','鸡东县','3','黑龙江省','鸡西市','鸡东县','黑龙江省鸡西市鸡东县',null,null,45.2600200,131.1240800),\n(153577,'230381000000','230300000000','230381','2303','虎林市','','','虎林市','3','黑龙江省','鸡西市','虎林市','黑龙江省鸡西市虎林市',null,null,45.7626700,132.9369500),\n(153789,'230382000000','230300000000','230382','2303','密山市','','','密山市','3','黑龙江省','鸡西市','密山市','黑龙江省鸡西市密山市',null,null,45.5297500,131.8463100),\n(154039,'230400000000','230000000000','2304','23','鹤岗市','','鹤岗市','','2','黑龙江省','鹤岗市','','黑龙江省鹤岗市',null,null,47.3387200,130.3175500),\n(154040,'230401000000','230400000000','230401','2304','市辖区','','','市辖区','3','黑龙江省','鹤岗市','市辖区','黑龙江省鹤岗市市辖区',null,null,47.3387200,130.3175500),\n(154041,'230402000000','230400000000','230402','2304','向阳区','','','向阳区','3','黑龙江省','鹤岗市','向阳区','黑龙江省鹤岗市向阳区',null,null,47.3425400,130.2943000),\n(154064,'230403000000','230400000000','230403','2304','工农区','','','工农区','3','黑龙江省','鹤岗市','工农区','黑龙江省鹤岗市工农区',null,null,47.3187200,130.2748200),\n(154089,'230404000000','230400000000','230404','2304','南山区','','','南山区','3','黑龙江省','鹤岗市','南山区','黑龙江省鹤岗市南山区',null,null,47.3150600,130.2871400),\n(154114,'230405000000','230400000000','230405','2304','兴安区','','','兴安区','3','黑龙江省','鹤岗市','兴安区','黑龙江省鹤岗市兴安区',null,null,47.2528600,130.2392400),\n(154149,'230406000000','230400000000','230406','2304','东山区','','','东山区','3','黑龙江省','鹤岗市','东山区','黑龙江省鹤岗市东山区',null,null,47.3387200,130.3175500),\n(154211,'230407000000','230400000000','230407','2304','兴山区','','','兴山区','3','黑龙江省','鹤岗市','兴山区','黑龙江省鹤岗市兴山区',null,null,47.3846000,130.3330200),\n(154224,'230421000000','230400000000','230421','2304','萝北县','','','萝北县','3','黑龙江省','鹤岗市','萝北县','黑龙江省鹤岗市萝北县',null,null,47.5775200,130.8286000),\n(154414,'230422000000','230400000000','230422','2304','绥滨县','','','绥滨县','3','黑龙江省','鹤岗市','绥滨县','黑龙江省鹤岗市绥滨县',null,null,47.2890600,131.8522400),\n(154590,'230500000000','230000000000','2305','23','双鸭山市','','双鸭山市','','2','黑龙江省','双鸭山市','','黑龙江省双鸭山市',null,null,46.5772700,131.4017800),\n(154591,'230501000000','230500000000','230501','2305','市辖区','','','市辖区','3','黑龙江省','双鸭山市','市辖区','黑龙江省双鸭山市市辖区',null,null,46.5772700,131.4017800),\n(154592,'230502000000','230500000000','230502','2305','尖山区','','','尖山区','3','黑龙江省','双鸭山市','尖山区','黑龙江省双鸭山市尖山区',null,null,46.6461800,131.1584000),\n(154646,'230503000000','230500000000','230503','2305','岭东区','','','岭东区','3','黑龙江省','双鸭山市','岭东区','黑龙江省双鸭山市岭东区',null,null,46.5446400,131.1521400),\n(154685,'230505000000','230500000000','230505','2305','四方台区','','','四方台区','3','黑龙江省','双鸭山市','四方台区','黑龙江省双鸭山市四方台区',null,null,46.5942600,131.3344600),\n(154721,'230506000000','230500000000','230506','2305','宝山区','','','宝山区','3','黑龙江省','双鸭山市','宝山区','黑龙江省双鸭山市宝山区',null,null,46.5772700,131.4017800),\n(154767,'230521000000','230500000000','230521','2305','集贤县','','','集贤县','3','黑龙江省','双鸭山市','集贤县','黑龙江省双鸭山市集贤县',null,null,46.7284400,131.1411500),\n(154987,'230522000000','230500000000','230522','2305','友谊县','','','友谊县','3','黑龙江省','双鸭山市','友谊县','黑龙江省双鸭山市友谊县',null,null,46.7674300,131.8079500),\n(155087,'230523000000','230500000000','230523','2305','宝清县','','','宝清县','3','黑龙江省','双鸭山市','宝清县','黑龙江省双鸭山市宝清县',null,null,46.3269500,132.1970800),\n(155319,'230524000000','230500000000','230524','2305','饶河县','','','饶河县','3','黑龙江省','双鸭山市','饶河县','黑龙江省双鸭山市饶河县',null,null,46.7982000,134.0132400),\n(155490,'230600000000','230000000000','2306','23','大庆市','','大庆市','','2','黑龙江省','大庆市','','黑龙江省大庆市',null,null,46.0390400,124.8105600),\n(155491,'230601000000','230600000000','230601','2306','市辖区','','','市辖区','3','黑龙江省','大庆市','市辖区','黑龙江省大庆市市辖区',null,null,46.0390400,124.8105600),\n(155492,'230602000000','230600000000','230602','2306','萨尔图区','','','萨尔图区','3','黑龙江省','大庆市','萨尔图区','黑龙江省大庆市萨尔图区',null,null,46.6030200,125.0542200),\n(155560,'230603000000','230600000000','230603','2306','龙凤区','','','龙凤区','3','黑龙江省','大庆市','龙凤区','黑龙江省大庆市龙凤区',null,null,46.5618200,125.1341500),\n(155612,'230604000000','230600000000','230604','2306','让胡路区','','','让胡路区','3','黑龙江省','大庆市','让胡路区','黑龙江省大庆市让胡路区',null,null,46.6522500,124.8708300),\n(155702,'230605000000','230600000000','230605','2306','红岗区','','','红岗区','3','黑龙江省','大庆市','红岗区','黑龙江省大庆市红岗区',null,null,46.3981800,124.8908200),\n(155750,'230606000000','230600000000','230606','2306','大同区','','','大同区','3','黑龙江省','大庆市','大同区','黑龙江省大庆市大同区',null,null,46.0390400,124.8105600),\n(155848,'230621000000','230600000000','230621','2306','肇州县','','','肇州县','3','黑龙江省','大庆市','肇州县','黑龙江省大庆市肇州县',null,null,45.6988600,125.2685900),\n(155980,'230622000000','230600000000','230622','2306','肇源县','','','肇源县','3','黑龙江省','大庆市','肇源县','黑龙江省大庆市肇源县',null,null,45.5183000,125.0779500),\n(156163,'230623000000','230600000000','230623','2306','林甸县','','','林甸县','3','黑龙江省','大庆市','林甸县','黑龙江省大庆市林甸县',null,null,47.1829800,124.8713000),\n(156271,'230624000000','230600000000','230624','2306','杜尔伯特蒙古族自治县','','','杜尔伯特蒙古族自治县','3','黑龙江省','大庆市','杜尔伯特蒙古族自治县','黑龙江省大庆市杜尔伯特蒙古族自治县',null,null,46.8623100,124.4427800),\n(156390,'230671000000','230600000000','230671','2306','大庆高新技术产业开发区','','','大庆高新技术产业开发区','3','黑龙江省','大庆市','大庆高新技术产业开发区','黑龙江省大庆市大庆高新技术产业开发区',null,null,46.5597990,125.1585770),\n(156400,'230700000000','230000000000','2307','23','伊春市','','伊春市','','2','黑龙江省','伊春市','','黑龙江省伊春市',null,null,47.7258200,128.6690000),\n(156401,'230701000000','230700000000','230701','2307','市辖区','','','市辖区','3','黑龙江省','伊春市','市辖区','黑龙江省伊春市市辖区',null,null,47.7258200,128.6690000),\n(156402,'230702000000','230700000000','230702','2307','伊春区','','','伊春区','3','黑龙江省','伊春市','伊春区','黑龙江省伊春市伊春区',null,null,47.7279800,128.9074300),\n(156433,'230703000000','230700000000','230703','2307','南岔区','','','南岔区','3','黑龙江省','伊春市','南岔区','黑龙江省伊春市南岔区',null,null,47.1379900,129.2836500),\n(156522,'230704000000','230700000000','230704','2307','友好区','','','友好区','3','黑龙江省','伊春市','友好区','黑龙江省伊春市友好区',null,null,47.8538000,128.8407100),\n(156571,'230705000000','230700000000','230705','2307','西林区','','','西林区','3','黑龙江省','伊春市','西林区','黑龙江省伊春市西林区',null,null,47.4808100,129.3128600),\n(156594,'230706000000','230700000000','230706','2307','翠峦区','','','翠峦区','3','黑龙江省','伊春市','翠峦区','黑龙江省伊春市翠峦区',null,null,47.7258200,128.6690000),\n(156629,'230707000000','230700000000','230707','2307','新青区','','','新青区','3','黑龙江省','伊春市','新青区','黑龙江省伊春市新青区',null,null,48.2904500,129.5336200),\n(156670,'230708000000','230700000000','230708','2307','美溪区','','','美溪区','3','黑龙江省','伊春市','美溪区','黑龙江省伊春市美溪区',null,null,47.6350800,129.1292500),\n(156712,'230709000000','230700000000','230709','2307','金山屯区','','','金山屯区','3','黑龙江省','伊春市','金山屯区','黑龙江省伊春市金山屯区',null,null,47.4130300,129.4289900),\n(156745,'230710000000','230700000000','230710','2307','五营区','','','五营区','3','黑龙江省','伊春市','五营区','黑龙江省伊春市五营区',null,null,48.1080200,129.2453600),\n(156775,'230711000000','230700000000','230711','2307','乌马河区','','','乌马河区','3','黑龙江省','伊春市','乌马河区','黑龙江省伊春市乌马河区',null,null,47.7266900,128.8001900),\n(156817,'230712000000','230700000000','230712','2307','汤旺河区','','','汤旺河区','3','黑龙江省','伊春市','汤旺河区','黑龙江省伊春市汤旺河区',null,null,48.4546900,129.5709700),\n(156856,'230713000000','230700000000','230713','2307','带岭区','','','带岭区','3','黑龙江省','伊春市','带岭区','黑龙江省伊春市带岭区',null,null,47.0283400,129.0205700),\n(156896,'230714000000','230700000000','230714','2307','乌伊岭区','','','乌伊岭区','3','黑龙江省','伊春市','乌伊岭区','黑龙江省伊春市乌伊岭区',null,null,48.5905700,129.4377300),\n(156933,'230715000000','230700000000','230715','2307','红星区','','','红星区','3','黑龙江省','伊春市','红星区','黑龙江省伊春市红星区',null,null,48.2394100,129.3908100),\n(156962,'230716000000','230700000000','230716','2307','上甘岭区','','','上甘岭区','3','黑龙江省','伊春市','上甘岭区','黑龙江省伊春市上甘岭区',null,null,47.9746900,129.0243900),\n(156998,'230722000000','230700000000','230722','2307','嘉荫县','','','嘉荫县','3','黑龙江省','伊春市','嘉荫县','黑龙江省伊春市嘉荫县',null,null,48.8894200,130.4030800),\n(157104,'230781000000','230700000000','230781','2307','铁力市','','','铁力市','3','黑龙江省','伊春市','铁力市','黑龙江省伊春市铁力市',null,null,46.9866400,128.0324300),\n(157281,'230800000000','230000000000','2308','23','佳木斯市','','佳木斯市','','2','黑龙江省','佳木斯市','','黑龙江省佳木斯市',null,null,46.8225200,130.4036800),\n(157282,'230801000000','230800000000','230801','2308','市辖区','','','市辖区','3','黑龙江省','佳木斯市','市辖区','黑龙江省佳木斯市市辖区',null,null,46.8225200,130.4036800),\n(157283,'230803000000','230800000000','230803','2308','向阳区','','','向阳区','3','黑龙江省','佳木斯市','向阳区','黑龙江省佳木斯市向阳区',null,null,46.8077400,130.3654700),\n(157371,'230804000000','230800000000','230804','2308','前进区','','','前进区','3','黑龙江省','佳木斯市','前进区','黑龙江省佳木斯市前进区',null,null,46.8140900,130.3752500),\n(157396,'230805000000','230800000000','230805','2308','东风区','','','东风区','3','黑龙江省','佳木斯市','东风区','黑龙江省佳木斯市东风区',null,null,46.8225200,130.4036800),\n(157459,'230811000000','230800000000','230811','2308','郊区','','','郊区','3','黑龙江省','佳木斯市','郊区','黑龙江省佳木斯市郊区',null,null,46.8097500,130.3270700),\n(157640,'230822000000','230800000000','230822','2308','桦南县','','','桦南县','3','黑龙江省','佳木斯市','桦南县','黑龙江省佳木斯市桦南县',null,null,46.2392500,130.5536600),\n(157907,'230826000000','230800000000','230826','2308','桦川县','','','桦川县','3','黑龙江省','佳木斯市','桦川县','黑龙江省佳木斯市桦川县',null,null,47.0230000,130.7189800),\n(158043,'230828000000','230800000000','230828','2308','汤原县','','','汤原县','3','黑龙江省','佳木斯市','汤原县','黑龙江省佳木斯市汤原县',null,null,46.7306800,129.9049500),\n(158239,'230881000000','230800000000','230881','2308','同江市','','','同江市','3','黑龙江省','佳木斯市','同江市','黑龙江省佳木斯市同江市',null,null,47.6421300,132.5110100),\n(158418,'230882000000','230800000000','230882','2308','富锦市','','','富锦市','3','黑龙江省','佳木斯市','富锦市','黑龙江省佳木斯市富锦市',null,null,47.2502200,132.0372800),\n(158820,'230883000000','230800000000','230883','2308','抚远市','','','抚远市','3','黑龙江省','佳木斯市','抚远市','黑龙江省佳木斯市抚远市',null,null,48.3648500,134.3079500),\n(158940,'230900000000','230000000000','2309','23','七台河市','','七台河市','','2','黑龙江省','七台河市','','黑龙江省七台河市',null,null,45.7848700,131.0669300),\n(158941,'230901000000','230900000000','230901','2309','市辖区','','','市辖区','3','黑龙江省','七台河市','市辖区','黑龙江省七台河市市辖区',null,null,45.7848700,131.0669300),\n(158942,'230902000000','230900000000','230902','2309','新兴区','','','新兴区','3','黑龙江省','七台河市','新兴区','黑龙江省七台河市新兴区',null,null,45.8159700,130.9321000),\n(159037,'230903000000','230900000000','230903','2309','桃山区','','','桃山区','3','黑龙江省','七台河市','桃山区','黑龙江省七台河市桃山区',null,null,45.7655400,131.0200000),\n(159087,'230904000000','230900000000','230904','2309','茄子河区','','','茄子河区','3','黑龙江省','七台河市','茄子河区','黑龙江省七台河市茄子河区',null,null,45.7848700,131.0669300),\n(159178,'230921000000','230900000000','230921','2309','勃利县','','','勃利县','3','黑龙江省','七台河市','勃利县','黑龙江省七台河市勃利县',null,null,45.7550600,130.5914400),\n(159352,'231000000000','230000000000','2310','23','牡丹江市','','牡丹江市','','2','黑龙江省','牡丹江市','','黑龙江省牡丹江市',null,null,44.5960800,129.5917600),\n(159353,'231001000000','231000000000','231001','2310','市辖区','','','市辖区','3','黑龙江省','牡丹江市','市辖区','黑龙江省牡丹江市市辖区',null,null,44.5960800,129.5917600),\n(159354,'231002000000','231000000000','231002','2310','东安区','','','东安区','3','黑龙江省','牡丹江市','东安区','黑龙江省牡丹江市东安区',null,null,44.5812200,129.6267200),\n(159392,'231003000000','231000000000','231003','2310','阳明区','','','阳明区','3','黑龙江省','牡丹江市','阳明区','黑龙江省牡丹江市阳明区',null,null,44.5963000,129.6355900),\n(159495,'231004000000','231000000000','231004','2310','爱民区','','','爱民区','3','黑龙江省','牡丹江市','爱民区','黑龙江省牡丹江市爱民区',null,null,44.5960800,129.5917600),\n(159543,'231005000000','231000000000','231005','2310','西安区','','','西安区','3','黑龙江省','牡丹江市','西安区','黑龙江省牡丹江市西安区',null,null,44.5775000,129.6161000),\n(159628,'231025000000','231000000000','231025','2310','林口县','','','林口县','3','黑龙江省','牡丹江市','林口县','黑龙江省牡丹江市林口县',null,null,45.2778200,130.2831500),\n(159868,'231071000000','231000000000','231071','2310','牡丹江经济技术开发区','','','牡丹江经济技术开发区','3','黑龙江省','牡丹江市','牡丹江经济技术开发区','黑龙江省牡丹江市牡丹江经济技术开发区',null,null,44.5135000,129.5810240),\n(159883,'231081000000','231000000000','231081','2310','绥芬河市','','','绥芬河市','3','黑龙江省','牡丹江市','绥芬河市','黑龙江省牡丹江市绥芬河市',null,null,44.4132000,131.1501200),\n(159915,'231083000000','231000000000','231083','2310','海林市','','','海林市','3','黑龙江省','牡丹江市','海林市','黑龙江省牡丹江市海林市',null,null,44.5937800,129.3806400),\n(160146,'231084000000','231000000000','231084','2310','宁安市','','','宁安市','3','黑龙江省','牡丹江市','宁安市','黑龙江省牡丹江市宁安市',null,null,44.3401800,129.4828000),\n(160467,'231085000000','231000000000','231085','2310','穆棱市','','','穆棱市','3','黑龙江省','牡丹江市','穆棱市','黑龙江省牡丹江市穆棱市',null,null,44.9188300,130.5246800),\n(160704,'231086000000','231000000000','231086','2310','东宁市','','','东宁市','3','黑龙江省','牡丹江市','东宁市','黑龙江省牡丹江市东宁市',null,null,44.0869400,131.1246300),\n(160857,'231100000000','230000000000','2311','23','黑河市','','黑河市','','2','黑龙江省','黑河市','','黑龙江省黑河市',null,null,50.2521000,127.5004800),\n(160858,'231101000000','231100000000','231101','2311','市辖区','','','市辖区','3','黑龙江省','黑河市','市辖区','黑龙江省黑河市市辖区',null,null,50.2521000,127.5004800),\n(160859,'231102000000','231100000000','231102','2311','爱辉区','','','爱辉区','3','黑龙江省','黑河市','爱辉区','黑龙江省黑河市爱辉区',null,null,50.2521000,127.5004800),\n(161031,'231121000000','231100000000','231121','2311','嫩江县','','','嫩江县','3','黑龙江省','黑河市','嫩江县','黑龙江省黑河市嫩江县',null,null,49.1857200,125.2209400),\n(161320,'231123000000','231100000000','231123','2311','逊克县','','','逊克县','3','黑龙江省','黑河市','逊克县','黑龙江省黑河市逊克县',null,null,49.5643700,128.4787100),\n(161435,'231124000000','231100000000','231124','2311','孙吴县','','','孙吴县','3','黑龙江省','黑河市','孙吴县','黑龙江省黑河市孙吴县',null,null,49.4254300,127.3360500),\n(161573,'231181000000','231100000000','231181','2311','北安市','','','北安市','3','黑龙江省','黑河市','北安市','黑龙江省黑河市北安市',null,null,48.2414600,126.4910800),\n(161740,'231182000000','231100000000','231182','2311','五大连池市','','','五大连池市','3','黑龙江省','黑河市','五大连池市','黑龙江省黑河市五大连池市',null,null,48.5164900,126.2045100),\n(161983,'231200000000','230000000000','2312','23','绥化市','','绥化市','','2','黑龙江省','绥化市','','黑龙江省绥化市',null,null,46.6373000,126.9856600),\n(161984,'231201000000','231200000000','231201','2312','市辖区','','','市辖区','3','黑龙江省','绥化市','市辖区','黑龙江省绥化市市辖区',null,null,46.6373000,126.9856600),\n(161985,'231202000000','231200000000','231202','2312','北林区','','','北林区','3','黑龙江省','绥化市','北林区','黑龙江省绥化市北林区',null,null,46.6373000,126.9856600),\n(162215,'231221000000','231200000000','231221','2312','望奎县','','','望奎县','3','黑龙江省','绥化市','望奎县','黑龙江省绥化市望奎县',null,null,46.8328100,126.4860200),\n(162368,'231222000000','231200000000','231222','2312','兰西县','','','兰西县','3','黑龙江省','绥化市','兰西县','黑龙江省绥化市兰西县',null,null,46.2524100,126.2878800),\n(162511,'231223000000','231200000000','231223','2312','青冈县','','','青冈县','3','黑龙江省','绥化市','青冈县','黑龙江省绥化市青冈县',null,null,46.6896600,126.1138700),\n(162718,'231224000000','231200000000','231224','2312','庆安县','','','庆安县','3','黑龙江省','绥化市','庆安县','黑龙江省绥化市庆安县',null,null,46.8802000,127.5075800),\n(162849,'231225000000','231200000000','231225','2312','明水县','','','明水县','3','黑龙江省','绥化市','明水县','黑龙江省绥化市明水县',null,null,47.1733200,125.9060000),\n(162991,'231226000000','231200000000','231226','2312','绥棱县','','','绥棱县','3','黑龙江省','绥化市','绥棱县','黑龙江省绥化市绥棱县',null,null,47.2360900,127.1147800),\n(163157,'231281000000','231200000000','231281','2312','安达市','','','安达市','3','黑龙江省','绥化市','安达市','黑龙江省绥化市安达市',null,null,46.4177300,125.3437900),\n(163327,'231282000000','231200000000','231282','2312','肇东市','','','肇东市','3','黑龙江省','绥化市','肇东市','黑龙江省绥化市肇东市',null,null,46.0512100,125.9625000),\n(163579,'231283000000','231200000000','231283','2312','海伦市','','','海伦市','3','黑龙江省','绥化市','海伦市','黑龙江省绥化市海伦市',null,null,47.4621000,126.9733800),\n(163904,'232700000000','230000000000','2327','23','大兴安岭地区','','大兴安岭地区','','2','黑龙江省','大兴安岭地区','','黑龙江省大兴安岭地区',null,null,51.9239800,124.5921600),\n(163905,'232701000000','232700000000','232701','2327','加格达奇区','','','加格达奇区','3','黑龙江省','大兴安岭地区','加格达奇区','黑龙江省大兴安岭地区加格达奇区',null,null,50.5915800,123.7257700),\n(163955,'232702000000','232700000000','232702','2327','松岭区','','','松岭区','3','黑龙江省','大兴安岭地区','松岭区','黑龙江省大兴安岭地区松岭区',null,null,51.9239800,124.5921600),\n(163965,'232703000000','232700000000','232703','2327','新林区','','','新林区','3','黑龙江省','大兴安岭地区','新林区','黑龙江省大兴安岭地区新林区',null,null,51.9239800,124.5921600),\n(163981,'232704000000','232700000000','232704','2327','呼中区','','','呼中区','3','黑龙江省','大兴安岭地区','呼中区','黑龙江省大兴安岭地区呼中区',null,null,51.9239800,124.5921600),\n(163991,'232721000000','232700000000','232721','2327','呼玛县','','','呼玛县','3','黑龙江省','大兴安岭地区','呼玛县','黑龙江省大兴安岭地区呼玛县',null,null,51.7260600,126.6529100),\n(164059,'232722000000','232700000000','232722','2327','塔河县','','','塔河县','3','黑龙江省','大兴安岭地区','塔河县','黑龙江省大兴安岭地区塔河县',null,null,52.3343200,124.7100300),\n(164093,'232723000000','232700000000','232723','2327','漠河县','','','漠河县','3','黑龙江省','大兴安岭地区','漠河县','黑龙江省大兴安岭地区漠河县',null,null,52.9720900,122.5386400),\n(164131,'310000000000','0','31','0','上海市','上海市','','','1','上海市','','','上海市',null,null,31.4052700,121.4894100),\n(164132,'310100000000','310000000000','3101','31','市辖区','','市辖区','','2','上海市','市辖区','','上海市市辖区',null,null,31.4052700,121.4894100),\n(164133,'310101000000','310100000000','310101','3101','黄浦区','','','黄浦区','3','上海市','市辖区','黄浦区','上海市市辖区黄浦区',null,null,31.2316200,121.4846100),\n(164327,'310104000000','310100000000','310104','3101','徐汇区','','','徐汇区','3','上海市','市辖区','徐汇区','上海市市辖区徐汇区',null,null,31.1882600,121.4368700),\n(164648,'310105000000','310100000000','310105','3101','长宁区','','','长宁区','3','上海市','市辖区','长宁区','上海市市辖区长宁区',null,null,31.2202400,121.4239400),\n(164844,'310106000000','310100000000','310106','3101','静安区','','','静安区','3','上海市','市辖区','静安区','上海市市辖区静安区',null,null,31.2235200,121.4559100),\n(165135,'310107000000','310100000000','310107','3101','普陀区','','','普陀区','3','上海市','市辖区','普陀区','上海市市辖区普陀区',null,null,31.2494000,121.3970000),\n(165410,'310109000000','310100000000','310109','3101','虹口区','','','虹口区','3','上海市','市辖区','虹口区','上海市市辖区虹口区',null,null,31.2645100,121.5051500),\n(165632,'310110000000','310100000000','310110','3101','杨浦区','','','杨浦区','3','上海市','市辖区','杨浦区','上海市市辖区杨浦区',null,null,31.2595600,121.5260900),\n(165958,'310112000000','310100000000','310112','3101','闵行区','','','闵行区','3','上海市','市辖区','闵行区','上海市市辖区闵行区',null,null,31.1132500,121.3820600),\n(166536,'310113000000','310100000000','310113','3101','宝山区','','','宝山区','3','上海市','市辖区','宝山区','上海市市辖区宝山区',null,null,31.4052700,121.4894100),\n(167026,'310114000000','310100000000','310114','3101','嘉定区','','','嘉定区','3','上海市','市辖区','嘉定区','上海市市辖区嘉定区',null,null,31.3748200,121.2662100),\n(167380,'310115000000','310100000000','310115','3101','浦东新区','','','浦东新区','3','上海市','市辖区','浦东新区','上海市市辖区浦东新区',null,null,31.2211400,121.5440900),\n(168722,'310116000000','310100000000','310116','3101','金山区','','','金山区','3','上海市','市辖区','金山区','上海市市辖区金山区',null,null,30.7418500,121.3424200),\n(168957,'310117000000','310100000000','310117','3101','松江区','','','松江区','3','上海市','市辖区','松江区','上海市市辖区松江区',null,null,31.0324100,121.2265400),\n(169315,'310118000000','310100000000','310118','3101','青浦区','','','青浦区','3','上海市','市辖区','青浦区','上海市市辖区青浦区',null,null,31.1497900,121.1242600),\n(169630,'310120000000','310100000000','310120','3101','奉贤区','','','奉贤区','3','上海市','市辖区','奉贤区','上海市市辖区奉贤区',null,null,30.9180300,121.4741000),\n(169937,'310151000000','310100000000','310151','3101','崇明区','','','崇明区','3','上海市','市辖区','崇明区','上海市市辖区崇明区',null,null,31.6229000,121.3973000),\n(170308,'320000000000','0','32','0','江苏省','江苏省','','','1','江苏省','','','江苏省',null,null,null,null),\n(170309,'320100000000','320000000000','3201','32','南京市','','南京市','','2','江苏省','南京市','','江苏省南京市',null,null,31.3275100,118.8921000),\n(170310,'320101000000','320100000000','320101','3201','市辖区','','','市辖区','3','江苏省','南京市','市辖区','江苏省南京市市辖区',null,null,31.3275100,118.8921000),\n(170311,'320102000000','320100000000','320102','3201','玄武区','','','玄武区','3','江苏省','南京市','玄武区','江苏省南京市玄武区',null,null,32.0483500,118.7980900),\n(170378,'320104000000','320100000000','320104','3201','秦淮区','','','秦淮区','3','江苏省','南京市','秦淮区','江苏省南京市秦淮区',null,null,32.0389900,118.7945000),\n(170502,'320105000000','320100000000','320105','3201','建邺区','','','建邺区','3','江苏省','南京市','建邺区','江苏省南京市建邺区',null,null,32.0033500,118.7314500),\n(170574,'320106000000','320100000000','320106','3201','鼓楼区','','','鼓楼区','3','江苏省','南京市','鼓楼区','江苏省南京市鼓楼区',null,null,32.0663900,118.7701300),\n(170711,'320111000000','320100000000','320111','3201','浦口区','','','浦口区','3','江苏省','南京市','浦口区','江苏省南京市浦口区',null,null,32.0590000,118.6284100),\n(170849,'320113000000','320100000000','320113','3201','栖霞区','','','栖霞区','3','江苏省','南京市','栖霞区','江苏省南京市栖霞区',null,null,32.0963600,118.9090700),\n(171005,'320114000000','320100000000','320114','3201','雨花台区','','','雨花台区','3','江苏省','南京市','雨花台区','江苏省南京市雨花台区',null,null,31.9922600,118.7787000),\n(171105,'320115000000','320100000000','320115','3201','江宁区','','','江宁区','3','江苏省','南京市','江宁区','江苏省南京市江宁区',null,null,31.9526600,118.8400200),\n(171326,'320116000000','320100000000','320116','3201','六合区','','','六合区','3','江苏省','南京市','六合区','江苏省南京市六合区',null,null,32.3222200,118.8215500),\n(171497,'320117000000','320100000000','320117','3201','溧水区','','','溧水区','3','江苏省','南京市','溧水区','江苏省南京市溧水区',null,null,31.6510000,119.0284000),\n(171619,'320118000000','320100000000','320118','3201','高淳区','','','高淳区','3','江苏省','南京市','高淳区','江苏省南京市高淳区',null,null,31.3275100,118.8921000),\n(171778,'320200000000','320000000000','3202','32','无锡市','','无锡市','','2','江苏省','无锡市','','江苏省无锡市',null,null,31.5285300,120.2842900),\n(171779,'320201000000','320200000000','320201','3202','市辖区','','','市辖区','3','江苏省','无锡市','市辖区','江苏省无锡市市辖区',null,null,31.5285300,120.2842900),\n(171780,'320205000000','320200000000','320205','3202','锡山区','','','锡山区','3','江苏省','无锡市','锡山区','江苏省无锡市锡山区',null,null,31.5884900,120.3576100),\n(171912,'320206000000','320200000000','320206','3202','惠山区','','','惠山区','3','江苏省','无锡市','惠山区','江苏省无锡市惠山区',null,null,31.6809600,120.2983400),\n(172037,'320211000000','320200000000','320211','3202','滨湖区','','','滨湖区','3','江苏省','无锡市','滨湖区','江苏省无锡市滨湖区',null,null,31.5285300,120.2842900),\n(172161,'320213000000','320200000000','320213','3202','梁溪区','','','梁溪区','3','江苏省','无锡市','梁溪区','江苏省无锡市梁溪区',null,null,31.5659700,120.3029700),\n(172338,'320214000000','320200000000','320214','3202','新吴区','','','新吴区','3','江苏省','无锡市','新吴区','江苏省无锡市新吴区',null,null,31.4905500,120.3643400),\n(172482,'320281000000','320200000000','320281','3202','江阴市','','','江阴市','3','江苏省','无锡市','江阴市','江苏省无锡市江阴市',null,null,31.9191900,120.2843200),\n(172811,'320282000000','320200000000','320282','3202','宜兴市','','','宜兴市','3','江苏省','无锡市','宜兴市','江苏省无锡市宜兴市',null,null,31.3404200,119.8234600),\n(173144,'320300000000','320000000000','3203','32','徐州市','','徐州市','','2','江苏省','徐州市','','江苏省徐州市',null,null,34.2882300,117.1855400),\n(173145,'320301000000','320300000000','320301','3203','市辖区','','','市辖区','3','江苏省','徐州市','市辖区','江苏省徐州市市辖区',null,null,34.2882300,117.1855400),\n(173146,'320302000000','320300000000','320302','3203','鼓楼区','','','鼓楼区','3','江苏省','徐州市','鼓楼区','江苏省徐州市鼓楼区',null,null,34.2882300,117.1855400),\n(173221,'320303000000','320300000000','320303','3203','云龙区','','','云龙区','3','江苏省','徐州市','云龙区','江苏省徐州市云龙区',null,null,34.2490000,117.2294200),\n(173310,'320305000000','320300000000','320305','3203','贾汪区','','','贾汪区','3','江苏省','徐州市','贾汪区','江苏省徐州市贾汪区',null,null,34.4430800,117.4535300),\n(173473,'320311000000','320300000000','320311','3203','泉山区','','','泉山区','3','江苏省','徐州市','泉山区','江苏省徐州市泉山区',null,null,34.2442200,117.1938300),\n(173610,'320312000000','320300000000','320312','3203','铜山区','','','铜山区','3','江苏省','徐州市','铜山区','江苏省徐州市铜山区',null,null,34.1804400,117.1689800),\n(173965,'320321000000','320300000000','320321','3203','丰县','','','丰县','3','江苏省','徐州市','丰县','江苏省徐州市丰县',null,null,34.6939600,116.5953200),\n(174395,'320322000000','320300000000','320322','3203','沛县','','','沛县','3','江苏省','徐州市','沛县','江苏省徐州市沛县',null,null,34.7216600,116.9375000),\n(174810,'320324000000','320300000000','320324','3203','睢宁县','','','睢宁县','3','江苏省','徐州市','睢宁县','江苏省徐州市睢宁县',null,null,33.9127400,117.9410800),\n(175233,'320371000000','320300000000','320371','3203','徐州经济技术开发区','','','徐州经济技术开发区','3','江苏省','徐州市','徐州经济技术开发区','江苏省徐州市徐州经济技术开发区',null,null,34.2885700,117.2459560),\n(175317,'320381000000','320300000000','320381','3203','新沂市','','','新沂市','3','江苏省','徐州市','新沂市','江苏省徐州市新沂市',null,null,34.3692700,118.3554800),\n(175624,'320382000000','320300000000','320382','3203','邳州市','','','邳州市','3','江苏省','徐州市','邳州市','江苏省徐州市邳州市',null,null,34.3352000,118.0124600),\n(176154,'320400000000','320000000000','3204','32','常州市','','常州市','','2','江苏省','常州市','','江苏省常州市',null,null,31.7232200,119.5979400),\n(176155,'320401000000','320400000000','320401','3204','市辖区','','','市辖区','3','江苏省','常州市','市辖区','江苏省常州市市辖区',null,null,31.7232200,119.5979400),\n(176156,'320402000000','320400000000','320402','3204','天宁区','','','天宁区','3','江苏省','常州市','天宁区','江苏省常州市天宁区',null,null,31.7797300,119.9747200),\n(176294,'320404000000','320400000000','320404','3204','钟楼区','','','钟楼区','3','江苏省','常州市','钟楼区','江苏省常州市钟楼区',null,null,31.8016400,119.9014300),\n(176408,'320411000000','320400000000','320411','3204','新北区','','','新北区','3','江苏省','常州市','新北区','江苏省常州市新北区',null,null,31.8305200,119.9714700),\n(176556,'320412000000','320400000000','320412','3204','武进区','','','武进区','3','江苏省','常州市','武进区','江苏省常州市武进区',null,null,31.7016500,119.9431100),\n(176869,'320413000000','320400000000','320413','3204','金坛区','','','金坛区','3','江苏省','常州市','金坛区','江苏省常州市金坛区',null,null,31.7232200,119.5979400),\n(177030,'320481000000','320400000000','320481','3204','溧阳市','','','溧阳市','3','江苏省','常州市','溧阳市','江苏省常州市溧阳市',null,null,31.4158600,119.4846000),\n(177286,'320500000000','320000000000','3205','32','苏州市','','苏州市','','2','江苏省','苏州市','','江苏省苏州市',null,null,31.3022700,120.6313200),\n(177287,'320501000000','320500000000','320501','3205','市辖区','','','市辖区','3','江苏省','苏州市','市辖区','江苏省苏州市市辖区',null,null,31.3022700,120.6313200),\n(177288,'320505000000','320500000000','320505','3205','虎丘区','','','虎丘区','3','江苏省','苏州市','虎丘区','江苏省苏州市虎丘区',null,null,31.2957900,120.5718600),\n(177395,'320506000000','320500000000','320506','3205','吴中区','','','吴中区','3','江苏省','苏州市','吴中区','江苏省苏州市吴中区',null,null,31.2624900,120.6321200),\n(177614,'320507000000','320500000000','320507','3205','相城区','','','相城区','3','江苏省','苏州市','相城区','江苏省苏州市相城区',null,null,31.3689700,120.6424700),\n(177772,'320508000000','320500000000','320508','3205','姑苏区','','','姑苏区','3','江苏省','苏州市','姑苏区','江苏省苏州市姑苏区',null,null,31.3022700,120.6313200),\n(177955,'320509000000','320500000000','320509','3205','吴江区','','','吴江区','3','江苏省','苏州市','吴江区','江苏省苏州市吴江区',null,null,31.1376200,120.6450400),\n(178286,'320571000000','320500000000','320571','3205','苏州工业园区','','','苏州工业园区','3','江苏省','苏州市','苏州工业园区','江苏省苏州市苏州工业园区',null,null,31.2763230,120.7690890),\n(178438,'320581000000','320500000000','320581','3205','常熟市','','','常熟市','3','江苏省','苏州市','常熟市','江苏省苏州市常熟市',null,null,31.6538100,120.7522400),\n(178799,'320582000000','320500000000','320582','3205','张家港市','','','张家港市','3','江苏省','苏州市','张家港市','江苏省苏州市张家港市',null,null,31.8754700,120.5555000),\n(179115,'320583000000','320500000000','320583','3205','昆山市','','','昆山市','3','江苏省','苏州市','昆山市','江苏省苏州市昆山市',null,null,31.3847500,120.9818100),\n(179474,'320585000000','320500000000','320585','3205','太仓市','','','太仓市','3','江苏省','苏州市','太仓市','江苏省苏州市太仓市',null,null,31.4591100,121.1297500),\n(179635,'320600000000','320000000000','3206','32','南通市','','南通市','','2','江苏省','南通市','','江苏省南通市',null,null,32.0098600,120.8573700),\n(179636,'320601000000','320600000000','320601','3206','市辖区','','','市辖区','3','江苏省','南通市','市辖区','江苏省南通市市辖区',null,null,32.0098600,120.8573700),\n(179637,'320602000000','320600000000','320602','3206','崇川区','','','崇川区','3','江苏省','南通市','崇川区','江苏省南通市崇川区',null,null,32.0098600,120.8573700),\n(179755,'320611000000','320600000000','320611','3206','港闸区','','','港闸区','3','江苏省','南通市','港闸区','江苏省南通市港闸区',null,null,32.0314100,120.8181300),\n(179836,'320612000000','320600000000','320612','3206','通州区','','','通州区','3','江苏省','南通市','通州区','江苏省南通市通州区',null,null,32.0676400,121.0729900),\n(180132,'320621000000','320600000000','320621','3206','海安县','','','海安县','3','江苏省','南通市','海安县','江苏省南通市海安县',null,null,32.5330800,120.4675900),\n(180382,'320623000000','320600000000','320623','3206','如东县','','','如东县','3','江苏省','南通市','如东县','江苏省南通市如东县',null,null,32.3295600,121.1850200),\n(180663,'320671000000','320600000000','320671','3206','南通经济技术开发区','','','南通经济技术开发区','3','江苏省','南通市','南通经济技术开发区','江苏省南通市南通经济技术开发区',null,null,31.9247090,120.9574890),\n(180713,'320681000000','320600000000','320681','3206','启东市','','','启东市','3','江苏省','南通市','启东市','江苏省南通市启东市',null,null,31.8080500,121.6578700),\n(181058,'320682000000','320600000000','320682','3206','如皋市','','','如皋市','3','江苏省','南通市','如皋市','江苏省南通市如皋市',null,null,32.3716000,120.5738200),\n(181436,'320684000000','320600000000','320684','3206','海门市','','','海门市','3','江苏省','南通市','海门市','江苏省南通市海门市',null,null,31.8716500,121.1817900),\n(181766,'320700000000','320000000000','3207','32','连云港市','','连云港市','','2','江苏省','连云港市','','江苏省连云港市',null,null,34.8406500,119.1773000),\n(181767,'320701000000','320700000000','320701','3207','市辖区','','','市辖区','3','江苏省','连云港市','市辖区','江苏省连云港市市辖区',null,null,34.8406500,119.1773000),\n(181768,'320703000000','320700000000','320703','3207','连云区','','','连云区','3','江苏省','连云港市','连云区','江苏省连云港市连云区',null,null,34.7597400,119.3389400),\n(181852,'320706000000','320700000000','320706','3207','海州区','','','海州区','3','江苏省','连云港市','海州区','江苏省连云港市海州区',null,null,34.5720300,119.1634800),\n(182070,'320707000000','320700000000','320707','3207','赣榆区','','','赣榆区','3','江苏省','连云港市','赣榆区','江苏省连云港市赣榆区',null,null,34.8406500,119.1773000),\n(182560,'320722000000','320700000000','320722','3207','东海县','','','东海县','3','江苏省','连云港市','东海县','江苏省连云港市东海县',null,null,34.5421600,118.7714700),\n(182910,'320723000000','320700000000','320723','3207','灌云县','','','灌云县','3','江苏省','连云港市','灌云县','江苏省连云港市灌云县',null,null,34.2840700,119.2409600),\n(183267,'320724000000','320700000000','320724','3207','灌南县','','','灌南县','3','江苏省','连云港市','灌南县','江苏省连云港市灌南县',null,null,34.0867300,119.3156300),\n(183517,'320771000000','320700000000','320771','3207','连云港经济技术开发区','','','连云港经济技术开发区','3','江苏省','连云港市','连云港经济技术开发区','江苏省连云港市连云港经济技术开发区',null,null,34.6930730,119.2371520),\n(183558,'320772000000','320700000000','320772','3207','连云港高新技术产业开发区','','','连云港高新技术产业开发区','3','江苏省','连云港市','连云港高新技术产业开发区','江苏省连云港市连云港高新技术产业开发区',null,null,34.6044540,119.2327420),\n(183589,'320800000000','320000000000','3208','32','淮安市','','淮安市','','2','江苏省','淮安市','','江苏省淮安市',null,null,33.2943300,118.8735000),\n(183590,'320801000000','320800000000','320801','3208','市辖区','','','市辖区','3','江苏省','淮安市','市辖区','江苏省淮安市市辖区',null,null,33.2943300,118.8735000),\n(183591,'320803000000','320800000000','320803','3208','淮安区','','','淮安区','3','江苏省','淮安市','淮安区','江苏省淮安市淮安区',null,null,33.5030600,119.1410800),\n(183963,'320804000000','320800000000','320804','3208','淮阴区','','','淮阴区','3','江苏省','淮安市','淮阴区','江苏省淮安市淮阴区',null,null,33.6317500,119.0349000),\n(184247,'320812000000','320800000000','320812','3208','清江浦区','','','清江浦区','3','江苏省','淮安市','清江浦区','江苏省淮安市清江浦区',null,null,33.5530800,119.0266200),\n(184393,'320813000000','320800000000','320813','3208','洪泽区','','','洪泽区','3','江苏省','淮安市','洪泽区','江苏省淮安市洪泽区',null,null,33.2943300,118.8735000),\n(184527,'320826000000','320800000000','320826','3208','涟水县','','','涟水县','3','江苏省','淮安市','涟水县','江苏省淮安市涟水县',null,null,33.7809800,119.2608900),\n(184938,'320830000000','320800000000','320830','3208','盱眙县','','','盱眙县','3','江苏省','淮安市','盱眙县','江苏省淮安市盱眙县',null,null,33.0108900,118.5449900),\n(185218,'320831000000','320800000000','320831','3208','金湖县','','','金湖县','3','江苏省','淮安市','金湖县','江苏省淮安市金湖县',null,null,33.0235900,119.0204300),\n(185384,'320871000000','320800000000','320871','3208','淮安经济技术开发区','','','淮安经济技术开发区','3','江苏省','淮安市','淮安经济技术开发区','江苏省淮安市淮安经济技术开发区',null,null,33.6531520,119.1874390),\n(185480,'320900000000','320000000000','3209','32','盐城市','','盐城市','','2','江苏省','盐城市','','江苏省盐城市',null,null,33.2010700,120.5010200),\n(185481,'320901000000','320900000000','320901','3209','市辖区','','','市辖区','3','江苏省','盐城市','市辖区','江苏省盐城市市辖区',null,null,33.2010700,120.5010200),\n(185482,'320902000000','320900000000','320902','3209','亭湖区','','','亭湖区','3','江苏省','盐城市','亭湖区','江苏省盐城市亭湖区',null,null,33.3889300,120.1953000),\n(185704,'320903000000','320900000000','320903','3209','盐都区','','','盐都区','3','江苏省','盐城市','盐都区','江苏省盐城市盐都区',null,null,33.3373200,120.1544800),\n(185990,'320904000000','320900000000','320904','3209','大丰区','','','大丰区','3','江苏省','盐城市','大丰区','江苏省盐城市大丰区',null,null,33.2010700,120.5010200),\n(186276,'320921000000','320900000000','320921','3209','响水县','','','响水县','3','江苏省','盐城市','响水县','江苏省盐城市响水县',null,null,34.1991900,119.5783900),\n(186452,'320922000000','320900000000','320922','3209','滨海县','','','滨海县','3','江苏省','盐城市','滨海县','江苏省盐城市滨海县',null,null,33.9897500,119.8206400),\n(186772,'320923000000','320900000000','320923','3209','阜宁县','','','阜宁县','3','江苏省','盐城市','阜宁县','江苏省盐城市阜宁县',null,null,33.7593100,119.8025800),\n(187131,'320924000000','320900000000','320924','3209','射阳县','','','射阳县','3','江苏省','盐城市','射阳县','江苏省盐城市射阳县',null,null,33.7749600,120.2581500),\n(187425,'320925000000','320900000000','320925','3209','建湖县','','','建湖县','3','江苏省','盐城市','建湖县','江苏省盐城市建湖县',null,null,33.4640600,119.7985800),\n(187687,'320971000000','320900000000','320971','3209','盐城经济技术开发区','','','盐城经济技术开发区','3','江苏省','盐城市','盐城经济技术开发区','江苏省盐城市盐城经济技术开发区',null,null,33.3796960,120.2172930),\n(187724,'320981000000','320900000000','320981','3209','东台市','','','东台市','3','江苏省','盐城市','东台市','江苏省盐城市东台市',null,null,32.8669500,120.3205000),\n(188177,'321000000000','320000000000','3210','32','扬州市','','扬州市','','2','江苏省','扬州市','','江苏省扬州市',null,null,32.3946300,119.4315700),\n(188178,'321001000000','321000000000','321001','3210','市辖区','','','市辖区','3','江苏省','扬州市','市辖区','江苏省扬州市市辖区',null,null,32.3946300,119.4315700),\n(188179,'321002000000','321000000000','321002','3210','广陵区','','','广陵区','3','江苏省','扬州市','广陵区','江苏省扬州市广陵区',null,null,32.3946300,119.4315700),\n(188337,'321003000000','321000000000','321003','3210','邗江区','','','邗江区','3','江苏省','扬州市','邗江区','江苏省扬州市邗江区',null,null,32.3765400,119.3982300),\n(188533,'321012000000','321000000000','321012','3210','江都区','','','江都区','3','江苏省','扬州市','江都区','江苏省扬州市江都区',null,null,32.4345800,119.5700600),\n(188883,'321023000000','321000000000','321023','3210','宝应县','','','宝应县','3','江苏省','扬州市','宝应县','江苏省扬州市宝应县',null,null,33.2414200,119.3584100),\n(189181,'321071000000','321000000000','321071','3210','扬州经济技术开发区','','','扬州经济技术开发区','3','江苏省','扬州市','扬州经济技术开发区','江苏省扬州市扬州经济技术开发区',null,null,32.3750340,119.4111630),\n(189244,'321081000000','321000000000','321081','3210','仪征市','','','仪征市','3','江苏省','扬州市','仪征市','江苏省扬州市仪征市',null,null,32.2720300,119.1844400),\n(189458,'321084000000','321000000000','321084','3210','高邮市','','','高邮市','3','江苏省','扬州市','高邮市','江苏省扬州市高邮市',null,null,32.7811200,119.4555800),\n(189700,'321100000000','320000000000','3211','32','镇江市','','镇江市','','2','江苏省','镇江市','','江苏省镇江市',null,null,32.1318800,119.4339600),\n(189701,'321101000000','321100000000','321101','3211','市辖区','','','市辖区','3','江苏省','镇江市','市辖区','江苏省镇江市市辖区',null,null,32.1318800,119.4339600),\n(189702,'321102000000','321100000000','321102','3211','京口区','','','京口区','3','江苏省','镇江市','京口区','江苏省镇江市京口区',null,null,32.1981100,119.4696200),\n(189777,'321111000000','321100000000','321111','3211','润州区','','','润州区','3','江苏省','镇江市','润州区','江苏省镇江市润州区',null,null,32.1952500,119.4121700),\n(189859,'321112000000','321100000000','321112','3211','丹徒区','','','丹徒区','3','江苏省','镇江市','丹徒区','江苏省镇江市丹徒区',null,null,32.1318800,119.4339600),\n(189961,'321171000000','321100000000','321171','3211','镇江新区','','','镇江新区','3','江苏省','镇江市','镇江新区','江苏省镇江市镇江新区',null,null,32.1318800,119.4339600),\n(190026,'321181000000','321100000000','321181','3211','丹阳市','','','丹阳市','3','江苏省','镇江市','丹阳市','江苏省镇江市丹阳市',null,null,32.0094500,119.6069400),\n(190257,'321182000000','321100000000','321182','3211','扬中市','','','扬中市','3','江苏省','镇江市','扬中市','江苏省镇江市扬中市',null,null,32.2370200,119.7968200),\n(190343,'321183000000','321100000000','321183','3211','句容市','','','句容市','3','江苏省','镇江市','句容市','江苏省镇江市句容市',null,null,31.9448200,119.1686400),\n(190549,'321200000000','320000000000','3212','32','泰州市','','泰州市','','2','江苏省','泰州市','','江苏省泰州市',null,null,32.3184100,119.8811600),\n(190550,'321201000000','321200000000','321201','3212','市辖区','','','市辖区','3','江苏省','泰州市','市辖区','江苏省泰州市市辖区',null,null,32.3184100,119.8811600),\n(190551,'321202000000','321200000000','321202','3212','海陵区','','','海陵区','3','江苏省','泰州市','海陵区','江苏省泰州市海陵区',null,null,32.4909800,119.9195600),\n(190706,'321203000000','321200000000','321203','3212','高港区','','','高港区','3','江苏省','泰州市','高港区','江苏省泰州市高港区',null,null,32.3184100,119.8811600),\n(190807,'321204000000','321200000000','321204','3212','姜堰区','','','姜堰区','3','江苏省','泰州市','姜堰区','江苏省泰州市姜堰区',null,null,32.5087900,120.1267300),\n(191143,'321271000000','321200000000','321271','3212','泰州医药高新技术产业开发区','','','泰州医药高新技术产业开发区','3','江苏省','泰州市','泰州医药高新技术产业开发区','江苏省泰州市泰州医药高新技术产业开发区',null,null,32.4878920,119.8824010),\n(191215,'321281000000','321200000000','321281','3212','兴化市','','','兴化市','3','江苏省','泰州市','兴化市','江苏省泰州市兴化市',null,null,32.9104100,119.8527200),\n(191932,'321282000000','321200000000','321282','3212','靖江市','','','靖江市','3','江苏省','泰州市','靖江市','江苏省泰州市靖江市',null,null,32.0149400,120.2745400),\n(192208,'321283000000','321200000000','321283','3212','泰兴市','','','泰兴市','3','江苏省','泰州市','泰兴市','江苏省泰州市泰兴市',null,null,32.1719100,120.0520000),\n(192582,'321300000000','320000000000','3213','32','宿迁市','','宿迁市','','2','江苏省','宿迁市','','江苏省宿迁市',null,null,33.9627100,118.2423900),\n(192583,'321301000000','321300000000','321301','3213','市辖区','','','市辖区','3','江苏省','宿迁市','市辖区','江苏省宿迁市市辖区',null,null,33.9627100,118.2423900),\n(192584,'321302000000','321300000000','321302','3213','宿城区','','','宿城区','3','江苏省','宿迁市','宿城区','江苏省宿迁市宿城区',null,null,33.9627100,118.2423900),\n(192817,'321311000000','321300000000','321311','3213','宿豫区','','','宿豫区','3','江苏省','宿迁市','宿豫区','江苏省宿迁市宿豫区',null,null,33.9468600,118.3306600),\n(193030,'321322000000','321300000000','321322','3213','沭阳县','','','沭阳县','3','江苏省','宿迁市','沭阳县','江苏省宿迁市沭阳县',null,null,34.1121500,118.8040600),\n(193557,'321323000000','321300000000','321323','3213','泗阳县','','','泗阳县','3','江苏省','宿迁市','泗阳县','江苏省宿迁市泗阳县',null,null,33.7210100,118.7033500),\n(193822,'321324000000','321300000000','321324','3213','泗洪县','','','泗洪县','3','江苏省','宿迁市','泗洪县','江苏省宿迁市泗洪县',null,null,33.4590000,118.2162400),\n(194199,'321371000000','321300000000','321371','3213','宿迁经济技术开发区','','','宿迁经济技术开发区','3','江苏省','宿迁市','宿迁经济技术开发区','江苏省宿迁市宿迁经济技术开发区',null,null,33.8920400,118.2669070),\n(194236,'330000000000','0','33','0','浙江省','浙江省','','','1','浙江省','','','浙江省',null,null,null,null),\n(194237,'330100000000','330000000000','3301','33','杭州市','','杭州市','','2','浙江省','杭州市','','浙江省杭州市',null,null,30.2084000,120.2120100),\n(194238,'330101000000','330100000000','330101','3301','市辖区','','','市辖区','3','浙江省','杭州市','市辖区','浙江省杭州市市辖区',null,null,30.2084000,120.2120100),\n(194239,'330102000000','330100000000','330102','3301','上城区','','','上城区','3','浙江省','杭州市','上城区','浙江省杭州市上城区',null,null,30.2425900,120.1692900),\n(194300,'330103000000','330100000000','330103','3301','下城区','','','下城区','3','浙江省','杭州市','下城区','浙江省杭州市下城区',null,null,30.2812200,120.1811700),\n(194383,'330104000000','330100000000','330104','3301','江干区','','','江干区','3','浙江省','杭州市','江干区','浙江省杭州市江干区',null,null,30.2572700,120.2052300),\n(194579,'330105000000','330100000000','330105','3301','拱墅区','','','拱墅区','3','浙江省','杭州市','拱墅区','浙江省杭州市拱墅区',null,null,30.3197400,120.1421000),\n(194689,'330106000000','330100000000','330106','3301','西湖区','','','西湖区','3','浙江省','杭州市','西湖区','浙江省杭州市西湖区',null,null,30.2596100,120.1302600),\n(194908,'330108000000','330100000000','330108','3301','滨江区','','','滨江区','3','浙江省','杭州市','滨江区','浙江省杭州市滨江区',null,null,30.2084000,120.2120100),\n(194972,'330109000000','330100000000','330109','3301','萧山区','','','萧山区','3','浙江省','杭州市','萧山区','浙江省杭州市萧山区',null,null,30.1853400,120.2645700),\n(195609,'330110000000','330100000000','330110','3301','余杭区','','','余杭区','3','浙江省','杭州市','余杭区','浙江省杭州市余杭区',null,null,30.4187500,120.2985000),\n(195978,'330111000000','330100000000','330111','3301','富阳区','','','富阳区','3','浙江省','杭州市','富阳区','浙江省杭州市富阳区',null,null,30.0488500,119.9604300),\n(196310,'330112000000','330100000000','330112','3301','临安区','','','临安区','3','浙江省','杭州市','临安区','浙江省杭州市临安区',null,null,30.2338300,119.7248000),\n(196645,'330122000000','330100000000','330122','3301','桐庐县','','','桐庐县','3','浙江省','杭州市','桐庐县','浙江省杭州市桐庐县',null,null,29.7931700,119.6915000),\n(196864,'330127000000','330100000000','330127','3301','淳安县','','','淳安县','3','浙江省','杭州市','淳安县','浙江省杭州市淳安县',null,null,29.6088600,119.0420700),\n(197327,'330182000000','330100000000','330182','3301','建德市','','','建德市','3','浙江省','杭州市','建德市','浙江省杭州市建德市',null,null,29.4747500,119.2812100),\n(197621,'330200000000','330000000000','3302','33','宁波市','','宁波市','','2','浙江省','宁波市','','浙江省宁波市',null,null,29.8988900,121.8443100),\n(197622,'330201000000','330200000000','330201','3302','市辖区','','','市辖区','3','浙江省','宁波市','市辖区','浙江省宁波市市辖区',null,null,29.8988900,121.8443100),\n(197623,'330203000000','330200000000','330203','3302','海曙区','','','海曙区','3','浙江省','宁波市','海曙区','浙江省宁波市海曙区',null,null,29.8595700,121.5508400),\n(197912,'330205000000','330200000000','330205','3302','江北区','','','江北区','3','浙江省','宁波市','江北区','浙江省宁波市江北区',null,null,29.8861500,121.5546800),\n(198090,'330206000000','330200000000','330206','3302','北仑区','','','北仑区','3','浙江省','宁波市','北仑区','浙江省宁波市北仑区',null,null,29.8988900,121.8443100),\n(198364,'330211000000','330200000000','330211','3302','镇海区','','','镇海区','3','浙江省','宁波市','镇海区','浙江省宁波市镇海区',null,null,29.9489900,121.7162400),\n(198468,'330212000000','330200000000','330212','3302','鄞州区','','','鄞州区','3','浙江省','宁波市','鄞州区','浙江省宁波市鄞州区',null,null,29.8172000,121.5470000),\n(198916,'330213000000','330200000000','330213','3302','奉化区','','','奉化区','3','浙江省','宁波市','奉化区','浙江省宁波市奉化区',null,null,29.6550300,121.4068600),\n(199326,'330225000000','330200000000','330225','3302','象山县','','','象山县','3','浙江省','宁波市','象山县','浙江省宁波市象山县',null,null,29.4766500,121.8693200),\n(199885,'330226000000','330200000000','330226','3302','宁海县','','','宁海县','3','浙江省','宁波市','宁海县','浙江省宁波市宁海县',null,null,29.2880700,121.4296100),\n(200314,'330281000000','330200000000','330281','3302','余姚市','','','余姚市','3','浙江省','宁波市','余姚市','浙江省宁波市余姚市',null,null,30.0371100,121.1543500),\n(200661,'330282000000','330200000000','330282','3302','慈溪市','','','慈溪市','3','浙江省','宁波市','慈溪市','浙江省宁波市慈溪市',null,null,30.1696400,121.2664700),\n(201072,'330300000000','330000000000','3303','33','温州市','','温州市','','2','浙江省','温州市','','浙江省温州市',null,null,27.8361600,121.1572000),\n(201073,'330301000000','330300000000','330301','3303','市辖区','','','市辖区','3','浙江省','温州市','市辖区','浙江省温州市市辖区',null,null,27.8361600,121.1572000),\n(201074,'330302000000','330300000000','330302','3303','鹿城区','','','鹿城区','3','浙江省','温州市','鹿城区','浙江省温州市鹿城区',null,null,28.0146900,120.6552300),\n(201313,'330303000000','330300000000','330303','3303','龙湾区','','','龙湾区','3','浙江省','温州市','龙湾区','浙江省温州市龙湾区',null,null,27.9325200,120.8130300),\n(201432,'330304000000','330300000000','330304','3303','瓯海区','','','瓯海区','3','浙江省','温州市','瓯海区','浙江省温州市瓯海区',null,null,28.0070800,120.6376800),\n(201730,'330305000000','330300000000','330305','3303','洞头区','','','洞头区','3','浙江省','温州市','洞头区','浙江省温州市洞头区',null,null,27.8361600,121.1572000),\n(201841,'330324000000','330300000000','330324','3303','永嘉县','','','永嘉县','3','浙江省','温州市','永嘉县','浙江省温州市永嘉县',null,null,28.1533600,120.6917100),\n(202804,'330326000000','330300000000','330326','3303','平阳县','','','平阳县','3','浙江省','温州市','平阳县','浙江省温州市平阳县',null,null,27.6621000,120.5659500),\n(203462,'330327000000','330300000000','330327','3303','苍南县','','','苍南县','3','浙江省','温州市','苍南县','浙江省温州市苍南县',null,null,27.5174300,120.4263100),\n(204363,'330328000000','330300000000','330328','3303','文成县','','','文成县','3','浙江省','温州市','文成县','浙江省温州市文成县',null,null,27.7871200,120.0913700),\n(204780,'330329000000','330300000000','330329','3303','泰顺县','','','泰顺县','3','浙江省','温州市','泰顺县','浙江省温州市泰顺县',null,null,27.5563900,119.7175000),\n(205115,'330371000000','330300000000','330371','3303','温州经济技术开发区','','','温州经济技术开发区','3','浙江省','温州市','温州经济技术开发区','浙江省温州市温州经济技术开发区',null,null,27.8727530,120.8171840),\n(205169,'330381000000','330300000000','330381','3303','瑞安市','','','瑞安市','3','浙江省','温州市','瑞安市','浙江省温州市瑞安市',null,null,27.7783800,120.6551800),\n(206151,'330382000000','330300000000','330382','3303','乐清市','','','乐清市','3','浙江省','温州市','乐清市','浙江省温州市乐清市',null,null,28.1128900,120.9833800),\n(207139,'330400000000','330000000000','3304','33','嘉兴市','','嘉兴市','','2','浙江省','嘉兴市','','浙江省嘉兴市',null,null,30.7474400,120.7848300),\n(207140,'330401000000','330400000000','330401','3304','市辖区','','','市辖区','3','浙江省','嘉兴市','市辖区','浙江省嘉兴市市辖区',null,null,30.7474400,120.7848300),\n(207141,'330402000000','330400000000','330402','3304','南湖区','','','南湖区','3','浙江省','嘉兴市','南湖区','浙江省嘉兴市南湖区',null,null,30.7474400,120.7848300),\n(207296,'330411000000','330400000000','330411','3304','秀洲区','','','秀洲区','3','浙江省','嘉兴市','秀洲区','浙江省嘉兴市秀洲区',null,null,30.7638800,120.7092000),\n(207466,'330421000000','330400000000','330421','3304','嘉善县','','','嘉善县','3','浙江省','嘉兴市','嘉善县','浙江省嘉兴市嘉善县',null,null,30.8307500,120.9271600),\n(207630,'330424000000','330400000000','330424','3304','海盐县','','','海盐县','3','浙江省','嘉兴市','海盐县','浙江省嘉兴市海盐县',null,null,30.5255300,120.9457900),\n(207773,'330481000000','330400000000','330481','3304','海宁市','','','海宁市','3','浙江省','嘉兴市','海宁市','浙江省嘉兴市海宁市',null,null,30.5093800,120.6810200),\n(208009,'330482000000','330400000000','330482','3304','平湖市','','','平湖市','3','浙江省','嘉兴市','平湖市','浙江省嘉兴市平湖市',null,null,30.6758500,121.0160600),\n(208154,'330483000000','330400000000','330483','3304','桐乡市','','','桐乡市','3','浙江省','嘉兴市','桐乡市','浙江省嘉兴市桐乡市',null,null,30.6307400,120.5643200),\n(208377,'330500000000','330000000000','3305','33','湖州市','','湖州市','','2','浙江省','湖州市','','浙江省湖州市',null,null,30.8497900,120.4184700),\n(208378,'330501000000','330500000000','330501','3305','市辖区','','','市辖区','3','浙江省','湖州市','市辖区','浙江省湖州市市辖区',null,null,30.8497900,120.4184700),\n(208379,'330502000000','330500000000','330502','3305','吴兴区','','','吴兴区','3','浙江省','湖州市','吴兴区','浙江省湖州市吴兴区',null,null,30.8581600,120.1856200),\n(208733,'330503000000','330500000000','330503','3305','南浔区','','','南浔区','3','浙江省','湖州市','南浔区','浙江省湖州市南浔区',null,null,30.8497900,120.4184700),\n(209001,'330521000000','330500000000','330521','3305','德清县','','','德清县','3','浙江省','湖州市','德清县','浙江省湖州市德清县',null,null,30.5427000,119.9772800),\n(209195,'330522000000','330500000000','330522','3305','长兴县','','','长兴县','3','浙江省','湖州市','长兴县','浙江省湖州市长兴县',null,null,31.0266300,119.9101100),\n(209493,'330523000000','330500000000','330523','3305','安吉县','','','安吉县','3','浙江省','湖州市','安吉县','浙江省湖州市安吉县',null,null,30.6382400,119.6821900),\n(209718,'330600000000','330000000000','3306','33','绍兴市','','绍兴市','','2','浙江省','绍兴市','','浙江省绍兴市',null,null,30.0818900,120.4947600),\n(209719,'330601000000','330600000000','330601','3306','市辖区','','','市辖区','3','浙江省','绍兴市','市辖区','浙江省绍兴市市辖区',null,null,30.0818900,120.4947600),\n(209720,'330602000000','330600000000','330602','3306','越城区','','','越城区','3','浙江省','绍兴市','越城区','浙江省绍兴市越城区',null,null,29.9889900,120.5819900),\n(210144,'330603000000','330600000000','330603','3306','柯桥区','','','柯桥区','3','浙江省','绍兴市','柯桥区','浙江省绍兴市柯桥区',null,null,30.0818900,120.4947600),\n(210517,'330604000000','330600000000','330604','3306','上虞区','','','上虞区','3','浙江省','绍兴市','上虞区','浙江省绍兴市上虞区',null,null,30.0322700,120.8685800),\n(210984,'330624000000','330600000000','330624','3306','新昌县','','','新昌县','3','浙江省','绍兴市','新昌县','浙江省绍兴市新昌县',null,null,29.4998300,120.9038500),\n(211441,'330681000000','330600000000','330681','3306','诸暨市','','','诸暨市','3','浙江省','绍兴市','诸暨市','浙江省绍兴市诸暨市',null,null,29.7136400,120.2363200),\n(212014,'330683000000','330600000000','330683','3306','嵊州市','','','嵊州市','3','浙江省','绍兴市','嵊州市','浙江省绍兴市嵊州市',null,null,29.5884900,120.8217000),\n(212531,'330700000000','330000000000','3307','33','金华市','','金华市','','2','浙江省','金华市','','浙江省金华市',null,null,29.0991400,119.6931100),\n(212532,'330701000000','330700000000','330701','3307','市辖区','','','市辖区','3','浙江省','金华市','市辖区','浙江省金华市市辖区',null,null,29.0991400,119.6931100),\n(212533,'330702000000','330700000000','330702','3307','婺城区','','','婺城区','3','浙江省','金华市','婺城区','浙江省金华市婺城区',null,null,29.0862400,119.5715000),\n(213229,'330703000000','330700000000','330703','3307','金东区','','','金东区','3','浙江省','金华市','金东区','浙江省金华市金东区',null,null,29.0991400,119.6931100),\n(213750,'330723000000','330700000000','330723','3307','武义县','','','武义县','3','浙江省','金华市','武义县','浙江省金华市武义县',null,null,28.8926000,119.8165100),\n(214323,'330726000000','330700000000','330726','3307','浦江县','','','浦江县','3','浙江省','金华市','浦江县','浙江省金华市浦江县',null,null,29.4525100,119.8920600),\n(214768,'330727000000','330700000000','330727','3307','磐安县','','','磐安县','3','浙江省','金华市','磐安县','浙江省金华市磐安县',null,null,29.0540300,120.4502200),\n(215159,'330781000000','330700000000','330781','3307','兰溪市','','','兰溪市','3','浙江省','金华市','兰溪市','浙江省金华市兰溪市',null,null,29.2083800,119.4605100),\n(215533,'330782000000','330700000000','330782','3307','义乌市','','','义乌市','3','浙江省','金华市','义乌市','浙江省金华市义乌市',null,null,29.3055800,120.0746800),\n(216334,'330783000000','330700000000','330783','3307','东阳市','','','东阳市','3','浙江省','金华市','东阳市','浙江省金华市东阳市',null,null,29.2894600,120.2419100),\n(216741,'330784000000','330700000000','330784','3307','永康市','','','永康市','3','浙江省','金华市','永康市','浙江省金华市永康市',null,null,28.8885100,120.0473100),\n(217516,'330800000000','330000000000','3308','33','衢州市','','衢州市','','2','浙江省','衢州市','','浙江省衢州市',null,null,28.9686400,118.8711700),\n(217517,'330801000000','330800000000','330801','3308','市辖区','','','市辖区','3','浙江省','衢州市','市辖区','浙江省衢州市市辖区',null,null,28.9686400,118.8711700),\n(217518,'330802000000','330800000000','330802','3308','柯城区','','','柯城区','3','浙江省','衢州市','柯城区','浙江省衢州市柯城区',null,null,28.9686400,118.8711700),\n(217794,'330803000000','330800000000','330803','3308','衢江区','','','衢江区','3','浙江省','衢州市','衢江区','浙江省衢州市衢江区',null,null,28.9796400,118.9591900),\n(218100,'330822000000','330800000000','330822','3308','常山县','','','常山县','3','浙江省','衢州市','常山县','浙江省衢州市常山县',null,null,28.9014100,118.5111600),\n(218308,'330824000000','330800000000','330824','3308','开化县','','','开化县','3','浙江省','衢州市','开化县','浙江省衢州市开化县',null,null,29.1360900,118.4142200),\n(218589,'330825000000','330800000000','330825','3308','龙游县','','','龙游县','3','浙江省','衢州市','龙游县','浙江省衢州市龙游县',null,null,29.0282700,119.1722500),\n(218881,'330881000000','330800000000','330881','3308','江山市','','','江山市','3','浙江省','衢州市','江山市','浙江省衢州市江山市',null,null,28.7372500,118.6269000),\n(219212,'330900000000','330000000000','3309','33','舟山市','','舟山市','','2','浙江省','舟山市','','浙江省舟山市',null,null,30.0197900,122.1067900),\n(219213,'330901000000','330900000000','330901','3309','市辖区','','','市辖区','3','浙江省','舟山市','市辖区','浙江省舟山市市辖区',null,null,30.0197900,122.1067900),\n(219214,'330902000000','330900000000','330902','3309','定海区','','','定海区','3','浙江省','舟山市','定海区','浙江省舟山市定海区',null,null,30.0197900,122.1067900),\n(219399,'330903000000','330900000000','330903','3309','普陀区','','','普陀区','3','浙江省','舟山市','普陀区','浙江省舟山市普陀区',null,null,29.9492000,122.3027800),\n(219529,'330921000000','330900000000','330921','3309','岱山县','','','岱山县','3','浙江省','舟山市','岱山县','浙江省舟山市岱山县',null,null,30.2436900,122.2049800),\n(219622,'330922000000','330900000000','330922','3309','嵊泗县','','','嵊泗县','3','浙江省','舟山市','嵊泗县','浙江省舟山市嵊泗县',null,null,30.7257300,122.4513700),\n(219668,'331000000000','330000000000','3310','33','台州市','','台州市','','2','浙江省','台州市','','浙江省台州市',null,null,28.6496500,121.2629500),\n(219669,'331001000000','331000000000','331001','3310','市辖区','','','市辖区','3','浙江省','台州市','市辖区','浙江省台州市市辖区',null,null,28.6496500,121.2629500),\n(219670,'331002000000','331000000000','331002','3310','椒江区','','','椒江区','3','浙江省','台州市','椒江区','浙江省台州市椒江区',null,null,28.6730700,121.4429700),\n(220010,'331003000000','331000000000','331003','3310','黄岩区','','','黄岩区','3','浙江省','台州市','黄岩区','浙江省台州市黄岩区',null,null,28.6496500,121.2629500),\n(220548,'331004000000','331000000000','331004','3310','路桥区','','','路桥区','3','浙江省','台州市','路桥区','浙江省台州市路桥区',null,null,28.5826500,121.3650800),\n(220892,'331022000000','331000000000','331022','3310','三门县','','','三门县','3','浙江省','台州市','三门县','浙江省台州市三门县',null,null,29.1046700,121.3956800),\n(221428,'331023000000','331000000000','331023','3310','天台县','','','天台县','3','浙江省','台州市','天台县','浙江省台州市天台县',null,null,29.1402900,121.0309300),\n(222056,'331024000000','331000000000','331024','3310','仙居县','','','仙居县','3','浙江省','台州市','仙居县','浙江省台州市仙居县',null,null,28.8468300,120.7288100),\n(222503,'331081000000','331000000000','331081','3310','温岭市','','','温岭市','3','浙江省','台州市','温岭市','浙江省台州市温岭市',null,null,28.3718000,121.3859900),\n(223443,'331082000000','331000000000','331082','3310','临海市','','','临海市','3','浙江省','台州市','临海市','浙江省台州市临海市',null,null,28.8584000,121.1449500),\n(224498,'331083000000','331000000000','331083','3310','玉环市','','','玉环市','3','浙江省','台州市','玉环市','浙江省台州市玉环市',null,null,28.1358900,121.2316400),\n(224830,'331100000000','330000000000','3311','33','丽水市','','丽水市','','2','浙江省','丽水市','','浙江省丽水市',null,null,28.4459400,119.9128400),\n(224831,'331101000000','331100000000','331101','3311','市辖区','','','市辖区','3','浙江省','丽水市','市辖区','浙江省丽水市市辖区',null,null,28.4459400,119.9128400),\n(224832,'331102000000','331100000000','331102','3311','莲都区','','','莲都区','3','浙江省','丽水市','莲都区','浙江省丽水市莲都区',null,null,28.4459400,119.9128400),\n(225123,'331121000000','331100000000','331121','3311','青田县','','','青田县','3','浙江省','丽水市','青田县','浙江省丽水市青田县',null,null,28.1398700,120.2895500),\n(225601,'331122000000','331100000000','331122','3311','缙云县','','','缙云县','3','浙江省','丽水市','缙云县','浙江省丽水市缙云县',null,null,28.6592800,120.0915800),\n(225879,'331123000000','331100000000','331123','3311','遂昌县','','','遂昌县','3','浙江省','丽水市','遂昌县','浙江省丽水市遂昌县',null,null,28.5921300,119.2760200),\n(226111,'331124000000','331100000000','331124','3311','松阳县','','','松阳县','3','浙江省','丽水市','松阳县','浙江省丽水市松阳县',null,null,28.4494700,119.4820200),\n(226545,'331125000000','331100000000','331125','3311','云和县','','','云和县','3','浙江省','丽水市','云和县','浙江省丽水市云和县',null,null,28.1159100,119.5734000),\n(226733,'331126000000','331100000000','331126','3311','庆元县','','','庆元县','3','浙江省','丽水市','庆元县','浙江省丽水市庆元县',null,null,27.6191300,119.0626600),\n(227106,'331127000000','331100000000','331127','3311','景宁畲族自治县','','','景宁畲族自治县','3','浙江省','丽水市','景宁畲族自治县','浙江省丽水市景宁畲族自治县',null,null,27.9732000,119.6358100),\n(227393,'331181000000','331100000000','331181','3311','龙泉市','','','龙泉市','3','浙江省','丽水市','龙泉市','浙江省丽水市龙泉市',null,null,28.0743400,119.1416800),\n(227870,'340000000000','0','34','0','安徽省','安徽省','','','1','安徽省','','','安徽省',null,null,null,null),\n(227871,'340100000000','340000000000','3401','34','合肥市','','合肥市','','2','安徽省','合肥市','','安徽省合肥市',null,null,31.7932200,117.3079400),\n(227872,'340101000000','340100000000','340101','3401','市辖区','','','市辖区','3','安徽省','合肥市','市辖区','安徽省合肥市市辖区',null,null,31.7932200,117.3079400),\n(227873,'340102000000','340100000000','340102','3401','瑶海区','','','瑶海区','3','安徽省','合肥市','瑶海区','安徽省合肥市瑶海区',null,null,31.8579700,117.3094900),\n(227976,'340103000000','340100000000','340103','3401','庐阳区','','','庐阳区','3','安徽省','合肥市','庐阳区','安徽省合肥市庐阳区',null,null,31.8787200,117.2649700),\n(228060,'340104000000','340100000000','340104','3401','蜀山区','','','蜀山区','3','安徽省','合肥市','蜀山区','安徽省合肥市蜀山区',null,null,31.8512000,117.2606100),\n(228168,'340111000000','340100000000','340111','3401','包河区','','','包河区','3','安徽省','合肥市','包河区','安徽省合肥市包河区',null,null,31.7932200,117.3079400),\n(228293,'340121000000','340100000000','340121','3401','长丰县','','','长丰县','3','安徽省','合肥市','长丰县','安徽省合肥市长丰县',null,null,32.4779600,117.1676600),\n(228583,'340122000000','340100000000','340122','3401','肥东县','','','肥东县','3','安徽省','合肥市','肥东县','安徽省合肥市肥东县',null,null,31.8877000,117.4692800),\n(228935,'340123000000','340100000000','340123','3401','肥西县','','','肥西县','3','安徽省','合肥市','肥西县','安徽省合肥市肥西县',null,null,31.7068900,117.1828300),\n(229228,'340124000000','340100000000','340124','3401','庐江县','','','庐江县','3','安徽省','合肥市','庐江县','安徽省合肥市庐江县',null,null,31.2556700,117.2873600),\n(229478,'340171000000','340100000000','340171','3401','合肥高新技术产业开发区','','','合肥高新技术产业开发区','3','安徽省','合肥市','合肥高新技术产业开发区','安徽省合肥市合肥高新技术产业开发区',null,null,31.8450390,117.2067720),\n(229507,'340172000000','340100000000','340172','3401','合肥经济技术开发区','','','合肥经济技术开发区','3','安徽省','合肥市','合肥经济技术开发区','安徽省合肥市合肥经济技术开发区',null,null,31.8874240,117.4352570),\n(229567,'340173000000','340100000000','340173','3401','合肥新站高新技术产业开发区','','','合肥新站高新技术产业开发区','3','安徽省','合肥市','合肥新站高新技术产业开发区','安徽省合肥市合肥新站高新技术产业开发区',null,null,31.8218160,117.1203410),\n(229624,'340181000000','340100000000','340181','3401','巢湖市','','','巢湖市','3','安徽省','合肥市','巢湖市','安徽省合肥市巢湖市',null,null,31.6232900,117.8893700),\n(229844,'340200000000','340000000000','3402','34','芜湖市','','芜湖市','','2','安徽省','芜湖市','','安徽省芜湖市',null,null,31.3407200,118.3854800),\n(229845,'340201000000','340200000000','340201','3402','市辖区','','','市辖区','3','安徽省','芜湖市','市辖区','安徽省芜湖市市辖区',null,null,31.3407200,118.3854800),\n(229846,'340202000000','340200000000','340202','3402','镜湖区','','','镜湖区','3','安徽省','芜湖市','镜湖区','安徽省芜湖市镜湖区',null,null,31.3407200,118.3854800),\n(229925,'340203000000','340200000000','340203','3402','弋江区','','','弋江区','3','安徽省','芜湖市','弋江区','安徽省芜湖市弋江区',null,null,31.3120200,118.3727300),\n(229985,'340207000000','340200000000','340207','3402','鸠江区','','','鸠江区','3','安徽省','芜湖市','鸠江区','安徽省芜湖市鸠江区',null,null,31.3695900,118.3923600),\n(230110,'340208000000','340200000000','340208','3402','三山区','','','三山区','3','安徽省','芜湖市','三山区','安徽省芜湖市三山区',null,null,31.2243600,118.2346400),\n(230161,'340221000000','340200000000','340221','3402','芜湖县','','','芜湖县','3','安徽省','芜湖市','芜湖县','安徽省芜湖市芜湖县',null,null,31.1347900,118.5752900),\n(230259,'340222000000','340200000000','340222','3402','繁昌县','','','繁昌县','3','安徽省','芜湖市','繁昌县','安徽省芜湖市繁昌县',null,null,31.0829100,118.1993400),\n(230363,'340223000000','340200000000','340223','3402','南陵县','','','南陵县','3','安徽省','芜湖市','南陵县','安徽省芜湖市南陵县',null,null,30.9146500,118.3340500),\n(230551,'340225000000','340200000000','340225','3402','无为县','','','无为县','3','安徽省','芜湖市','无为县','安徽省芜湖市无为县',null,null,31.3031700,117.9022400),\n(230850,'340271000000','340200000000','340271','3402','芜湖经济技术开发区','','','芜湖经济技术开发区','3','安徽省','芜湖市','芜湖经济技术开发区','安徽省芜湖市芜湖经济技术开发区',null,null,31.4084700,118.3738780),\n(230876,'340272000000','340200000000','340272','3402','安徽芜湖长江大桥经济开发区','','','安徽芜湖长江大桥经济开发区','3','安徽省','芜湖市','安徽芜湖长江大桥经济开发区','安徽省芜湖市安徽芜湖长江大桥经济开发区',null,null,31.3946930,118.3802030),\n(230885,'340300000000','340000000000','3403','34','蚌埠市','','蚌埠市','','2','安徽省','蚌埠市','','安徽省蚌埠市',null,null,32.9444800,117.3677900),\n(230886,'340301000000','340300000000','340301','3403','市辖区','','','市辖区','3','安徽省','蚌埠市','市辖区','安徽省蚌埠市市辖区',null,null,32.9444800,117.3677900),\n(230887,'340302000000','340300000000','340302','3403','龙子湖区','','','龙子湖区','3','安徽省','蚌埠市','龙子湖区','安徽省蚌埠市龙子湖区',null,null,32.9428000,117.3934700),\n(230954,'340303000000','340300000000','340303','3403','蚌山区','','','蚌山区','3','安徽省','蚌埠市','蚌山区','安徽省蚌埠市蚌山区',null,null,32.9444800,117.3677900),\n(231002,'340304000000','340300000000','340304','3403','禹会区','','','禹会区','3','安徽省','蚌埠市','禹会区','安徽省蚌埠市禹会区',null,null,32.9292100,117.3421100),\n(231078,'340311000000','340300000000','340311','3403','淮上区','','','淮上区','3','安徽省','蚌埠市','淮上区','安徽省蚌埠市淮上区',null,null,32.9643600,117.3599600),\n(231170,'340321000000','340300000000','340321','3403','怀远县','','','怀远县','3','安徽省','蚌埠市','怀远县','安徽省蚌埠市怀远县',null,null,32.9701100,117.2051400),\n(231556,'340322000000','340300000000','340322','3403','五河县','','','五河县','3','安徽省','蚌埠市','五河县','安徽省蚌埠市五河县',null,null,33.1450700,117.8852900),\n(231789,'340323000000','340300000000','340323','3403','固镇县','','','固镇县','3','安徽省','蚌埠市','固镇县','安徽省蚌埠市固镇县',null,null,33.3176900,117.3166600),\n(232031,'340371000000','340300000000','340371','3403','蚌埠市高新技术开发区','','','蚌埠市高新技术开发区','3','安徽省','蚌埠市','蚌埠市高新技术开发区','安徽省蚌埠市蚌埠市高新技术开发区',null,null,32.9184720,117.3259890),\n(232039,'340372000000','340300000000','340372','3403','蚌埠市经济开发区','','','蚌埠市经济开发区','3','安徽省','蚌埠市','蚌埠市经济开发区','安徽省蚌埠市蚌埠市经济开发区',null,null,32.9039730,117.4614330),\n(232085,'340400000000','340000000000','3404','34','淮南市','','淮南市','','2','安徽省','淮南市','','安徽省淮南市',null,null,32.6314200,116.8335900),\n(232086,'340401000000','340400000000','340401','3404','市辖区','','','市辖区','3','安徽省','淮南市','市辖区','安徽省淮南市市辖区',null,null,32.6314200,116.8335900),\n(232087,'340402000000','340400000000','340402','3404','大通区','','','大通区','3','安徽省','淮南市','大通区','安徽省淮南市大通区',null,null,32.6314900,117.0533500),\n(232165,'340403000000','340400000000','340403','3404','田家庵区','','','田家庵区','3','安徽省','淮南市','田家庵区','安徽省淮南市田家庵区',null,null,32.6470900,117.0174300),\n(232311,'340404000000','340400000000','340404','3404','谢家集区','','','谢家集区','3','安徽省','淮南市','谢家集区','安徽省淮南市谢家集区',null,null,32.5999600,116.8591300),\n(232418,'340405000000','340400000000','340405','3404','八公山区','','','八公山区','3','安徽省','淮南市','八公山区','安徽省淮南市八公山区',null,null,32.6314200,116.8335900),\n(232469,'340406000000','340400000000','340406','3404','潘集区','','','潘集区','3','安徽省','淮南市','潘集区','安徽省淮南市潘集区',null,null,32.7726300,116.8362600),\n(232661,'340421000000','340400000000','340421','3404','凤台县','','','凤台县','3','安徽省','淮南市','凤台县','安徽省淮南市凤台县',null,null,32.7094600,116.7107700),\n(232984,'340422000000','340400000000','340422','3404','寿县','','','寿县','3','安徽省','淮南市','寿县','安徽省淮南市寿县',null,null,32.5733200,116.7870800),\n(233301,'340500000000','340000000000','3405','34','马鞍山市','','马鞍山市','','2','安徽省','马鞍山市','','安徽省马鞍山市',null,null,31.5585600,118.8443200),\n(233302,'340501000000','340500000000','340501','3405','市辖区','','','市辖区','3','安徽省','马鞍山市','市辖区','安徽省马鞍山市市辖区',null,null,31.5585600,118.8443200),\n(233303,'340503000000','340500000000','340503','3405','花山区','','','花山区','3','安徽省','马鞍山市','花山区','安徽省马鞍山市花山区',null,null,31.6999600,118.5115000),\n(233381,'340504000000','340500000000','340504','3405','雨山区','','','雨山区','3','安徽省','马鞍山市','雨山区','安徽省马鞍山市雨山区',null,null,31.6821600,118.4985300),\n(233451,'340506000000','340500000000','340506','3405','博望区','','','博望区','3','安徽省','马鞍山市','博望区','安徽省马鞍山市博望区',null,null,31.5585600,118.8443200),\n(233500,'340521000000','340500000000','340521','3405','当涂县','','','当涂县','3','安徽省','马鞍山市','当涂县','安徽省马鞍山市当涂县',null,null,31.5699000,118.4978000),\n(233672,'340522000000','340500000000','340522','3405','含山县','','','含山县','3','安徽省','马鞍山市','含山县','安徽省马鞍山市含山县',null,null,31.7335800,118.1024100),\n(233804,'340523000000','340500000000','340523','3405','和县','','','和县','3','安徽省','马鞍山市','和县','安徽省马鞍山市和县',null,null,31.7442300,118.3514500),\n(233935,'340600000000','340000000000','3406','34','淮北市','','淮北市','','2','安徽省','淮北市','','安徽省淮北市',null,null,33.9914100,116.8280300),\n(233936,'340601000000','340600000000','340601','3406','市辖区','','','市辖区','3','安徽省','淮北市','市辖区','安徽省淮北市市辖区',null,null,33.9914100,116.8280300),\n(233937,'340602000000','340600000000','340602','3406','杜集区','','','杜集区','3','安徽省','淮北市','杜集区','安徽省淮北市杜集区',null,null,33.9914100,116.8280300),\n(233998,'340603000000','340600000000','340603','3406','相山区','','','相山区','3','安徽省','淮北市','相山区','安徽省淮北市相山区',null,null,33.9599900,116.7942500),\n(234095,'340604000000','340600000000','340604','3406','烈山区','','','烈山区','3','安徽省','淮北市','烈山区','安徽省淮北市烈山区',null,null,33.8957700,116.8132000),\n(234167,'340621000000','340600000000','340621','3406','濉溪县','','','濉溪县','3','安徽省','淮北市','濉溪县','安徽省淮北市濉溪县',null,null,33.9153700,116.7662000),\n(234428,'340700000000','340000000000','3407','34','铜陵市','','铜陵市','','2','安徽省','铜陵市','','安徽省铜陵市',null,null,30.9046600,117.8010300),\n(234429,'340701000000','340700000000','340701','3407','市辖区','','','市辖区','3','安徽省','铜陵市','市辖区','安徽省铜陵市市辖区',null,null,30.9046600,117.8010300),\n(234430,'340705000000','340700000000','340705','3407','铜官区','','','铜官区','3','安徽省','铜陵市','铜官区','安徽省铜陵市铜官区',null,null,30.9561400,117.8743100),\n(234490,'340706000000','340700000000','340706','3407','义安区','','','义安区','3','安徽省','铜陵市','义安区','安徽省铜陵市义安区',null,null,30.9527100,117.7914700),\n(234619,'340711000000','340700000000','340711','3407','郊区','','','郊区','3','安徽省','铜陵市','郊区','安徽省铜陵市郊区',null,null,30.9046600,117.8010300),\n(234664,'340722000000','340700000000','340722','3407','枞阳县','','','枞阳县','3','安徽省','铜陵市','枞阳县','安徽省铜陵市枞阳县',null,null,30.6996100,117.2201900),\n(234947,'340800000000','340000000000','3408','34','安庆市','','安庆市','','2','安徽省','安庆市','','安徽省安庆市',null,null,30.5122700,117.0342400),\n(234948,'340801000000','340800000000','340801','3408','市辖区','','','市辖区','3','安徽省','安庆市','市辖区','安徽省安庆市市辖区',null,null,30.5122700,117.0342400),\n(234949,'340802000000','340800000000','340802','3408','迎江区','','','迎江区','3','安徽省','安庆市','迎江区','安徽省安庆市迎江区',null,null,30.5115500,117.0908100),\n(235006,'340803000000','340800000000','340803','3408','大观区','','','大观区','3','安徽省','安庆市','大观区','安徽省安庆市大观区',null,null,30.5122700,117.0342400),\n(235094,'340811000000','340800000000','340811','3408','宜秀区','','','宜秀区','3','安徽省','安庆市','宜秀区','安徽省安庆市宜秀区',null,null,30.6135800,116.9893300),\n(235160,'340822000000','340800000000','340822','3408','怀宁县','','','怀宁县','3','安徽省','安庆市','怀宁县','安徽省安庆市怀宁县',null,null,30.7338100,116.8297400),\n(235424,'340824000000','340800000000','340824','3408','潜山县','','','潜山县','3','安徽省','安庆市','潜山县','安徽省安庆市潜山县',null,null,30.6310700,116.5813300),\n(235630,'340825000000','340800000000','340825','3408','太湖县','','','太湖县','3','安徽省','安庆市','太湖县','安徽省安庆市太湖县',null,null,30.4541100,116.3088500),\n(235836,'340826000000','340800000000','340826','3408','宿松县','','','宿松县','3','安徽省','安庆市','宿松县','安徽省安庆市宿松县',null,null,30.1536300,116.1292000),\n(236081,'340827000000','340800000000','340827','3408','望江县','','','望江县','3','安徽省','安庆市','望江县','安徽省安庆市望江县',null,null,30.1244200,116.6942300),\n(236231,'340828000000','340800000000','340828','3408','岳西县','','','岳西县','3','安徽省','安庆市','岳西县','安徽省安庆市岳西县',null,null,30.8493900,116.3599900),\n(236446,'340871000000','340800000000','340871','3408','安徽安庆经济开发区','','','安徽安庆经济开发区','3','安徽省','安庆市','安徽安庆经济开发区','安徽省安庆市安徽安庆经济开发区',null,null,30.5431100,117.0640790),\n(236475,'340881000000','340800000000','340881','3408','桐城市','','','桐城市','3','安徽省','安庆市','桐城市','安徽省安庆市桐城市',null,null,31.0358500,116.9741600),\n(236716,'341000000000','340000000000','3410','34','黄山市','','黄山市','','2','安徽省','黄山市','','安徽省黄山市',null,null,30.2729600,118.1416100),\n(236717,'341001000000','341000000000','341001','3410','市辖区','','','市辖区','3','安徽省','黄山市','市辖区','安徽省黄山市市辖区',null,null,30.2729600,118.1416100),\n(236718,'341002000000','341000000000','341002','3410','屯溪区','','','屯溪区','3','安徽省','黄山市','屯溪区','安徽省黄山市屯溪区',null,null,29.6958000,118.3151000),\n(236801,'341003000000','341000000000','341003','3410','黄山区','','','黄山区','3','安徽省','黄山市','黄山区','安徽省黄山市黄山区',null,null,30.2729600,118.1416100),\n(236903,'341004000000','341000000000','341004','3410','徽州区','','','徽州区','3','安徽省','黄山市','徽州区','安徽省黄山市徽州区',null,null,29.8279400,118.3368100),\n(236967,'341021000000','341000000000','341021','3410','歙县','','','歙县','3','安徽省','黄山市','歙县','安徽省黄山市歙县',null,null,29.8607600,118.4135900),\n(237194,'341022000000','341000000000','341022','3410','休宁县','','','休宁县','3','安徽省','黄山市','休宁县','安徽省黄山市休宁县',null,null,29.7861800,118.1824500),\n(237374,'341023000000','341000000000','341023','3410','黟县','','','黟县','3','安徽省','黄山市','黟县','安徽省黄山市黟县',null,null,29.9247600,117.9383500),\n(237453,'341024000000','341000000000','341024','3410','祁门县','','','祁门县','3','安徽省','黄山市','祁门县','安徽省黄山市祁门县',null,null,29.8540900,117.7171500),\n(237589,'341100000000','340000000000','3411','34','滁州市','','滁州市','','2','安徽省','滁州市','','安徽省滁州市',null,null,32.2948000,118.3055300),\n(237590,'341101000000','341100000000','341101','3411','市辖区','','','市辖区','3','安徽省','滁州市','市辖区','安徽省滁州市市辖区',null,null,32.2948000,118.3055300),\n(237591,'341102000000','341100000000','341102','3411','琅琊区','','','琅琊区','3','安徽省','滁州市','琅琊区','安徽省滁州市琅琊区',null,null,32.2948000,118.3055300),\n(237654,'341103000000','341100000000','341103','3411','南谯区','','','南谯区','3','安徽省','滁州市','南谯区','安徽省滁州市南谯区',null,null,32.3531700,118.1713800),\n(237754,'341122000000','341100000000','341122','3411','来安县','','','来安县','3','安徽省','滁州市','来安县','安徽省滁州市来安县',null,null,32.4521700,118.4357500),\n(237915,'341124000000','341100000000','341124','3411','全椒县','','','全椒县','3','安徽省','滁州市','全椒县','安徽省滁州市全椒县',null,null,32.0853000,118.2730300),\n(238041,'341125000000','341100000000','341125','3411','定远县','','','定远县','3','安徽省','滁州市','定远县','安徽省滁州市定远县',null,null,32.5299800,117.6985600),\n(238328,'341126000000','341100000000','341126','3411','凤阳县','','','凤阳县','3','安徽省','滁州市','凤阳县','安徽省滁州市凤阳县',null,null,32.8660000,117.5612400),\n(238593,'341171000000','341100000000','341171','3411','苏滁现代产业园','','','苏滁现代产业园','3','安徽省','滁州市','苏滁现代产业园','安徽省滁州市苏滁现代产业园',null,null,32.3083800,118.4173200),\n(238599,'341172000000','341100000000','341172','3411','滁州经济技术开发区','','','滁州经济技术开发区','3','安徽省','滁州市','滁州经济技术开发区','安徽省滁州市滁州经济技术开发区',null,null,32.3192370,118.3661800),\n(238619,'341181000000','341100000000','341181','3411','天长市','','','天长市','3','安徽省','滁州市','天长市','安徽省滁州市天长市',null,null,32.6894500,119.0035500),\n(238812,'341182000000','341100000000','341182','3411','明光市','','','明光市','3','安徽省','滁州市','明光市','安徽省滁州市明光市',null,null,32.7769900,117.9894400),\n(238990,'341200000000','340000000000','3412','34','阜阳市','','阜阳市','','2','安徽省','阜阳市','','安徽省阜阳市',null,null,32.9130300,115.8566800),\n(238991,'341201000000','341200000000','341201','3412','市辖区','','','市辖区','3','安徽省','阜阳市','市辖区','安徽省阜阳市市辖区',null,null,32.9130300,115.8566800),\n(238992,'341202000000','341200000000','341202','3412','颍州区','','','颍州区','3','安徽省','阜阳市','颍州区','安徽省阜阳市颍州区',null,null,32.8832700,115.8067200),\n(239153,'341203000000','341200000000','341203','3412','颍东区','','','颍东区','3','安徽省','阜阳市','颍东区','安徽省阜阳市颍东区',null,null,32.9130300,115.8566800),\n(239285,'341204000000','341200000000','341204','3412','颍泉区','','','颍泉区','3','安徽省','阜阳市','颍泉区','安徽省阜阳市颍泉区',null,null,32.9250500,115.8084700),\n(239416,'341221000000','341200000000','341221','3412','临泉县','','','临泉县','3','安徽省','阜阳市','临泉县','安徽省阜阳市临泉县',null,null,33.0645700,115.2581100),\n(239840,'341222000000','341200000000','341222','3412','太和县','','','太和县','3','安徽省','阜阳市','太和县','安徽省阜阳市太和县',null,null,33.1602600,115.6220300),\n(240187,'341225000000','341200000000','341225','3412','阜南县','','','阜南县','3','安徽省','阜阳市','阜南县','安徽省阜阳市阜南县',null,null,32.6588700,115.5931900),\n(240548,'341226000000','341200000000','341226','3412','颍上县','','','颍上县','3','安徽省','阜阳市','颍上县','安徽省阜阳市颍上县',null,null,32.6289300,116.2645500),\n(240930,'341271000000','341200000000','341271','3412','阜阳合肥现代产业园区','','','阜阳合肥现代产业园区','3','安徽省','阜阳市','阜阳合肥现代产业园区','安徽省阜阳市阜阳合肥现代产业园区',null,null,32.8032990,115.9066160),\n(240941,'341272000000','341200000000','341272','3412','阜阳经济技术开发区','','','阜阳经济技术开发区','3','安徽省','阜阳市','阜阳经济技术开发区','安徽省阜阳市阜阳经济技术开发区',null,null,32.8643610,115.8567890),\n(240959,'341282000000','341200000000','341282','3412','界首市','','','界首市','3','安徽省','阜阳市','界首市','安徽省阜阳市界首市',null,null,33.2572200,115.3743600),\n(241138,'341300000000','340000000000','3413','34','宿州市','','宿州市','','2','安徽省','宿州市','','安徽省宿州市',null,null,33.6400400,116.9772800),\n(241139,'341301000000','341300000000','341301','3413','市辖区','','','市辖区','3','安徽省','宿州市','市辖区','安徽省宿州市市辖区',null,null,33.6400400,116.9772800),\n(241140,'341302000000','341300000000','341302','3413','埇桥区','','','埇桥区','3','安徽省','宿州市','埇桥区','安徽省宿州市埇桥区',null,null,33.6400400,116.9772800),\n(241572,'341321000000','341300000000','341321','3413','砀山县','','','砀山县','3','安徽省','宿州市','砀山县','安徽省宿州市砀山县',null,null,34.4409700,116.3660600),\n(241756,'341322000000','341300000000','341322','3413','萧县','','','萧县','3','安徽省','宿州市','萧县','安徽省宿州市萧县',null,null,34.1887600,116.9472400),\n(242082,'341323000000','341300000000','341323','3413','灵璧县','','','灵璧县','3','安徽省','宿州市','灵璧县','安徽省宿州市灵璧县',null,null,33.5423200,117.5585500),\n(242413,'341324000000','341300000000','341324','3413','泗县','','','泗县','3','安徽省','宿州市','泗县','安徽省宿州市泗县',null,null,33.4828900,117.9110600),\n(242625,'341371000000','341300000000','341371','3413','宿州马鞍山现代产业园区','','','宿州马鞍山现代产业园区','3','安徽省','宿州市','宿州马鞍山现代产业园区','安徽省宿州市宿州马鞍山现代产业园区',null,null,33.6752890,117.2387540),\n(242638,'341372000000','341300000000','341372','3413','宿州经济技术开发区','','','宿州经济技术开发区','3','安徽省','宿州市','宿州经济技术开发区','安徽省宿州市宿州经济技术开发区',null,null,33.6076850,117.0133290),\n(242654,'341500000000','340000000000','3415','34','六安市','','六安市','','2','安徽省','六安市','','安徽省六安市',null,null,31.7493300,116.5394900),\n(242655,'341501000000','341500000000','341501','3415','市辖区','','','市辖区','3','安徽省','六安市','市辖区','安徽省六安市市辖区',null,null,31.7493300,116.5394900),\n(242656,'341502000000','341500000000','341502','3415','金安区','','','金安区','3','安徽省','六安市','金安区','安徽省六安市金安区',null,null,31.7493300,116.5394900),\n(243020,'341503000000','341500000000','341503','3415','裕安区','','','裕安区','3','安徽省','六安市','裕安区','安徽省六安市裕安区',null,null,31.7379500,116.4799500),\n(243356,'341504000000','341500000000','341504','3415','叶集区','','','叶集区','3','安徽省','六安市','叶集区','安徽省六安市叶集区',null,null,31.8512200,115.9133000),\n(243440,'341522000000','341500000000','341522','3415','霍邱县','','','霍邱县','3','安徽省','六安市','霍邱县','安徽省六安市霍邱县',null,null,32.3532000,116.2782300),\n(243886,'341523000000','341500000000','341523','3415','舒城县','','','舒城县','3','安徽省','六安市','舒城县','安徽省六安市舒城县',null,null,31.4620900,116.9487000),\n(244335,'341524000000','341500000000','341524','3415','金寨县','','','金寨县','3','安徽省','六安市','金寨县','安徽省六安市金寨县',null,null,31.7271900,115.9341800),\n(244591,'341525000000','341500000000','341525','3415','霍山县','','','霍山县','3','安徽省','六安市','霍山县','安徽省六安市霍山县',null,null,31.3927900,116.3326900),\n(244755,'341600000000','340000000000','3416','34','亳州市','','亳州市','','2','安徽省','亳州市','','安徽省亳州市',null,null,33.8764100,115.7791400),\n(244756,'341601000000','341600000000','341601','3416','市辖区','','','市辖区','3','安徽省','亳州市','市辖区','安徽省亳州市市辖区',null,null,33.8764100,115.7791400),\n(244757,'341602000000','341600000000','341602','3416','谯城区','','','谯城区','3','安徽省','亳州市','谯城区','安徽省亳州市谯城区',null,null,33.8764100,115.7791400),\n(245087,'341621000000','341600000000','341621','3416','涡阳县','','','涡阳县','3','安徽省','亳州市','涡阳县','安徽省亳州市涡阳县',null,null,33.4928500,116.2158100),\n(245496,'341622000000','341600000000','341622','3416','蒙城县','','','蒙城县','3','安徽省','亳州市','蒙城县','安徽省亳州市蒙城县',null,null,33.2658400,116.5645000),\n(245811,'341623000000','341600000000','341623','3416','利辛县','','','利辛县','3','安徽省','亳州市','利辛县','安徽省亳州市利辛县',null,null,33.1448400,116.2083900),\n(246200,'341700000000','340000000000','3417','34','池州市','','池州市','','2','安徽省','池州市','','安徽省池州市',null,null,30.6867300,117.5673300),\n(246201,'341701000000','341700000000','341701','3417','市辖区','','','市辖区','3','安徽省','池州市','市辖区','安徽省池州市市辖区',null,null,30.6867300,117.5673300),\n(246202,'341702000000','341700000000','341702','3417','贵池区','','','贵池区','3','安徽省','池州市','贵池区','安徽省池州市贵池区',null,null,30.6867300,117.5673300),\n(246454,'341721000000','341700000000','341721','3417','东至县','','','东至县','3','安徽省','池州市','东至县','安徽省池州市东至县',null,null,30.0966300,117.0276600),\n(246725,'341722000000','341700000000','341722','3417','石台县','','','石台县','3','安徽省','池州市','石台县','安徽省池州市石台县',null,null,30.2102600,117.4861900),\n(246820,'341723000000','341700000000','341723','3417','青阳县','','','青阳县','3','安徽省','池州市','青阳县','安徽省池州市青阳县',null,null,30.6393500,117.8474900),\n(246965,'341800000000','340000000000','3418','34','宣城市','','宣城市','','2','安徽省','宣城市','','安徽省宣城市',null,null,30.9462200,118.7563400),\n(246966,'341801000000','341800000000','341801','3418','市辖区','','','市辖区','3','安徽省','宣城市','市辖区','安徽省宣城市市辖区',null,null,30.9462200,118.7563400),\n(246967,'341802000000','341800000000','341802','3418','宣州区','','','宣州区','3','安徽省','宣城市','宣州区','安徽省宣城市宣州区',null,null,30.9462200,118.7563400),\n(247202,'341821000000','341800000000','341821','3418','郎溪县','','','郎溪县','3','安徽省','宣城市','郎溪县','安徽省宣城市郎溪县',null,null,31.1265800,119.1794400),\n(247320,'341822000000','341800000000','341822','3418','广德县','','','广德县','3','安徽省','宣城市','广德县','安徽省宣城市广德县',null,null,30.8938000,119.4170500),\n(247469,'341823000000','341800000000','341823','3418','泾县','','','泾县','3','安徽省','宣城市','泾县','安徽省宣城市泾县',null,null,30.6885300,118.4197000),\n(247625,'341824000000','341800000000','341824','3418','绩溪县','','','绩溪县','3','安徽省','宣城市','绩溪县','安徽省宣城市绩溪县',null,null,30.0663300,118.5799300),\n(247720,'341825000000','341800000000','341825','3418','旌德县','','','旌德县','3','安徽省','宣城市','旌德县','安徽省宣城市旌德县',null,null,30.2863600,118.5404500),\n(247799,'341871000000','341800000000','341871','3418','宣城市经济开发区','','','宣城市经济开发区','3','安徽省','宣城市','宣城市经济开发区','安徽省宣城市宣城市经济开发区',null,null,30.9303440,118.7242740),\n(247824,'341881000000','341800000000','341881','3418','宁国市','','','宁国市','3','安徽省','宣城市','宁国市','安徽省宣城市宁国市',null,null,30.6336400,118.9833600),\n(247968,'350000000000','0','35','0','福建省','福建省','','','1','福建省','','','福建省',null,null,null,null),\n(247969,'350100000000','350000000000','3501','35','福州市','','福州市','','2','福建省','福州市','','福建省福州市',null,null,26.0476900,119.2734500),\n(247970,'350101000000','350100000000','350101','3501','市辖区','','','市辖区','3','福建省','福州市','市辖区','福建省福州市市辖区',null,null,26.0476900,119.2734500),\n(247971,'350102000000','350100000000','350102','3501','鼓楼区','','','鼓楼区','3','福建省','福州市','鼓楼区','福建省福州市鼓楼区',null,null,26.0819800,119.3040500),\n(248051,'350103000000','350100000000','350103','3501','台江区','','','台江区','3','福建省','福州市','台江区','福建省福州市台江区',null,null,26.0527000,119.3141400),\n(248114,'350104000000','350100000000','350104','3501','仓山区','','','仓山区','3','福建省','福州市','仓山区','福建省福州市仓山区',null,null,26.0476900,119.2734500),\n(248304,'350105000000','350100000000','350105','3501','马尾区','','','马尾区','3','福建省','福州市','马尾区','福建省福州市马尾区',null,null,25.9893900,119.4556000),\n(248384,'350111000000','350100000000','350111','3501','晋安区','','','晋安区','3','福建省','福州市','晋安区','福建省福州市晋安区',null,null,26.0813500,119.3284200),\n(248583,'350121000000','350100000000','350121','3501','闽侯县','','','闽侯县','3','福建省','福州市','闽侯县','福建省福州市闽侯县',null,null,26.1502100,119.1313900),\n(248926,'350122000000','350100000000','350122','3501','连江县','','','连江县','3','福建省','福州市','连江县','福建省福州市连江县',null,null,26.1975300,119.5395700),\n(249230,'350123000000','350100000000','350123','3501','罗源县','','','罗源县','3','福建省','福州市','罗源县','福建省福州市罗源县',null,null,26.4893900,119.5496900),\n(249444,'350124000000','350100000000','350124','3501','闽清县','','','闽清县','3','福建省','福州市','闽清县','福建省福州市闽清县',null,null,26.2211700,118.8635200),\n(249753,'350125000000','350100000000','350125','3501','永泰县','','','永泰县','3','福建省','福州市','永泰县','福建省福州市永泰县',null,null,25.8667200,118.9325800),\n(250042,'350128000000','350100000000','350128','3501','平潭县','','','平潭县','3','福建省','福州市','平潭县','福建省福州市平潭县',null,null,25.4987600,119.7901000),\n(250272,'350181000000','350100000000','350181','3501','福清市','','','福清市','3','福建省','福州市','福清市','福建省福州市福清市',null,null,25.7202400,119.3841100),\n(250808,'350182000000','350100000000','350182','3501','长乐市','','','长乐市','3','福建省','福州市','长乐市','福建省福州市长乐市',null,null,25.9628300,119.5232400),\n(251087,'350200000000','350000000000','3502','35','厦门市','','厦门市','','2','福建省','厦门市','','福建省厦门市',null,null,24.4840500,118.0339400),\n(251088,'350201000000','350200000000','350201','3502','市辖区','','','市辖区','3','福建省','厦门市','市辖区','福建省厦门市市辖区',null,null,24.4840500,118.0339400),\n(251089,'350203000000','350200000000','350203','3502','思明区','','','思明区','3','福建省','厦门市','思明区','福建省厦门市思明区',null,null,24.4457900,118.0824300),\n(251199,'350205000000','350200000000','350205','3502','海沧区','','','海沧区','3','福建省','厦门市','海沧区','福建省厦门市海沧区',null,null,24.4840500,118.0339400),\n(251250,'350206000000','350200000000','350206','3502','湖里区','','','湖里区','3','福建省','厦门市','湖里区','福建省厦门市湖里区',null,null,24.5118000,118.1457700),\n(251314,'350211000000','350200000000','350211','3502','集美区','','','集美区','3','福建省','厦门市','集美区','福建省厦门市集美区',null,null,24.5759100,118.0972800),\n(251394,'350212000000','350200000000','350212','3502','同安区','','','同安区','3','福建省','厦门市','同安区','福建省厦门市同安区',null,null,24.7228600,118.1520700),\n(251545,'350213000000','350200000000','350213','3502','翔安区','','','翔安区','3','福建省','厦门市','翔安区','福建省厦门市翔安区',null,null,24.6185400,118.2472200),\n(251672,'350300000000','350000000000','3503','35','莆田市','','莆田市','','2','福建省','莆田市','','福建省莆田市',null,null,25.4187800,118.9947200),\n(251673,'350301000000','350300000000','350301','3503','市辖区','','','市辖区','3','福建省','莆田市','市辖区','福建省莆田市市辖区',null,null,25.4187800,118.9947200),\n(251674,'350302000000','350300000000','350302','3503','城厢区','','','城厢区','3','福建省','莆田市','城厢区','福建省莆田市城厢区',null,null,25.4187800,118.9947200),\n(251802,'350303000000','350300000000','350303','3503','涵江区','','','涵江区','3','福建省','莆田市','涵江区','福建省莆田市涵江区',null,null,25.4587900,119.1163000),\n(252016,'350304000000','350300000000','350304','3503','荔城区','','','荔城区','3','福建省','莆田市','荔城区','福建省莆田市荔城区',null,null,25.4313100,119.0150100),\n(252153,'350305000000','350300000000','350305','3503','秀屿区','','','秀屿区','3','福建省','莆田市','秀屿区','福建省莆田市秀屿区',null,null,25.3183900,119.1064200),\n(252366,'350322000000','350300000000','350322','3503','仙游县','','','仙游县','3','福建省','莆田市','仙游县','福建省莆田市仙游县',null,null,25.3621500,118.6918100),\n(252711,'350400000000','350000000000','3504','35','三明市','','三明市','','2','福建省','三明市','','福建省三明市',null,null,26.2716800,117.6457900),\n(252712,'350401000000','350400000000','350401','3504','市辖区','','','市辖区','3','福建省','三明市','市辖区','福建省三明市市辖区',null,null,26.2716800,117.6457900),\n(252713,'350402000000','350400000000','350402','3504','梅列区','','','梅列区','3','福建省','三明市','梅列区','福建省三明市梅列区',null,null,26.2716800,117.6457900),\n(252772,'350403000000','350400000000','350403','3504','三元区','','','三元区','3','福建省','三明市','三元区','福建省三明市三元区',null,null,26.2338100,117.6081000),\n(252861,'350421000000','350400000000','350421','3504','明溪县','','','明溪县','3','福建省','三明市','明溪县','福建省三明市明溪县',null,null,26.3559500,117.2021900),\n(252967,'350423000000','350400000000','350423','3504','清流县','','','清流县','3','福建省','三明市','清流县','福建省三明市清流县',null,null,26.1778100,116.8169400),\n(253100,'350424000000','350400000000','350424','3504','宁化县','','','宁化县','3','福建省','三明市','宁化县','福建省三明市宁化县',null,null,26.2617800,116.6544300),\n(253345,'350425000000','350400000000','350425','3504','大田县','','','大田县','3','福建省','三明市','大田县','福建省三明市大田县',null,null,25.6926100,117.8471300),\n(253644,'350426000000','350400000000','350426','3504','尤溪县','','','尤溪县','3','福建省','三明市','尤溪县','福建省三明市尤溪县',null,null,26.1700400,118.1904900),\n(253926,'350427000000','350400000000','350427','3504','沙县','','','沙县','3','福建省','三明市','沙县','福建省三明市沙县',null,null,26.3961700,117.7926800),\n(254131,'350428000000','350400000000','350428','3504','将乐县','','','将乐县','3','福建省','三明市','将乐县','福建省三明市将乐县',null,null,26.7290400,117.4709600),\n(254299,'350429000000','350400000000','350429','3504','泰宁县','','','泰宁县','3','福建省','三明市','泰宁县','福建省三明市泰宁县',null,null,26.9001200,117.1758000),\n(254428,'350430000000','350400000000','350430','3504','建宁县','','','建宁县','3','福建省','三明市','建宁县','福建省三明市建宁县',null,null,26.8309200,116.8460400),\n(254539,'350481000000','350400000000','350481','3504','永安市','','','永安市','3','福建省','三明市','永安市','福建省三明市永安市',null,null,25.9413800,117.3651800),\n(254816,'350500000000','350000000000','3505','35','泉州市','','泉州市','','2','福建省','泉州市','','福建省泉州市',null,null,24.8894600,118.6130000),\n(254817,'350501000000','350500000000','350501','3505','市辖区','','','市辖区','3','福建省','泉州市','市辖区','福建省泉州市市辖区',null,null,24.8894600,118.6130000),\n(254818,'350502000000','350500000000','350502','3505','鲤城区','','','鲤城区','3','福建省','泉州市','鲤城区','福建省泉州市鲤城区',null,null,24.9075000,118.5868700),\n(254909,'350503000000','350500000000','350503','3505','丰泽区','','','丰泽区','3','福建省','泉州市','丰泽区','福建省泉州市丰泽区',null,null,24.8894600,118.6130000),\n(254996,'350504000000','350500000000','350504','3505','洛江区','','','洛江区','3','福建省','泉州市','洛江区','福建省泉州市洛江区',null,null,24.9399000,118.6712000),\n(255090,'350505000000','350500000000','350505','3505','泉港区','','','泉港区','3','福建省','泉州市','泉港区','福建省泉州市泉港区',null,null,25.1201400,118.9159600),\n(255200,'350521000000','350500000000','350521','3505','惠安县','','','惠安县','3','福建省','泉州市','惠安县','福建省泉州市惠安县',null,null,25.0306500,118.7969500),\n(255517,'350524000000','350500000000','350524','3505','安溪县','','','安溪县','3','福建省','泉州市','安溪县','福建省泉州市安溪县',null,null,25.0554400,118.1868500),\n(256026,'350525000000','350500000000','350525','3505','永春县','','','永春县','3','福建省','泉州市','永春县','福建省泉州市永春县',null,null,25.3218800,118.2942400),\n(256285,'350526000000','350500000000','350526','3505','德化县','','','德化县','3','福建省','泉州市','德化县','福建省泉州市德化县',null,null,25.4916000,118.2409800),\n(256518,'350527000000','350500000000','350527','3505','金门县','','','金门县','3','福建省','泉州市','金门县','福建省泉州市金门县',null,null,24.4293100,118.3227700),\n(256519,'350581000000','350500000000','350581','3505','石狮市','','','石狮市','3','福建省','泉州市','石狮市','福建省泉州市石狮市',null,null,24.7319000,118.6479200),\n(256656,'350582000000','350500000000','350582','3505','晋江市','','','晋江市','3','福建省','泉州市','晋江市','福建省泉州市晋江市',null,null,24.7814400,118.5519900),\n(257078,'350583000000','350500000000','350583','3505','南安市','','','南安市','3','福建省','泉州市','南安市','福建省泉州市南安市',null,null,24.9604000,118.3862700),\n(257531,'350600000000','350000000000','3506','35','漳州市','','漳州市','','2','福建省','漳州市','','福建省漳州市',null,null,24.5033000,117.7098400),\n(257532,'350601000000','350600000000','350601','3506','市辖区','','','市辖区','3','福建省','漳州市','市辖区','福建省漳州市市辖区',null,null,24.5033000,117.7098400),\n(257533,'350602000000','350600000000','350602','3506','芗城区','','','芗城区','3','福建省','漳州市','芗城区','福建省漳州市芗城区',null,null,24.5106700,117.6539100),\n(257719,'350603000000','350600000000','350603','3506','龙文区','','','龙文区','3','福建省','漳州市','龙文区','福建省漳州市龙文区',null,null,24.5033000,117.7098400),\n(257796,'350622000000','350600000000','350622','3506','云霄县','','','云霄县','3','福建省','漳州市','云霄县','福建省漳州市云霄县',null,null,23.9580600,117.3396500),\n(258020,'350623000000','350600000000','350623','3506','漳浦县','','','漳浦县','3','福建省','漳州市','漳浦县','福建省漳州市漳浦县',null,null,24.1171000,117.6137200),\n(258376,'350624000000','350600000000','350624','3506','诏安县','','','诏安县','3','福建省','漳州市','诏安县','福建省漳州市诏安县',null,null,23.7115200,117.1750800),\n(258640,'350625000000','350600000000','350625','3506','长泰县','','','长泰县','3','福建省','漳州市','长泰县','福建省漳州市长泰县',null,null,24.6258000,117.7594800),\n(258734,'350626000000','350600000000','350626','3506','东山县','','','东山县','3','福建省','漳州市','东山县','福建省漳州市东山县',null,null,23.7013200,117.4296400),\n(258819,'350627000000','350600000000','350627','3506','南靖县','','','南靖县','3','福建省','漳州市','南靖县','福建省漳州市南靖县',null,null,24.5145300,117.3574200),\n(259034,'350628000000','350600000000','350628','3506','平和县','','','平和县','3','福建省','漳州市','平和县','福建省漳州市平和县',null,null,24.3634400,117.3158700),\n(259309,'350629000000','350600000000','350629','3506','华安县','','','华安县','3','福建省','漳州市','华安县','福建省漳州市华安县',null,null,25.0044600,117.5341400),\n(259418,'350681000000','350600000000','350681','3506','龙海市','','','龙海市','3','福建省','漳州市','龙海市','福建省漳州市龙海市',null,null,24.4465800,117.8181300),\n(259741,'350700000000','350000000000','3507','35','南平市','','南平市','','2','福建省','南平市','','福建省南平市',null,null,27.3317500,118.1204300),\n(259742,'350701000000','350700000000','350701','3507','市辖区','','','市辖区','3','福建省','南平市','市辖区','福建省南平市市辖区',null,null,27.3317500,118.1204300),\n(259743,'350702000000','350700000000','350702','3507','延平区','','','延平区','3','福建省','南平市','延平区','福建省南平市延平区',null,null,26.6379800,118.1820200),\n(260082,'350703000000','350700000000','350703','3507','建阳区','','','建阳区','3','福建省','南平市','建阳区','福建省南平市建阳区',null,null,27.3317500,118.1204300),\n(260317,'350721000000','350700000000','350721','3507','顺昌县','','','顺昌县','3','福建省','南平市','顺昌县','福建省南平市顺昌县',null,null,26.7930100,117.8103600),\n(260479,'350722000000','350700000000','350722','3507','浦城县','','','浦城县','3','福建省','南平市','浦城县','福建省南平市浦城县',null,null,27.9172100,118.5413800),\n(260803,'350723000000','350700000000','350723','3507','光泽县','','','光泽县','3','福建省','南平市','光泽县','福建省南平市光泽县',null,null,27.5410000,117.3340800),\n(260907,'350724000000','350700000000','350724','3507','松溪县','','','松溪县','3','福建省','南平市','松溪县','福建省南平市松溪县',null,null,27.5262900,118.7854000),\n(261026,'350725000000','350700000000','350725','3507','政和县','','','政和县','3','福建省','南平市','政和县','福建省南平市政和县',null,null,27.3660900,118.8575400),\n(261170,'350781000000','350700000000','350781','3507','邵武市','','','邵武市','3','福建省','南平市','邵武市','福建省南平市邵武市',null,null,27.3403600,117.4925300),\n(261366,'350782000000','350700000000','350782','3507','武夷山市','','','武夷山市','3','福建省','南平市','武夷山市','福建省南平市武夷山市',null,null,27.7567100,118.0354800),\n(261519,'350783000000','350700000000','350783','3507','建瓯市','','','建瓯市','3','福建省','南平市','建瓯市','福建省南平市建瓯市',null,null,27.0226600,118.3049800),\n(261793,'350800000000','350000000000','3508','35','龙岩市','','龙岩市','','2','福建省','龙岩市','','福建省龙岩市',null,null,25.0983900,117.0373600),\n(261794,'350801000000','350800000000','350801','3508','市辖区','','','市辖区','3','福建省','龙岩市','市辖区','福建省龙岩市市辖区',null,null,25.0983900,117.0373600),\n(261795,'350802000000','350800000000','350802','3508','新罗区','','','新罗区','3','福建省','龙岩市','新罗区','福建省龙岩市新罗区',null,null,25.0983900,117.0373600),\n(262153,'350803000000','350800000000','350803','3508','永定区','','','永定区','3','福建省','龙岩市','永定区','福建省龙岩市永定区',null,null,24.7230300,116.7320200),\n(262458,'350821000000','350800000000','350821','3508','长汀县','','','长汀县','3','福建省','龙岩市','长汀县','福建省龙岩市长汀县',null,null,25.8334800,116.3576500),\n(262777,'350823000000','350800000000','350823','3508','上杭县','','','上杭县','3','福建省','龙岩市','上杭县','福建省龙岩市上杭县',null,null,25.0494300,116.4202600),\n(263145,'350824000000','350800000000','350824','3508','武平县','','','武平县','3','福建省','龙岩市','武平县','福建省龙岩市武平县',null,null,25.0953500,116.1003900),\n(263382,'350825000000','350800000000','350825','3508','连城县','','','连城县','3','福建省','龙岩市','连城县','福建省龙岩市连城县',null,null,25.7099700,116.7548600),\n(263647,'350881000000','350800000000','350881','3508','漳平市','','','漳平市','3','福建省','龙岩市','漳平市','福建省龙岩市漳平市',null,null,25.2901300,117.4200100),\n(263863,'350900000000','350000000000','3509','35','宁德市','','宁德市','','2','福建省','宁德市','','福建省宁德市',null,null,26.6602200,119.5262300),\n(263864,'350901000000','350900000000','350901','3509','市辖区','','','市辖区','3','福建省','宁德市','市辖区','福建省宁德市市辖区',null,null,26.6602200,119.5262300),\n(263865,'350902000000','350900000000','350902','3509','蕉城区','','','蕉城区','3','福建省','宁德市','蕉城区','福建省宁德市蕉城区',null,null,26.6602200,119.5262300),\n(264211,'350921000000','350900000000','350921','3509','霞浦县','','','霞浦县','3','福建省','宁德市','霞浦县','福建省宁德市霞浦县',null,null,26.8851700,120.0055600),\n(264544,'350922000000','350900000000','350922','3509','古田县','','','古田县','3','福建省','宁德市','古田县','福建省宁德市古田县',null,null,26.5776200,118.7460600),\n(264850,'350923000000','350900000000','350923','3509','屏南县','','','屏南县','3','福建省','宁德市','屏南县','福建省宁德市屏南县',null,null,26.9085300,118.9857800),\n(265021,'350924000000','350900000000','350924','3509','寿宁县','','','寿宁县','3','福建省','宁德市','寿宁县','福建省宁德市寿宁县',null,null,27.4605400,119.5047900),\n(265241,'350925000000','350900000000','350925','3509','周宁县','','','周宁县','3','福建省','宁德市','周宁县','福建省宁德市周宁县',null,null,27.1047400,119.3389900),\n(265398,'350926000000','350900000000','350926','3509','柘荣县','','','柘荣县','3','福建省','宁德市','柘荣县','福建省宁德市柘荣县',null,null,27.2351300,119.9008500),\n(265524,'350981000000','350900000000','350981','3509','福安市','','','福安市','3','福建省','宁德市','福安市','福建省宁德市福安市',null,null,27.0879700,119.6476800),\n(266034,'350982000000','350900000000','350982','3509','福鼎市','','','福鼎市','3','福建省','宁德市','福鼎市','福建省宁德市福鼎市',null,null,27.3243600,120.2167100),\n(266337,'360000000000','0','36','0','江西省','江西省','','','1','江西省','','','江西省',null,null,null,null),\n(266338,'360100000000','360000000000','3601','36','南昌市','','南昌市','','2','江西省','南昌市','','江西省南昌市',null,null,28.6850300,115.8992500),\n(266339,'360101000000','360100000000','360101','3601','市辖区','','','市辖区','3','江西省','南昌市','市辖区','江西省南昌市市辖区',null,null,28.6850300,115.8992500),\n(266340,'360102000000','360100000000','360102','3601','东湖区','','','东湖区','3','江西省','南昌市','东湖区','江西省南昌市东湖区',null,null,28.6850300,115.8992500),\n(266528,'360103000000','360100000000','360103','3601','西湖区','','','西湖区','3','江西省','南昌市','西湖区','江西省南昌市西湖区',null,null,28.6561900,115.8768300),\n(266699,'360104000000','360100000000','360104','3601','青云谱区','','','青云谱区','3','江西省','南昌市','青云谱区','江西省南昌市青云谱区',null,null,28.6208400,115.9258000),\n(266795,'360105000000','360100000000','360105','3601','湾里区','','','湾里区','3','江西省','南昌市','湾里区','江西省南昌市湾里区',null,null,28.7147900,115.7308300),\n(266861,'360111000000','360100000000','360111','3601','青山湖区','','','青山湖区','3','江西省','南昌市','青山湖区','江西省南昌市青山湖区',null,null,28.6819400,115.9619100),\n(267156,'360112000000','360100000000','360112','3601','新建区','','','新建区','3','江西省','南昌市','新建区','江西省南昌市新建区',null,null,28.6925000,115.8152900),\n(267599,'360121000000','360100000000','360121','3601','南昌县','','','南昌县','3','江西省','南昌市','南昌县','江西省南昌市南昌县',null,null,28.5453800,115.9442200),\n(268040,'360123000000','360100000000','360123','3601','安义县','','','安义县','3','江西省','南昌市','安义县','江西省南昌市安义县',null,null,28.8444400,115.5492700),\n(268186,'360124000000','360100000000','360124','3601','进贤县','','','进贤县','3','江西省','南昌市','进贤县','江西省南昌市进贤县',null,null,28.3773700,116.2414500),\n(268541,'360200000000','360000000000','3602','36','景德镇市','','景德镇市','','2','江西省','景德镇市','','江西省景德镇市',null,null,29.2732400,117.1836600),\n(268542,'360201000000','360200000000','360201','3602','市辖区','','','市辖区','3','江西省','景德镇市','市辖区','江西省景德镇市市辖区',null,null,29.2732400,117.1836600),\n(268543,'360202000000','360200000000','360202','3602','昌江区','','','昌江区','3','江西省','景德镇市','昌江区','江西省景德镇市昌江区',null,null,29.2732400,117.1836600),\n(268641,'360203000000','360200000000','360203','3602','珠山区','','','珠山区','3','江西省','景德镇市','珠山区','江西省景德镇市珠山区',null,null,29.3000500,117.2027500),\n(268762,'360222000000','360200000000','360222','3602','浮梁县','','','浮梁县','3','江西省','景德镇市','浮梁县','江西省景德镇市浮梁县',null,null,29.3515900,117.2152300),\n(268976,'360281000000','360200000000','360281','3602','乐平市','','','乐平市','3','江西省','景德镇市','乐平市','江西省景德镇市乐平市',null,null,28.9617300,117.1290000),\n(269358,'360300000000','360000000000','3603','36','萍乡市','','萍乡市','','2','江西省','萍乡市','','江西省萍乡市',null,null,27.6155200,113.8716300),\n(269359,'360301000000','360300000000','360301','3603','市辖区','','','市辖区','3','江西省','萍乡市','市辖区','江西省萍乡市市辖区',null,null,27.6155200,113.8716300),\n(269360,'360302000000','360300000000','360302','3603','安源区','','','安源区','3','江西省','萍乡市','安源区','江西省萍乡市安源区',null,null,27.6155200,113.8716300),\n(269508,'360313000000','360300000000','360313','3603','湘东区','','','湘东区','3','江西省','萍乡市','湘东区','江西省萍乡市湘东区',null,null,27.6406900,113.7342100),\n(269676,'360321000000','360300000000','360321','3603','莲花县','','','莲花县','3','江西省','萍乡市','莲花县','江西省萍乡市莲花县',null,null,27.1276100,113.9612300),\n(269853,'360322000000','360300000000','360322','3603','上栗县','','','上栗县','3','江西省','萍乡市','上栗县','江西省萍乡市上栗县',null,null,27.8804200,113.7953700),\n(270038,'360323000000','360300000000','360323','3603','芦溪县','','','芦溪县','3','江西省','萍乡市','芦溪县','江西省萍乡市芦溪县',null,null,27.6306400,114.0295600),\n(270203,'360400000000','360000000000','3604','36','九江市','','九江市','','2','江西省','九江市','','江西省九江市',null,null,29.7277600,115.9899900),\n(270204,'360401000000','360400000000','360401','3604','市辖区','','','市辖区','3','江西省','九江市','市辖区','江西省九江市市辖区',null,null,29.7277600,115.9899900),\n(270205,'360402000000','360400000000','360402','3604','濂溪区','','','濂溪区','3','江西省','九江市','濂溪区','江西省九江市濂溪区',null,null,29.6718300,115.9891300),\n(270347,'360403000000','360400000000','360403','3604','浔阳区','','','浔阳区','3','江西省','九江市','浔阳区','江西省九江市浔阳区',null,null,29.7277600,115.9899900),\n(270463,'360404000000','360400000000','360404','3604','柴桑区','','','柴桑区','3','江西省','九江市','柴桑区','江西省九江市柴桑区',null,null,29.6085500,115.9113500),\n(270628,'360423000000','360400000000','360423','3604','武宁县','','','武宁县','3','江西省','九江市','武宁县','江西省九江市武宁县',null,null,29.2562200,115.1006500),\n(270850,'360424000000','360400000000','360424','3604','修水县','','','修水县','3','江西省','九江市','修水县','江西省九江市修水县',null,null,29.0253300,114.5468800),\n(271296,'360425000000','360400000000','360425','3604','永修县','','','永修县','3','江西省','九江市','永修县','江西省九江市永修县',null,null,29.0209700,115.8091600),\n(271551,'360426000000','360400000000','360426','3604','德安县','','','德安县','3','江西省','九江市','德安县','江西省九江市德安县',null,null,29.3134400,115.7560500),\n(271665,'360428000000','360400000000','360428','3604','都昌县','','','都昌县','3','江西省','九江市','都昌县','江西省九江市都昌县',null,null,29.2730700,116.2040900),\n(272001,'360429000000','360400000000','360429','3604','湖口县','','','湖口县','3','江西省','九江市','湖口县','江西省九江市湖口县',null,null,29.7394200,116.2202500),\n(272167,'360430000000','360400000000','360430','3604','彭泽县','','','彭泽县','3','江西省','九江市','彭泽县','江西省九江市彭泽县',null,null,29.8961300,116.5491100),\n(272376,'360481000000','360400000000','360481','3604','瑞昌市','','','瑞昌市','3','江西省','九江市','瑞昌市','江西省九江市瑞昌市',null,null,29.6765800,115.6810300),\n(272613,'360482000000','360400000000','360482','3604','共青城市','','','共青城市','3','江西省','九江市','共青城市','江西省九江市共青城市',null,null,29.2495500,115.8147700),\n(272682,'360483000000','360400000000','360483','3604','庐山市','','','庐山市','3','江西省','九江市','庐山市','江西省九江市庐山市',null,null,29.4482100,116.0451200),\n(272794,'360500000000','360000000000','3605','36','新余市','','新余市','','2','江西省','新余市','','江西省新余市',null,null,27.8003800,114.9446100),\n(272795,'360501000000','360500000000','360501','3605','市辖区','','','市辖区','3','江西省','新余市','市辖区','江西省新余市市辖区',null,null,27.8003800,114.9446100),\n(272796,'360502000000','360500000000','360502','3605','渝水区','','','渝水区','3','江西省','新余市','渝水区','江西省新余市渝水区',null,null,27.8003800,114.9446100),\n(273155,'360521000000','360500000000','360521','3605','分宜县','','','分宜县','3','江西省','新余市','分宜县','江西省新余市分宜县',null,null,27.8147600,114.6919100),\n(273344,'360600000000','360000000000','3606','36','鹰潭市','','鹰潭市','','2','江西省','鹰潭市','','江西省鹰潭市',null,null,28.2390200,117.0370800),\n(273345,'360601000000','360600000000','360601','3606','市辖区','','','市辖区','3','江西省','鹰潭市','市辖区','江西省鹰潭市市辖区',null,null,28.2390200,117.0370800),\n(273346,'360602000000','360600000000','360602','3606','月湖区','','','月湖区','3','江西省','鹰潭市','月湖区','江西省鹰潭市月湖区',null,null,28.2390200,117.0370800),\n(273440,'360622000000','360600000000','360622','3606','余江县','','','余江县','3','江西省','鹰潭市','余江县','江西省鹰潭市余江县',null,null,28.2099100,116.8183400),\n(273636,'360681000000','360600000000','360681','3606','贵溪市','','','贵溪市','3','江西省','鹰潭市','贵溪市','江西省鹰潭市贵溪市',null,null,28.2925200,117.2452500),\n(273918,'360700000000','360000000000','3607','36','赣州市','','赣州市','','2','江西省','赣州市','','江西省赣州市',null,null,25.8607600,115.0116100),\n(273919,'360701000000','360700000000','360701','3607','市辖区','','','市辖区','3','江西省','赣州市','市辖区','江西省赣州市市辖区',null,null,25.8607600,115.0116100),\n(273920,'360702000000','360700000000','360702','3607','章贡区','','','章贡区','3','江西省','赣州市','章贡区','江西省赣州市章贡区',null,null,25.8175100,114.9208500),\n(274138,'360703000000','360700000000','360703','3607','南康区','','','南康区','3','江西省','赣州市','南康区','江西省赣州市南康区',null,null,25.6614400,114.7653500),\n(274479,'360704000000','360700000000','360704','3607','赣县区','','','赣县区','3','江西省','赣州市','赣县区','江西省赣州市赣县区',null,null,25.8607600,115.0116100),\n(274794,'360722000000','360700000000','360722','3607','信丰县','','','信丰县','3','江西省','赣州市','信丰县','江西省赣州市信丰县',null,null,25.3861700,114.9228500),\n(275109,'360723000000','360700000000','360723','3607','大余县','','','大余县','3','江西省','赣州市','大余县','江西省赣州市大余县',null,null,25.4014800,114.3619500),\n(275242,'360724000000','360700000000','360724','3607','上犹县','','','上犹县','3','江西省','赣州市','上犹县','江西省赣州市上犹县',null,null,25.7908600,114.5375400),\n(275400,'360725000000','360700000000','360725','3607','崇义县','','','崇义县','3','江西省','赣州市','崇义县','江西省赣州市崇义县',null,null,25.6816500,114.3078400),\n(275549,'360726000000','360700000000','360726','3607','安远县','','','安远县','3','江西省','赣州市','安远县','江西省赣州市安远县',null,null,25.1370200,115.3937900),\n(275734,'360727000000','360700000000','360727','3607','龙南县','','','龙南县','3','江西省','赣州市','龙南县','江西省赣州市龙南县',null,null,24.9110500,114.7899300),\n(275857,'360728000000','360700000000','360728','3607','定南县','','','定南县','3','江西省','赣州市','定南县','江西省赣州市定南县',null,null,24.7855000,115.0273900),\n(276003,'360729000000','360700000000','360729','3607','全南县','','','全南县','3','江西省','赣州市','全南县','江西省赣州市全南县',null,null,24.7423500,114.5301200),\n(276110,'360730000000','360700000000','360730','3607','宁都县','','','宁都县','3','江西省','赣州市','宁都县','江西省赣州市宁都县',null,null,26.4701900,116.0094100),\n(276469,'360731000000','360700000000','360731','3607','于都县','','','于都县','3','江西省','赣州市','于都县','江西省赣州市于都县',null,null,25.9518400,115.4154400),\n(276886,'360732000000','360700000000','360732','3607','兴国县','','','兴国县','3','江西省','赣州市','兴国县','江西省赣州市兴国县',null,null,26.3377900,115.3631400),\n(277228,'360733000000','360700000000','360733','3607','会昌县','','','会昌县','3','江西省','赣州市','会昌县','江西省赣州市会昌县',null,null,25.6003900,115.7860000),\n(277524,'360734000000','360700000000','360734','3607','寻乌县','','','寻乌县','3','江西省','赣州市','寻乌县','江西省赣州市寻乌县',null,null,24.9635100,115.6467300),\n(277724,'360735000000','360700000000','360735','3607','石城县','','','石城县','3','江西省','赣州市','石城县','江西省赣州市石城县',null,null,26.3269100,116.3543200),\n(277888,'360781000000','360700000000','360781','3607','瑞金市','','','瑞金市','3','江西省','赣州市','瑞金市','江西省赣州市瑞金市',null,null,25.8856200,116.0270900),\n(278148,'360800000000','360000000000','3608','36','吉安市','','吉安市','','2','江西省','吉安市','','江西省吉安市',null,null,27.1448000,114.9945700),\n(278149,'360801000000','360800000000','360801','3608','市辖区','','','市辖区','3','江西省','吉安市','市辖区','江西省吉安市市辖区',null,null,27.1448000,114.9945700),\n(278150,'360802000000','360800000000','360802','3608','吉州区','','','吉州区','3','江西省','吉安市','吉州区','江西省吉安市吉州区',null,null,27.1448000,114.9945700),\n(278299,'360803000000','360800000000','360803','3608','青原区','','','青原区','3','江西省','吉安市','青原区','江西省吉安市青原区',null,null,27.0819500,115.0146500),\n(278443,'360821000000','360800000000','360821','3608','吉安县','','','吉安县','3','江西省','吉安市','吉安县','江西省吉安市吉安县',null,null,27.0393500,114.9082100),\n(278812,'360822000000','360800000000','360822','3608','吉水县','','','吉水县','3','江西省','吉安市','吉水县','江西省吉安市吉水县',null,null,27.2297600,115.1355000),\n(279115,'360823000000','360800000000','360823','3608','峡江县','','','峡江县','3','江西省','吉安市','峡江县','江西省吉安市峡江县',null,null,27.5828900,115.3164300),\n(279221,'360824000000','360800000000','360824','3608','新干县','','','新干县','3','江西省','吉安市','新干县','江西省吉安市新干县',null,null,27.7401600,115.3869200),\n(279404,'360825000000','360800000000','360825','3608','永丰县','','','永丰县','3','江西省','吉安市','永丰县','江西省吉安市永丰县',null,null,27.3181500,115.4418900),\n(279671,'360826000000','360800000000','360826','3608','泰和县','','','泰和县','3','江西省','吉安市','泰和县','江西省吉安市泰和县',null,null,26.7899300,114.9088700),\n(280046,'360827000000','360800000000','360827','3608','遂川县','','','遂川县','3','江西省','吉安市','遂川县','江西省吉安市遂川县',null,null,26.3136300,114.5205200),\n(280417,'360828000000','360800000000','360828','3608','万安县','','','万安县','3','江西省','吉安市','万安县','江西省吉安市万安县',null,null,26.4582500,114.7861500),\n(280592,'360829000000','360800000000','360829','3608','安福县','','','安福县','3','江西省','吉安市','安福县','江西省吉安市安福县',null,null,27.3928000,114.6196000),\n(280888,'360830000000','360800000000','360830','3608','永新县','','','永新县','3','江西省','吉安市','永新县','江西省吉安市永新县',null,null,26.9449800,114.2430700),\n(281178,'360881000000','360800000000','360881','3608','井冈山市','','','井冈山市','3','江西省','吉安市','井冈山市','江西省吉安市井冈山市',null,null,26.7480800,114.2895300),\n(281334,'360900000000','360000000000','3609','36','宜春市','','宜春市','','2','江西省','宜春市','','江西省宜春市',null,null,27.7981700,114.4277300),\n(281335,'360901000000','360900000000','360901','3609','市辖区','','','市辖区','3','江西省','宜春市','市辖区','江西省宜春市市辖区',null,null,27.7981700,114.4277300),\n(281336,'360902000000','360900000000','360902','3609','袁州区','','','袁州区','3','江西省','宜春市','袁州区','江西省宜春市袁州区',null,null,27.7981700,114.4277300),\n(281757,'360921000000','360900000000','360921','3609','奉新县','','','奉新县','3','江西省','宜春市','奉新县','江西省宜春市奉新县',null,null,28.6879300,115.4003700),\n(281975,'360922000000','360900000000','360922','3609','万载县','','','万载县','3','江西省','宜春市','万载县','江西省宜春市万载县',null,null,28.1061000,114.4455100),\n(282197,'360923000000','360900000000','360923','3609','上高县','','','上高县','3','江西省','宜春市','上高县','江西省宜春市上高县',null,null,28.2333700,114.9248000),\n(282436,'360924000000','360900000000','360924','3609','宜丰县','','','宜丰县','3','江西省','宜春市','宜丰县','江西省宜春市宜丰县',null,null,28.3938000,114.8036900),\n(282701,'360925000000','360900000000','360925','3609','靖安县','','','靖安县','3','江西省','宜春市','靖安县','江西省宜春市靖安县',null,null,28.8613800,115.3626800),\n(282822,'360926000000','360900000000','360926','3609','铜鼓县','','','铜鼓县','3','江西省','宜春市','铜鼓县','江西省宜春市铜鼓县',null,null,28.5218200,114.3707100),\n(282947,'360981000000','360900000000','360981','3609','丰城市','','','丰城市','3','江西省','宜春市','丰城市','江西省宜春市丰城市',null,null,28.1592000,115.7712100),\n(283573,'360982000000','360900000000','360982','3609','樟树市','','','樟树市','3','江西省','宜春市','樟树市','江西省宜春市樟树市',null,null,28.0558900,115.5461500),\n(283895,'360983000000','360900000000','360983','3609','高安市','','','高安市','3','江西省','宜春市','高安市','江西省宜春市高安市',null,null,28.4172900,115.3756200),\n(284291,'361000000000','360000000000','3610','36','抚州市','','抚州市','','2','江西省','抚州市','','江西省抚州市',null,null,28.2477100,116.6033400),\n(284292,'361001000000','361000000000','361001','3610','市辖区','','','市辖区','3','江西省','抚州市','市辖区','江西省抚州市市辖区',null,null,28.2477100,116.6033400),\n(284293,'361002000000','361000000000','361002','3610','临川区','','','临川区','3','江西省','抚州市','临川区','江西省抚州市临川区',null,null,27.9347300,116.3098600),\n(284827,'361003000000','361000000000','361003','3610','东乡区','','','东乡区','3','江西省','抚州市','东乡区','江西省抚州市东乡区',null,null,28.2477100,116.6033400),\n(285029,'361021000000','361000000000','361021','3610','南城县','','','南城县','3','江西省','抚州市','南城县','江西省抚州市南城县',null,null,27.5684000,116.6377500),\n(285216,'361022000000','361000000000','361022','3610','黎川县','','','黎川县','3','江西省','抚州市','黎川县','江西省抚州市黎川县',null,null,27.2823600,116.9075300),\n(285374,'361023000000','361000000000','361023','3610','南丰县','','','南丰县','3','江西省','抚州市','南丰县','江西省抚州市南丰县',null,null,27.2186300,116.5252600),\n(285576,'361024000000','361000000000','361024','3610','崇仁县','','','崇仁县','3','江西省','抚州市','崇仁县','江西省抚州市崇仁县',null,null,27.7643700,116.0612400),\n(285762,'361025000000','361000000000','361025','3610','乐安县','','','乐安县','3','江西省','抚州市','乐安县','江西省抚州市乐安县',null,null,27.4281400,115.8310900),\n(285971,'361026000000','361000000000','361026','3610','宜黄县','','','宜黄县','3','江西省','抚州市','宜黄县','江西省抚州市宜黄县',null,null,27.5548900,116.2362800),\n(286142,'361027000000','361000000000','361027','3610','金溪县','','','金溪县','3','江西省','抚州市','金溪县','江西省抚州市金溪县',null,null,27.9191200,116.7548500),\n(286329,'361028000000','361000000000','361028','3610','资溪县','','','资溪县','3','江西省','抚州市','资溪县','江西省抚州市资溪县',null,null,27.7059400,117.0610100),\n(286420,'361030000000','361000000000','361030','3610','广昌县','','','广昌县','3','江西省','抚州市','广昌县','江西省抚州市广昌县',null,null,26.8372900,116.3257300),\n(286579,'361100000000','360000000000','3611','36','上饶市','','上饶市','','2','江西省','上饶市','','江西省上饶市',null,null,28.4363100,118.1913300),\n(286580,'361101000000','361100000000','361101','3611','市辖区','','','市辖区','3','江西省','上饶市','市辖区','江西省上饶市市辖区',null,null,28.4363100,118.1913300),\n(286581,'361102000000','361100000000','361102','3611','信州区','','','信州区','3','江西省','上饶市','信州区','江西省上饶市信州区',null,null,28.4299500,117.9646900),\n(286718,'361103000000','361100000000','361103','3611','广丰区','','','广丰区','3','江西省','上饶市','广丰区','江西省上饶市广丰区',null,null,28.4363100,118.1913300),\n(286982,'361121000000','361100000000','361121','3611','上饶县','','','上饶县','3','江西省','上饶市','上饶县','江西省上饶市上饶县',null,null,28.4492300,117.9096000),\n(287253,'361123000000','361100000000','361123','3611','玉山县','','','玉山县','3','江西省','上饶市','玉山县','江西省上饶市玉山县',null,null,28.6819400,118.2448100),\n(287511,'361124000000','361100000000','361124','3611','铅山县','','','铅山县','3','江西省','上饶市','铅山县','江西省上饶市铅山县',null,null,28.3153500,117.7094200),\n(287712,'361125000000','361100000000','361125','3611','横峰县','','','横峰县','3','江西省','上饶市','横峰县','江西省上饶市横峰县',null,null,28.4072000,117.5964400),\n(287808,'361126000000','361100000000','361126','3611','弋阳县','','','弋阳县','3','江西省','上饶市','弋阳县','江西省上饶市弋阳县',null,null,28.3775400,117.4482100),\n(287983,'361127000000','361100000000','361127','3611','余干县','','','余干县','3','江西省','上饶市','余干县','江西省上饶市余干县',null,null,28.7021100,116.6956000),\n(288450,'361128000000','361100000000','361128','3611','鄱阳县','','','鄱阳县','3','江西省','上饶市','鄱阳县','江西省上饶市鄱阳县',null,null,29.0056300,116.7034300),\n(289063,'361129000000','361100000000','361129','3611','万年县','','','万年县','3','江西省','上饶市','万年县','江西省上饶市万年县',null,null,28.6946600,117.0583900),\n(289235,'361130000000','361100000000','361130','3611','婺源县','','','婺源县','3','江西省','上饶市','婺源县','江西省上饶市婺源县',null,null,29.2479100,117.8619200),\n(289457,'361181000000','361100000000','361181','3611','德兴市','','','德兴市','3','江西省','上饶市','德兴市','江西省上饶市德兴市',null,null,28.9465400,117.5788400),\n(289611,'370000000000','0','37','0','山东省','山东省','','','1','山东省','','','山东省',null,null,null,null),\n(289612,'370100000000','370000000000','3701','37','济南市','','济南市','','2','山东省','济南市','','山东省济南市',null,null,36.5535800,116.7519900),\n(289613,'370101000000','370100000000','370101','3701','市辖区','','','市辖区','3','山东省','济南市','市辖区','山东省济南市市辖区',null,null,36.5535800,116.7519900),\n(289614,'370102000000','370100000000','370102','3701','历下区','','','历下区','3','山东省','济南市','历下区','山东省济南市历下区',null,null,36.6664500,117.0764100),\n(289737,'370103000000','370100000000','370103','3701','市中区','','','市中区','3','山东省','济南市','市中区','山东省济南市市中区',null,null,36.6511800,116.9974400),\n(289962,'370104000000','370100000000','370104','3701','槐荫区','','','槐荫区','3','山东省','济南市','槐荫区','山东省济南市槐荫区',null,null,36.6514200,116.9008400),\n(290159,'370105000000','370100000000','370105','3701','天桥区','','','天桥区','3','山东省','济南市','天桥区','山东省济南市天桥区',null,null,36.6778900,116.9873700),\n(290438,'370112000000','370100000000','370112','3701','历城区','','','历城区','3','山东省','济南市','历城区','山东省济南市历城区',null,null,36.6801300,117.0653300),\n(291044,'370113000000','370100000000','370113','3701','长清区','','','长清区','3','山东省','济南市','长清区','山东省济南市长清区',null,null,36.5535800,116.7519900),\n(291696,'370114000000','370100000000','370114','3701','章丘区','','','章丘区','3','山东省','济南市','章丘区','山东省济南市章丘区',null,null,36.6812400,117.5262700),\n(292626,'370124000000','370100000000','370124','3701','平阴县','','','平阴县','3','山东省','济南市','平阴县','山东省济南市平阴县',null,null,36.2893700,116.4559900),\n(292990,'370125000000','370100000000','370125','3701','济阳县','','','济阳县','3','山东省','济南市','济阳县','山东省济南市济阳县',null,null,36.9784700,117.1733300),\n(293862,'370126000000','370100000000','370126','3701','商河县','','','商河县','3','山东省','济南市','商河县','山东省济南市商河县',null,null,37.3090700,117.1571000),\n(294839,'370171000000','370100000000','370171','3701','济南高新技术产业开发区','','','济南高新技术产业开发区','3','山东省','济南市','济南高新技术产业开发区','山东省济南市济南高新技术产业开发区',null,null,36.8188550,117.1926960),\n(295028,'370200000000','370000000000','3702','37','青岛市','','青岛市','','2','山东省','青岛市','','山东省青岛市',null,null,36.3074400,120.3962900),\n(295029,'370201000000','370200000000','370201','3702','市辖区','','','市辖区','3','山东省','青岛市','市辖区','山东省青岛市市辖区',null,null,36.3074400,120.3962900),\n(295030,'370202000000','370200000000','370202','3702','市南区','','','市南区','3','山东省','青岛市','市南区','山东省青岛市市南区',null,null,36.0751500,120.4128300),\n(295106,'370203000000','370200000000','370203','3702','市北区','','','市北区','3','山东省','青岛市','市北区','山东省青岛市市北区',null,null,36.0874300,120.3747900),\n(295261,'370211000000','370200000000','370211','3702','黄岛区','','','黄岛区','3','山东省','青岛市','黄岛区','山东省青岛市黄岛区',null,null,35.9599500,120.1965300),\n(296512,'370212000000','370200000000','370212','3702','崂山区','','','崂山区','3','山东省','青岛市','崂山区','山东省青岛市崂山区',null,null,36.1081100,120.4680300),\n(296679,'370213000000','370200000000','370213','3702','李沧区','','','李沧区','3','山东省','青岛市','李沧区','山东省青岛市李沧区',null,null,36.1450800,120.4329400),\n(296808,'370214000000','370200000000','370214','3702','城阳区','','','城阳区','3','山东省','青岛市','城阳区','山东省青岛市城阳区',null,null,36.3074400,120.3962900),\n(297041,'370215000000','370200000000','370215','3702','即墨区','','','即墨区','3','山东省','青岛市','即墨区','山东省青岛市即墨区',null,null,36.3893200,120.4471500),\n(298158,'370271000000','370200000000','370271','3702','青岛高新技术产业开发区','','','青岛高新技术产业开发区','3','山东省','青岛市','青岛高新技术产业开发区','山东省青岛市青岛高新技术产业开发区',null,null,36.5144580,120.5305790),\n(298198,'370281000000','370200000000','370281','3702','胶州市','','','胶州市','3','山东省','青岛市','胶州市','山东省青岛市胶州市',null,null,36.2644500,120.0335400),\n(299105,'370283000000','370200000000','370283','3702','平度市','','','平度市','3','山东省','青岛市','平度市','山东省青岛市平度市',null,null,36.7867000,119.9599400),\n(300977,'370285000000','370200000000','370285','3702','莱西市','','','莱西市','3','山东省','青岛市','莱西市','山东省青岛市莱西市',null,null,36.8880800,120.5177700),\n(301882,'370300000000','370000000000','3703','37','淄博市','','淄博市','','2','山东省','淄博市','','山东省淄博市',null,null,36.4947300,117.8617200),\n(301883,'370301000000','370300000000','370301','3703','市辖区','','','市辖区','3','山东省','淄博市','市辖区','山东省淄博市市辖区',null,null,36.4947300,117.8617200),\n(301884,'370302000000','370300000000','370302','3703','淄川区','','','淄川区','3','山东省','淄博市','淄川区','山东省淄博市淄川区',null,null,36.6435000,117.9667300),\n(302364,'370303000000','370300000000','370303','3703','张店区','','','张店区','3','山东省','淄博市','张店区','山东省淄博市张店区',null,null,36.8066100,118.0179000),\n(302681,'370304000000','370300000000','370304','3703','博山区','','','博山区','3','山东省','淄博市','博山区','山东省淄博市博山区',null,null,36.4947300,117.8617200),\n(302989,'370305000000','370300000000','370305','3703','临淄区','','','临淄区','3','山东省','淄博市','临淄区','山东省淄博市临淄区',null,null,36.8259300,118.3097100),\n(303482,'370306000000','370300000000','370306','3703','周村区','','','周村区','3','山东省','淄博市','周村区','山东省淄博市周村区',null,null,36.8029800,117.8697400),\n(303749,'370321000000','370300000000','370321','3703','桓台县','','','桓台县','3','山东省','淄博市','桓台县','山东省淄博市桓台县',null,null,36.9593300,118.0979700),\n(304109,'370322000000','370300000000','370322','3703','高青县','','','高青县','3','山东省','淄博市','高青县','山东省淄博市高青县',null,null,37.1710500,117.8267500),\n(304889,'370323000000','370300000000','370323','3703','沂源县','','','沂源县','3','山东省','淄博市','沂源县','山东省淄博市沂源县',null,null,36.1848800,118.1707700),\n(305549,'370400000000','370000000000','3704','37','枣庄市','','枣庄市','','2','山东省','枣庄市','','山东省枣庄市',null,null,35.0996300,117.4613000),\n(305550,'370401000000','370400000000','370401','3704','市辖区','','','市辖区','3','山东省','枣庄市','市辖区','山东省枣庄市市辖区',null,null,35.0996300,117.4613000),\n(305551,'370402000000','370400000000','370402','3704','市中区','','','市中区','3','山东省','枣庄市','市中区','山东省枣庄市市中区',null,null,34.8642600,117.5560100),\n(305732,'370403000000','370400000000','370403','3704','薛城区','','','薛城区','3','山东省','枣庄市','薛城区','山东省枣庄市薛城区',null,null,34.7950200,117.2632000),\n(306023,'370404000000','370400000000','370404','3704','峄城区','','','峄城区','3','山东省','枣庄市','峄城区','山东省枣庄市峄城区',null,null,34.7722800,117.5906100),\n(306376,'370405000000','370400000000','370405','3704','台儿庄区','','','台儿庄区','3','山东省','枣庄市','台儿庄区','山东省枣庄市台儿庄区',null,null,34.5626100,117.7338500),\n(306594,'370406000000','370400000000','370406','3704','山亭区','','','山亭区','3','山东省','枣庄市','山亭区','山东省枣庄市山亭区',null,null,35.0996300,117.4613000),\n(306882,'370481000000','370400000000','370481','3704','滕州市','','','滕州市','3','山东省','枣庄市','滕州市','山东省枣庄市滕州市',null,null,35.1133800,117.1659600),\n(308154,'370500000000','370000000000','3705','37','东营市','','东营市','','2','山东省','东营市','','山东省东营市',null,null,37.4487800,118.5821500),\n(308155,'370501000000','370500000000','370501','3705','市辖区','','','市辖区','3','山东省','东营市','市辖区','山东省东营市市辖区',null,null,37.4487800,118.5821500),\n(308156,'370502000000','370500000000','370502','3705','东营区','','','东营区','3','山东省','东营市','东营区','山东省东营市东营区',null,null,37.4487800,118.5821500),\n(308505,'370503000000','370500000000','370503','3705','河口区','','','河口区','3','山东省','东营市','河口区','山东省东营市河口区',null,null,37.8862400,118.5254400),\n(308703,'370505000000','370500000000','370505','3705','垦利区','','','垦利区','3','山东省','东营市','垦利区','山东省东营市垦利区',null,null,37.5874800,118.5476800),\n(309071,'370522000000','370500000000','370522','3705','利津县','','','利津县','3','山东省','东营市','利津县','山东省东营市利津县',null,null,37.4902800,118.2553600),\n(309610,'370523000000','370500000000','370523','3705','广饶县','','','广饶县','3','山东省','东营市','广饶县','山东省东营市广饶县',null,null,37.0535900,118.4070200),\n(310202,'370571000000','370500000000','370571','3705','东营经济技术开发区','','','东营经济技术开发区','3','山东省','东营市','东营经济技术开发区','山东省东营市东营经济技术开发区',null,null,37.4338110,118.6958160),\n(310205,'370572000000','370500000000','370572','3705','东营港经济开发区','','','东营港经济开发区','3','山东省','东营市','东营港经济开发区','山东省东营市东营港经济开发区',null,null,38.0531160,118.8780140),\n(310208,'370600000000','370000000000','3706','37','烟台市','','烟台市','','2','山东省','烟台市','','山东省烟台市',null,null,37.4979400,121.2675700),\n(310209,'370601000000','370600000000','370601','3706','市辖区','','','市辖区','3','山东省','烟台市','市辖区','山东省烟台市市辖区',null,null,37.4979400,121.2675700),\n(310210,'370602000000','370600000000','370602','3706','芝罘区','','','芝罘区','3','山东省','烟台市','芝罘区','山东省烟台市芝罘区',null,null,37.5406100,121.4001100),\n(310365,'370611000000','370600000000','370611','3706','福山区','','','福山区','3','山东省','烟台市','福山区','山东省烟台市福山区',null,null,37.4979400,121.2675700),\n(310612,'370612000000','370600000000','370612','3706','牟平区','','','牟平区','3','山东省','烟台市','牟平区','山东省烟台市牟平区',null,null,37.3868300,121.6004200),\n(311217,'370613000000','370600000000','370613','3706','莱山区','','','莱山区','3','山东省','烟台市','莱山区','山东省烟台市莱山区',null,null,37.5110400,121.4454700),\n(311350,'370634000000','370600000000','370634','3706','长岛县','','','长岛县','3','山东省','烟台市','长岛县','山东省烟台市长岛县',null,null,37.9213500,120.7364500),\n(311399,'370671000000','370600000000','370671','3706','烟台高新技术产业开发区','','','烟台高新技术产业开发区','3','山东省','烟台市','烟台高新技术产业开发区','山东省烟台市烟台高新技术产业开发区',null,null,37.4552500,121.4827800),\n(311422,'370672000000','370600000000','370672','3706','烟台经济技术开发区','','','烟台经济技术开发区','3','山东省','烟台市','烟台经济技术开发区','山东省烟台市烟台经济技术开发区',null,null,37.4379390,121.4175110),\n(311559,'370681000000','370600000000','370681','3706','龙口市','','','龙口市','3','山东省','烟台市','龙口市','山东省烟台市龙口市',null,null,37.6434500,120.4787200),\n(312169,'370682000000','370600000000','370682','3706','莱阳市','','','莱阳市','3','山东省','烟台市','莱阳市','山东省烟台市莱阳市',null,null,36.9787800,120.7118100),\n(312982,'370683000000','370600000000','370683','3706','莱州市','','','莱州市','3','山东省','烟台市','莱州市','山东省烟台市莱州市',null,null,37.1770200,119.9422200),\n(314015,'370684000000','370600000000','370684','3706','蓬莱市','','','蓬莱市','3','山东省','烟台市','蓬莱市','山东省烟台市蓬莱市',null,null,37.8107200,120.7588200),\n(314616,'370685000000','370600000000','370685','3706','招远市','','','招远市','3','山东省','烟台市','招远市','山东省烟台市招远市',null,null,37.3553100,120.4342100),\n(315377,'370686000000','370600000000','370686','3706','栖霞市','','','栖霞市','3','山东省','烟台市','栖霞市','山东省烟台市栖霞市',null,null,37.3350500,120.8497700),\n(316347,'370687000000','370600000000','370687','3706','海阳市','','','海阳市','3','山东省','烟台市','海阳市','山东省烟台市海阳市',null,null,36.7764500,121.1584600),\n(317098,'370700000000','370000000000','3707','37','潍坊市','','潍坊市','','2','山东省','潍坊市','','山东省潍坊市',null,null,36.6545800,119.1660700),\n(317099,'370701000000','370700000000','370701','3707','市辖区','','','市辖区','3','山东省','潍坊市','市辖区','山东省潍坊市市辖区',null,null,36.6545800,119.1660700),\n(317100,'370702000000','370700000000','370702','3707','潍城区','','','潍城区','3','山东省','潍坊市','潍城区','山东省潍坊市潍城区',null,null,36.7266700,119.0238900),\n(317362,'370703000000','370700000000','370703','3707','寒亭区','','','寒亭区','3','山东省','潍坊市','寒亭区','山东省潍坊市寒亭区',null,null,36.7750600,119.2199400),\n(317740,'370704000000','370700000000','370704','3707','坊子区','','','坊子区','3','山东省','潍坊市','坊子区','山东省潍坊市坊子区',null,null,36.6545800,119.1660700),\n(318327,'370705000000','370700000000','370705','3707','奎文区','','','奎文区','3','山东省','潍坊市','奎文区','山东省潍坊市奎文区',null,null,36.7086400,119.1327900),\n(318570,'370724000000','370700000000','370724','3707','临朐县','','','临朐县','3','山东省','潍坊市','临朐县','山东省潍坊市临朐县',null,null,36.5123100,118.5430000),\n(318931,'370725000000','370700000000','370725','3707','昌乐县','','','昌乐县','3','山东省','潍坊市','昌乐县','山东省潍坊市昌乐县',null,null,36.7070200,118.8298400),\n(319310,'370772000000','370700000000','370772','3707','潍坊滨海经济技术开发区','','','潍坊滨海经济技术开发区','3','山东省','潍坊市','潍坊滨海经济技术开发区','山东省潍坊市潍坊滨海经济技术开发区',null,null,37.0392420,119.1963810),\n(319364,'370781000000','370700000000','370781','3707','青州市','','','青州市','3','山东省','潍坊市','青州市','山东省潍坊市青州市',null,null,36.6845600,118.4796600),\n(320456,'370782000000','370700000000','370782','3707','诸城市','','','诸城市','3','山东省','潍坊市','诸城市','山东省潍坊市诸城市',null,null,35.9958300,119.4098300),\n(320737,'370783000000','370700000000','370783','3707','寿光市','','','寿光市','3','山东省','潍坊市','寿光市','山东省潍坊市寿光市',null,null,36.8554100,118.7909800),\n(321728,'370784000000','370700000000','370784','3707','安丘市','','','安丘市','3','山东省','潍坊市','安丘市','山东省潍坊市安丘市',null,null,36.4784200,119.2178400),\n(322607,'370785000000','370700000000','370785','3707','高密市','','','高密市','3','山东省','潍坊市','高密市','山东省潍坊市高密市',null,null,36.3825700,119.7556800),\n(323565,'370786000000','370700000000','370786','3707','昌邑市','','','昌邑市','3','山东省','潍坊市','昌邑市','山东省潍坊市昌邑市',null,null,36.8588400,119.3986200),\n(324266,'370800000000','370000000000','3708','37','济宁市','','济宁市','','2','山东省','济宁市','','山东省济宁市',null,null,35.4082000,116.5964900),\n(324267,'370801000000','370800000000','370801','3708','市辖区','','','市辖区','3','山东省','济宁市','市辖区','山东省济宁市市辖区',null,null,35.4082000,116.5964900),\n(324268,'370811000000','370800000000','370811','3708','任城区','','','任城区','3','山东省','济宁市','任城区','山东省济宁市任城区',null,null,35.4082000,116.5964900),\n(324882,'370812000000','370800000000','370812','3708','兖州区','','','兖州区','3','山东省','济宁市','兖州区','山东省济宁市兖州区',null,null,35.5526000,116.7857000),\n(325336,'370826000000','370800000000','370826','3708','微山县','','','微山县','3','山东省','济宁市','微山县','山东省济宁市微山县',null,null,34.8071800,117.1288600),\n(325894,'370827000000','370800000000','370827','3708','鱼台县','','','鱼台县','3','山东省','济宁市','鱼台县','山东省济宁市鱼台县',null,null,35.0116100,116.6504600),\n(326299,'370828000000','370800000000','370828','3708','金乡县','','','金乡县','3','山东省','济宁市','金乡县','山东省济宁市金乡县',null,null,35.0666100,116.3114800),\n(326972,'370829000000','370800000000','370829','3708','嘉祥县','','','嘉祥县','3','山东省','济宁市','嘉祥县','山东省济宁市嘉祥县',null,null,35.4075000,116.3424900),\n(327698,'370830000000','370800000000','370830','3708','汶上县','','','汶上县','3','山东省','济宁市','汶上县','山东省济宁市汶上县',null,null,35.7328100,116.4891700),\n(328209,'370831000000','370800000000','370831','3708','泗水县','','','泗水县','3','山东省','济宁市','泗水县','山东省济宁市泗水县',null,null,35.6647100,117.2521600),\n(328820,'370832000000','370800000000','370832','3708','梁山县','','','梁山县','3','山东省','济宁市','梁山县','山东省济宁市梁山县',null,null,35.8024000,116.0958400),\n(329471,'370871000000','370800000000','370871','3708','济宁高新技术产业开发区','','','济宁高新技术产业开发区','3','山东省','济宁市','济宁高新技术产业开发区','山东省济宁市济宁高新技术产业开发区',null,null,35.4105490,116.6609120),\n(329668,'370881000000','370800000000','370881','3708','曲阜市','','','曲阜市','3','山东省','济宁市','曲阜市','山东省济宁市曲阜市',null,null,35.5808200,116.9864800),\n(330087,'370883000000','370800000000','370883','3708','邹城市','','','邹城市','3','山东省','济宁市','邹城市','山东省济宁市邹城市',null,null,35.4052200,117.0038500),\n(331003,'370900000000','370000000000','3709','37','泰安市','','泰安市','','2','山东省','泰安市','','山东省泰安市',null,null,36.1919800,117.1352600),\n(331004,'370901000000','370900000000','370901','3709','市辖区','','','市辖区','3','山东省','泰安市','市辖区','山东省泰安市市辖区',null,null,36.1919800,117.1352600),\n(331005,'370902000000','370900000000','370902','3709','泰山区','','','泰山区','3','山东省','泰安市','泰山区','山东省泰安市泰山区',null,null,36.1919800,117.1352600),\n(331223,'370911000000','370900000000','370911','3709','岱岳区','','','岱岳区','3','山东省','泰安市','岱岳区','山东省泰安市岱岳区',null,null,36.1875200,117.0418000),\n(331952,'370921000000','370900000000','370921','3709','宁阳县','','','宁阳县','3','山东省','泰安市','宁阳县','山东省泰安市宁阳县',null,null,35.7596100,116.8072700),\n(332528,'370923000000','370900000000','370923','3709','东平县','','','东平县','3','山东省','泰安市','东平县','山东省泰安市东平县',null,null,35.9370800,116.4702400),\n(333259,'370982000000','370900000000','370982','3709','新泰市','','','新泰市','3','山东省','泰安市','新泰市','山东省泰安市新泰市',null,null,35.9087800,117.7680000),\n(334194,'370983000000','370900000000','370983','3709','肥城市','','','肥城市','3','山东省','泰安市','肥城市','山东省泰安市肥城市',null,null,36.1824500,116.7691700),\n(334842,'371000000000','370000000000','3710','37','威海市','','威海市','','2','山东省','威海市','','山东省威海市',null,null,37.5021200,122.1234800),\n(334843,'371001000000','371000000000','371001','3710','市辖区','','','市辖区','3','山东省','威海市','市辖区','山东省威海市市辖区',null,null,37.5021200,122.1234800),\n(334844,'371002000000','371000000000','371002','3710','环翠区','','','环翠区','3','山东省','威海市','环翠区','山东省威海市环翠区',null,null,37.5021200,122.1234800),\n(335037,'371003000000','371000000000','371003','3710','文登区','','','文登区','3','山东省','威海市','文登区','山东省威海市文登区',null,null,37.1939700,122.0581000),\n(335816,'371071000000','371000000000','371071','3710','威海火炬高技术产业开发区','','','威海火炬高技术产业开发区','3','山东省','威海市','威海火炬高技术产业开发区','山东省威海市威海火炬高技术产业开发区',null,null,37.5217700,122.0342560),\n(335907,'371072000000','371000000000','371072','3710','威海经济技术开发区','','','威海经济技术开发区','3','山东省','威海市','威海经济技术开发区','山东省威海市威海经济技术开发区',null,null,37.4042510,122.1714940),\n(336058,'371073000000','371000000000','371073','3710','威海临港经济技术开发区','','','威海临港经济技术开发区','3','山东省','威海市','威海临港经济技术开发区','山东省威海市威海临港经济技术开发区',null,null,37.3197750,122.0958330),\n(336237,'371082000000','371000000000','371082','3710','荣成市','','','荣成市','3','山东省','威海市','荣成市','山东省威海市荣成市',null,null,37.1652300,122.4862800),\n(337204,'371083000000','371000000000','371083','3710','乳山市','','','乳山市','3','山东省','威海市','乳山市','山东省威海市乳山市',null,null,36.9202100,121.5402000),\n(337848,'371100000000','370000000000','3711','37','日照市','','日照市','','2','山东省','日照市','','山东省日照市',null,null,35.4254500,119.4624200),\n(337849,'371101000000','371100000000','371101','3711','市辖区','','','市辖区','3','山东省','日照市','市辖区','山东省日照市市辖区',null,null,35.4254500,119.4624200),\n(337850,'371102000000','371100000000','371102','3711','东港区','','','东港区','3','山东省','日照市','东港区','山东省日照市东港区',null,null,35.4254500,119.4624200),\n(338463,'371103000000','371100000000','371103','3711','岚山区','','','岚山区','3','山东省','日照市','岚山区','山东省日照市岚山区',null,null,35.1220600,119.3189100),\n(338896,'371121000000','371100000000','371121','3711','五莲县','','','五莲县','3','山东省','日照市','五莲县','山东省日照市五莲县',null,null,35.7501800,119.2087500),\n(339541,'371122000000','371100000000','371122','3711','莒县','','','莒县','3','山东省','日照市','莒县','山东省日照市莒县',null,null,35.5799700,118.8368700),\n(340758,'371171000000','371100000000','371171','3711','日照经济技术开发区','','','日照经济技术开发区','3','山东省','日照市','日照经济技术开发区','山东省日照市日照经济技术开发区',null,null,35.3903350,119.5218510),\n(340850,'371172000000','371100000000','371172','3711','日照国际海洋城','','','日照国际海洋城','3','山东省','日照市','日照国际海洋城','山东省日照市日照国际海洋城',null,null,35.2837450,119.3734210),\n(340927,'371200000000','370000000000','3712','37','莱芜市','','莱芜市','','2','山东省','莱芜市','','山东省莱芜市',null,null,36.0586600,117.8110700),\n(340928,'371201000000','371200000000','371201','3712','市辖区','','','市辖区','3','山东省','莱芜市','市辖区','山东省莱芜市市辖区',null,null,36.0586600,117.8110700),\n(340929,'371202000000','371200000000','371202','3712','莱城区','','','莱城区','3','山东省','莱芜市','莱城区','山东省莱芜市莱城区',null,null,36.2031700,117.6599200),\n(341785,'371203000000','371200000000','371203','3712','钢城区','','','钢城区','3','山东省','莱芜市','钢城区','山东省莱芜市钢城区',null,null,36.0586600,117.8110700),\n(342021,'371300000000','370000000000','3713','37','临沂市','','临沂市','','2','山东省','临沂市','','山东省临沂市',null,null,35.0872900,118.4018400),\n(342022,'371301000000','371300000000','371301','3713','市辖区','','','市辖区','3','山东省','临沂市','市辖区','山东省临沂市市辖区',null,null,35.0872900,118.4018400),\n(342023,'371302000000','371300000000','371302','3713','兰山区','','','兰山区','3','山东省','临沂市','兰山区','山东省临沂市兰山区',null,null,35.0515100,118.3478700),\n(342498,'371311000000','371300000000','371311','3713','罗庄区','','','罗庄区','3','山东省','临沂市','罗庄区','山东省临沂市罗庄区',null,null,34.9963600,118.2843700),\n(342721,'371312000000','371300000000','371312','3713','河东区','','','河东区','3','山东省','临沂市','河东区','山东省临沂市河东区',null,null,35.0872900,118.4018400),\n(343065,'371321000000','371300000000','371321','3713','沂南县','','','沂南县','3','山东省','临沂市','沂南县','山东省临沂市沂南县',null,null,35.5500100,118.4656600),\n(343655,'371322000000','371300000000','371322','3713','郯城县','','','郯城县','3','山东省','临沂市','郯城县','山东省临沂市郯城县',null,null,34.6135700,118.3671700),\n(344285,'371323000000','371300000000','371323','3713','沂水县','','','沂水县','3','山东省','临沂市','沂水县','山东省临沂市沂水县',null,null,35.7903400,118.6278200),\n(345367,'371324000000','371300000000','371324','3713','兰陵县','','','兰陵县','3','山东省','临沂市','兰陵县','山东省临沂市兰陵县',null,null,34.8572900,118.0707200),\n(346409,'371325000000','371300000000','371325','3713','费县','','','费县','3','山东省','临沂市','费县','山东省临沂市费县',null,null,35.2665900,117.9771100),\n(346897,'371326000000','371300000000','371326','3713','平邑县','','','平邑县','3','山东省','临沂市','平邑县','山东省临沂市平邑县',null,null,35.5058700,117.6404800),\n(347643,'371327000000','371300000000','371327','3713','莒南县','','','莒南县','3','山东省','临沂市','莒南县','山东省临沂市莒南县',null,null,35.1748600,118.8354300),\n(348238,'371328000000','371300000000','371328','3713','蒙阴县','','','蒙阴县','3','山东省','临沂市','蒙阴县','山东省临沂市蒙阴县',null,null,35.7101000,117.9449400),\n(348713,'371329000000','371300000000','371329','3713','临沭县','','','临沭县','3','山东省','临沂市','临沭县','山东省临沂市临沭县',null,null,34.9198500,118.6506300),\n(349010,'371371000000','371300000000','371371','3713','临沂高新技术产业开发区','','','临沂高新技术产业开发区','3','山东省','临沂市','临沂高新技术产业开发区','山东省临沂市临沂高新技术产业开发区',null,null,34.9855690,118.2644500),\n(349064,'371372000000','371300000000','371372','3713','临沂经济技术开发区','','','临沂经济技术开发区','3','山东省','临沂市','临沂经济技术开发区','山东省临沂市临沂经济技术开发区',null,null,35.0144500,118.4642490),\n(349184,'371373000000','371300000000','371373','3713','临沂临港经济开发区','','','临沂临港经济开发区','3','山东省','临沂市','临沂临港经济开发区','山东省临沂市临沂临港经济开发区',null,null,35.1869160,119.0844040),\n(349339,'371400000000','370000000000','3714','37','德州市','','德州市','','2','山东省','德州市','','山东省德州市',null,null,37.4507900,116.2994100),\n(349340,'371401000000','371400000000','371401','3714','市辖区','','','市辖区','3','山东省','德州市','市辖区','山东省德州市市辖区',null,null,37.4507900,116.2994100),\n(349341,'371402000000','371400000000','371402','3714','德城区','','','德城区','3','山东省','德州市','德城区','山东省德州市德城区',null,null,37.4507900,116.2994100),\n(349450,'371403000000','371400000000','371403','3714','陵城区','','','陵城区','3','山东省','德州市','陵城区','山东省德州市陵城区',null,null,37.3356600,116.5763400),\n(350454,'371422000000','371400000000','371422','3714','宁津县','','','宁津县','3','山东省','德州市','宁津县','山东省德州市宁津县',null,null,37.6522100,116.8002300),\n(351323,'371423000000','371400000000','371423','3714','庆云县','','','庆云县','3','山东省','德州市','庆云县','山东省德州市庆云县',null,null,37.7752800,117.3849700),\n(351724,'371424000000','371400000000','371424','3714','临邑县','','','临邑县','3','山东省','德州市','临邑县','山东省德州市临邑县',null,null,37.1899800,116.8666000),\n(351921,'371425000000','371400000000','371425','3714','齐河县','','','齐河县','3','山东省','德州市','齐河县','山东省德州市齐河县',null,null,36.7949200,116.7600200),\n(352955,'371426000000','371400000000','371426','3714','平原县','','','平原县','3','山东省','德州市','平原县','山东省德州市平原县',null,null,37.1653800,116.4339500),\n(353149,'371427000000','371400000000','371427','3714','夏津县','','','夏津县','3','山东省','德州市','夏津县','山东省德州市夏津县',null,null,36.9485600,116.0017500),\n(353474,'371428000000','371400000000','371428','3714','武城县','','','武城县','3','山东省','德州市','武城县','山东省德州市武城县',null,null,37.2131700,116.0692300),\n(353678,'371471000000','371400000000','371471','3714','德州经济技术开发区','','','德州经济技术开发区','3','山东省','德州市','德州经济技术开发区','山东省德州市德州经济技术开发区',null,null,37.4891510,116.5265270),\n(353754,'371472000000','371400000000','371472','3714','德州运河经济开发区','','','德州运河经济开发区','3','山东省','德州市','德州运河经济开发区','山东省德州市德州运河经济开发区',null,null,37.4500690,116.2610170),\n(353781,'371481000000','371400000000','371481','3714','乐陵市','','','乐陵市','3','山东省','德州市','乐陵市','山东省德州市乐陵市',null,null,37.7291300,117.2306500),\n(354289,'371482000000','371400000000','371482','3714','禹城市','','','禹城市','3','山东省','德州市','禹城市','山东省德州市禹城市',null,null,36.9339400,116.6381300),\n(354691,'371500000000','370000000000','3715','37','聊城市','','聊城市','','2','山东省','聊城市','','山东省聊城市',null,null,36.4345200,115.9884700),\n(354692,'371501000000','371500000000','371501','3715','市辖区','','','市辖区','3','山东省','聊城市','市辖区','山东省聊城市市辖区',null,null,36.4345200,115.9884700),\n(354693,'371502000000','371500000000','371502','3715','东昌府区','','','东昌府区','3','山东省','聊城市','东昌府区','山东省聊城市东昌府区',null,null,36.4345200,115.9884700),\n(355852,'371521000000','371500000000','371521','3715','阳谷县','','','阳谷县','3','山东省','聊城市','阳谷县','山东省聊城市阳谷县',null,null,36.1144700,115.7913100),\n(356745,'371522000000','371500000000','371522','3715','莘县','','','莘县','3','山东省','聊城市','莘县','山东省聊城市莘县',null,null,36.2336100,115.6707200),\n(357896,'371523000000','371500000000','371523','3715','茌平县','','','茌平县','3','山东省','聊城市','茌平县','山东省聊城市茌平县',null,null,36.5806800,116.2552200),\n(358643,'371524000000','371500000000','371524','3715','东阿县','','','东阿县','3','山东省','聊城市','东阿县','山东省聊城市东阿县',null,null,36.3350300,116.2477300),\n(359172,'371525000000','371500000000','371525','3715','冠县','','','冠县','3','山东省','聊城市','冠县','山东省聊城市冠县',null,null,36.4833500,115.4426300),\n(359952,'371526000000','371500000000','371526','3715','高唐县','','','高唐县','3','山东省','聊城市','高唐县','山东省聊城市高唐县',null,null,36.8660200,116.2311100),\n(360610,'371581000000','371500000000','371581','3715','临清市','','','临清市','3','山东省','聊城市','临清市','山东省聊城市临清市',null,null,36.8383400,115.7050400),\n(361281,'371600000000','370000000000','3716','37','滨州市','','滨州市','','2','山东省','滨州市','','山东省滨州市',null,null,37.4272600,118.0227900),\n(361282,'371601000000','371600000000','371601','3716','市辖区','','','市辖区','3','山东省','滨州市','市辖区','山东省滨州市市辖区',null,null,37.4272600,118.0227900),\n(361283,'371602000000','371600000000','371602','3716','滨城区','','','滨城区','3','山东省','滨州市','滨城区','山东省滨州市滨城区',null,null,37.4272600,118.0227900),\n(362269,'371603000000','371600000000','371603','3716','沾化区','','','沾化区','3','山东省','滨州市','沾化区','山东省滨州市沾化区',null,null,37.7005800,118.0988200),\n(362729,'371621000000','371600000000','371621','3716','惠民县','','','惠民县','3','山东省','滨州市','惠民县','山东省滨州市惠民县',null,null,37.4898200,117.5092000),\n(363865,'371622000000','371600000000','371622','3716','阳信县','','','阳信县','3','山东省','滨州市','阳信县','山东省滨州市阳信县',null,null,37.6410900,117.5782000),\n(364733,'371623000000','371600000000','371623','3716','无棣县','','','无棣县','3','山东省','滨州市','无棣县','山东省滨州市无棣县',null,null,37.7699300,117.6257700),\n(365347,'371625000000','371600000000','371625','3716','博兴县','','','博兴县','3','山东省','滨州市','博兴县','山东省滨州市博兴县',null,null,37.1529900,118.1109600),\n(365816,'371626000000','371600000000','371626','3716','邹平县','','','邹平县','3','山东省','滨州市','邹平县','山东省滨州市邹平县',null,null,36.8629900,117.7430900),\n(366684,'371700000000','370000000000','3717','37','菏泽市','','菏泽市','','2','山东省','菏泽市','','山东省菏泽市',null,null,35.0709500,115.5729800),\n(366685,'371701000000','371700000000','371701','3717','市辖区','','','市辖区','3','山东省','菏泽市','市辖区','山东省菏泽市市辖区',null,null,35.0709500,115.5729800),\n(366686,'371702000000','371700000000','371702','3717','牡丹区','','','牡丹区','3','山东省','菏泽市','牡丹区','山东省菏泽市牡丹区',null,null,35.2514100,115.4166600),\n(367297,'371703000000','371700000000','371703','3717','定陶区','','','定陶区','3','山东省','菏泽市','定陶区','山东省菏泽市定陶区',null,null,35.0709500,115.5729800),\n(367677,'371721000000','371700000000','371721','3717','曹县','','','曹县','3','山东省','菏泽市','曹县','山东省菏泽市曹县',null,null,34.8255300,115.5421400),\n(368885,'371722000000','371700000000','371722','3717','单县','','','单县','3','山东省','菏泽市','单县','山东省菏泽市单县',null,null,34.7943800,116.0872400),\n(369416,'371723000000','371700000000','371723','3717','成武县','','','成武县','3','山东省','菏泽市','成武县','山东省菏泽市成武县',null,null,34.9524500,115.8896400),\n(369915,'371724000000','371700000000','371724','3717','巨野县','','','巨野县','3','山东省','菏泽市','巨野县','山东省菏泽市巨野县',null,null,35.3963300,116.0949500),\n(370805,'371725000000','371700000000','371725','3717','郓城县','','','郓城县','3','山东省','菏泽市','郓城县','山东省菏泽市郓城县',null,null,35.5998400,115.9436400),\n(371869,'371726000000','371700000000','371726','3717','鄄城县','','','鄄城县','3','山东省','菏泽市','鄄城县','山东省菏泽市鄄城县',null,null,35.5635000,115.5100500),\n(372278,'371728000000','371700000000','371728','3717','东明县','','','东明县','3','山东省','菏泽市','东明县','山东省菏泽市东明县',null,null,35.2895300,115.0901600),\n(372702,'371771000000','371700000000','371771','3717','菏泽经济技术开发区','','','菏泽经济技术开发区','3','山东省','菏泽市','菏泽经济技术开发区','山东省菏泽市菏泽经济技术开发区',null,null,35.1774100,115.4941640),\n(372815,'371772000000','371700000000','371772','3717','菏泽高新技术开发区','','','菏泽高新技术开发区','3','山东省','菏泽市','菏泽高新技术开发区','山东省菏泽市菏泽高新技术开发区',null,null,35.2429810,115.4143220),\n(372884,'410000000000','0','41','0','河南省','河南省','','','1','河南省','','','河南省',null,null,null,null),\n(372885,'410100000000','410000000000','4101','41','郑州市','','郑州市','','2','河南省','郑州市','','河南省郑州市',null,null,34.7246800,113.6401000),\n(372886,'410101000000','410100000000','410101','4101','市辖区','','','市辖区','3','河南省','郑州市','市辖区','河南省郑州市市辖区',null,null,34.7246800,113.6401000),\n(372887,'410102000000','410100000000','410102','4101','中原区','','','中原区','3','河南省','郑州市','中原区','河南省郑州市中原区',null,null,34.7482100,113.6133200),\n(373053,'410103000000','410100000000','410103','4101','二七区','','','二七区','3','河南省','郑州市','二七区','河南省郑州市二七区',null,null,34.7246800,113.6401000),\n(373237,'410104000000','410100000000','410104','4101','管城回族区','','','管城回族区','3','河南省','郑州市','管城回族区','河南省郑州市管城回族区',null,null,34.7538100,113.6773900),\n(373385,'410105000000','410100000000','410105','4101','金水区','','','金水区','3','河南省','郑州市','金水区','河南省郑州市金水区',null,null,34.7997700,113.6607200),\n(373667,'410106000000','410100000000','410106','4101','上街区','','','上街区','3','河南省','郑州市','上街区','河南省郑州市上街区',null,null,34.8028000,113.3089200),\n(373733,'410108000000','410100000000','410108','4101','惠济区','','','惠济区','3','河南省','郑州市','惠济区','河南省郑州市惠济区',null,null,34.8673900,113.6169400),\n(373817,'410122000000','410100000000','410122','4101','中牟县','','','中牟县','3','河南省','郑州市','中牟县','河南省郑州市中牟县',null,null,34.7190300,113.9762400),\n(374161,'410171000000','410100000000','410171','4101','郑州经济技术开发区','','','郑州经济技术开发区','3','河南省','郑州市','郑州经济技术开发区','河南省郑州市郑州经济技术开发区',null,null,34.7218400,113.7431720),\n(374229,'410172000000','410100000000','410172','4101','郑州高新技术产业开发区','','','郑州高新技术产业开发区','3','河南省','郑州市','郑州高新技术产业开发区','河南省郑州市郑州高新技术产业开发区',null,null,34.8421100,113.7397690),\n(374293,'410173000000','410100000000','410173','4101','郑州航空港经济综合实验区','','','郑州航空港经济综合实验区','3','河南省','郑州市','郑州航空港经济综合实验区','河南省郑州市郑州航空港经济综合实验区',null,null,34.7542380,113.7749710),\n(374479,'410181000000','410100000000','410181','4101','巩义市','','','巩义市','3','河南省','郑州市','巩义市','河南省郑州市巩义市',null,null,34.7479800,113.0220600),\n(374820,'410182000000','410100000000','410182','4101','荥阳市','','','荥阳市','3','河南省','郑州市','荥阳市','河南省郑州市荥阳市',null,null,34.7876200,113.3834900),\n(375138,'410183000000','410100000000','410183','4101','新密市','','','新密市','3','河南省','郑州市','新密市','河南省郑州市新密市',null,null,34.5395200,113.3904400),\n(375508,'410184000000','410100000000','410184','4101','新郑市','','','新郑市','3','河南省','郑州市','新郑市','河南省郑州市新郑市',null,null,34.3960500,113.7416100),\n(375808,'410185000000','410100000000','410185','4101','登封市','','','登封市','3','河南省','郑州市','登封市','河南省郑州市登封市',null,null,34.4534800,113.0502800),\n(376149,'410200000000','410000000000','4102','41','开封市','','开封市','','2','河南省','开封市','','河南省开封市',null,null,34.7886100,114.3481600),\n(376150,'410201000000','410200000000','410201','4102','市辖区','','','市辖区','3','河南省','开封市','市辖区','河南省开封市市辖区',null,null,34.7886100,114.3481600),\n(376151,'410202000000','410200000000','410202','4102','龙亭区','','','龙亭区','3','河南省','开封市','龙亭区','河南省开封市龙亭区',null,null,34.8156800,114.3546100),\n(376314,'410203000000','410200000000','410203','4102','顺河回族区','','','顺河回族区','3','河南省','开封市','顺河回族区','河南省开封市顺河回族区',null,null,34.7997100,114.3643500),\n(376391,'410204000000','410200000000','410204','4102','鼓楼区','','','鼓楼区','3','河南省','开封市','鼓楼区','河南省开封市鼓楼区',null,null,34.7886100,114.3481600),\n(376442,'410205000000','410200000000','410205','4102','禹王台区','','','禹王台区','3','河南省','开封市','禹王台区','河南省开封市禹王台区',null,null,34.7771700,114.3482600),\n(376498,'410212000000','410200000000','410212','4102','祥符区','','','祥符区','3','河南省','开封市','祥符区','河南省开封市祥符区',null,null,34.7570000,114.4413600),\n(376859,'410221000000','410200000000','410221','4102','杞县','','','杞县','3','河南省','开封市','杞县','河南省开封市杞县',null,null,34.5503400,114.7828300),\n(377482,'410222000000','410200000000','410222','4102','通许县','','','通许县','3','河南省','开封市','通许县','河南省开封市通许县',null,null,34.4804400,114.4674100),\n(377806,'410223000000','410200000000','410223','4102','尉氏县','','','尉氏县','3','河南省','开封市','尉氏县','河南省开封市尉氏县',null,null,34.4116100,114.1929700),\n(378345,'410225000000','410200000000','410225','4102','兰考县','','','兰考县','3','河南省','开封市','兰考县','河南省开封市兰考县',null,null,34.8223000,114.8211500),\n(378835,'410300000000','410000000000','4103','41','洛阳市','','洛阳市','','2','河南省','洛阳市','','河南省洛阳市',null,null,34.7043100,112.5107800),\n(378836,'410301000000','410300000000','410301','4103','市辖区','','','市辖区','3','河南省','洛阳市','市辖区','河南省洛阳市市辖区',null,null,34.7043100,112.5107800),\n(378837,'410302000000','410300000000','410302','4103','老城区','','','老城区','3','河南省','洛阳市','老城区','河南省洛阳市老城区',null,null,34.6835600,112.4695800),\n(378894,'410303000000','410300000000','410303','4103','西工区','','','西工区','3','河南省','洛阳市','西工区','河南省洛阳市西工区',null,null,34.6606400,112.4282700),\n(378969,'410304000000','410300000000','410304','4103','瀍河回族区','','','瀍河回族区','3','河南省','洛阳市','瀍河回族区','河南省洛阳市瀍河回族区',null,null,34.7043100,112.5107800),\n(379008,'410305000000','410300000000','410305','4103','涧西区','','','涧西区','3','河南省','洛阳市','涧西区','河南省洛阳市涧西区',null,null,34.6577400,112.3957000),\n(379092,'410306000000','410300000000','410306','4103','吉利区','','','吉利区','3','河南省','洛阳市','吉利区','河南省洛阳市吉利区',null,null,34.9009900,112.5888800),\n(379135,'410311000000','410300000000','410311','4103','洛龙区','','','洛龙区','3','河南省','洛阳市','洛龙区','河南省洛阳市洛龙区',null,null,34.6186600,112.4640300),\n(379424,'410322000000','410300000000','410322','4103','孟津县','','','孟津县','3','河南省','洛阳市','孟津县','河南省洛阳市孟津县',null,null,34.8254400,112.4451000),\n(379669,'410323000000','410300000000','410323','4103','新安县','','','新安县','3','河南省','洛阳市','新安县','河南省洛阳市新安县',null,null,34.7281800,112.1324200),\n(379992,'410324000000','410300000000','410324','4103','栾川县','','','栾川县','3','河南省','洛阳市','栾川县','河南省洛阳市栾川县',null,null,33.7857600,111.6157900),\n(380220,'410325000000','410300000000','410325','4103','嵩县','','','嵩县','3','河南省','洛阳市','嵩县','河南省洛阳市嵩县',null,null,34.1345100,112.0857000),\n(380565,'410326000000','410300000000','410326','4103','汝阳县','','','汝阳县','3','河南省','洛阳市','汝阳县','河南省洛阳市汝阳县',null,null,34.1538800,112.4731700),\n(380800,'410327000000','410300000000','410327','4103','宜阳县','','','宜阳县','3','河南省','洛阳市','宜阳县','河南省洛阳市宜阳县',null,null,34.5149600,112.1792000),\n(381179,'410328000000','410300000000','410328','4103','洛宁县','','','洛宁县','3','河南省','洛阳市','洛宁县','河南省洛阳市洛宁县',null,null,34.3891700,111.6531300),\n(381588,'410329000000','410300000000','410329','4103','伊川县','','','伊川县','3','河南省','洛阳市','伊川县','河南省洛阳市伊川县',null,null,34.4213500,112.4256800),\n(381977,'410371000000','410300000000','410371','4103','洛阳高新技术产业开发区','','','洛阳高新技术产业开发区','3','河南省','洛阳市','洛阳高新技术产业开发区','河南省洛阳市洛阳高新技术产业开发区',null,null,34.6234890,112.4066090),\n(382018,'410381000000','410300000000','410381','4103','偃师市','','','偃师市','3','河南省','洛阳市','偃师市','河南省洛阳市偃师市',null,null,34.7276300,112.7896500),\n(382278,'410400000000','410000000000','4104','41','平顶山市','','平顶山市','','2','河南省','平顶山市','','河南省平顶山市',null,null,33.8988900,112.8988800),\n(382279,'410401000000','410400000000','410401','4104','市辖区','','','市辖区','3','河南省','平顶山市','市辖区','河南省平顶山市市辖区',null,null,33.8988900,112.8988800),\n(382280,'410402000000','410400000000','410402','4104','新华区','','','新华区','3','河南省','平顶山市','新华区','河南省平顶山市新华区',null,null,33.7374100,113.2943100),\n(382357,'410403000000','410400000000','410403','4104','卫东区','','','卫东区','3','河南省','平顶山市','卫东区','河南省平顶山市卫东区',null,null,33.7346900,113.3350300),\n(382428,'410404000000','410400000000','410404','4104','石龙区','','','石龙区','3','河南省','平顶山市','石龙区','河南省平顶山市石龙区',null,null,33.8988900,112.8988800),\n(382447,'410411000000','410400000000','410411','4104','湛河区','','','湛河区','3','河南省','平顶山市','湛河区','河南省平顶山市湛河区',null,null,33.7009000,113.2760200),\n(382558,'410421000000','410400000000','410421','4104','宝丰县','','','宝丰县','3','河南省','平顶山市','宝丰县','河南省平顶山市宝丰县',null,null,33.8684000,113.0547900),\n(382902,'410422000000','410400000000','410422','4104','叶县','','','叶县','3','河南省','平顶山市','叶县','河南省平顶山市叶县',null,null,33.6268300,113.3573700),\n(383473,'410423000000','410400000000','410423','4104','鲁山县','','','鲁山县','3','河南省','平顶山市','鲁山县','河南省平顶山市鲁山县',null,null,33.7385400,112.9080200),\n(384057,'410425000000','410400000000','410425','4104','郏县','','','郏县','3','河南省','平顶山市','郏县','河南省平顶山市郏县',null,null,33.9718000,113.2126200),\n(384450,'410471000000','410400000000','410471','4104','平顶山高新技术产业开发区','','','平顶山高新技术产业开发区','3','河南省','平顶山市','平顶山高新技术产业开发区','河南省平顶山市平顶山高新技术产业开发区',null,null,33.7322690,113.3876040),\n(384483,'410472000000','410400000000','410472','4104','平顶山市新城区','','','平顶山市新城区','3','河南省','平顶山市','平顶山市新城区','河南省平顶山市平顶山市新城区',null,null,33.7374100,113.2943100),\n(384531,'410481000000','410400000000','410481','4104','舞钢市','','','舞钢市','3','河南省','平顶山市','舞钢市','河南省平顶山市舞钢市',null,null,33.2931500,113.5253100),\n(384763,'410482000000','410400000000','410482','4104','汝州市','','','汝州市','3','河南省','平顶山市','汝州市','河南省平顶山市汝州市',null,null,34.1671700,112.8443700),\n(385246,'410500000000','410000000000','4105','41','安阳市','','安阳市','','2','河南省','安阳市','','河南省安阳市',null,null,36.1084900,114.3551100),\n(385247,'410501000000','410500000000','410501','4105','市辖区','','','市辖区','3','河南省','安阳市','市辖区','河南省安阳市市辖区',null,null,36.1084900,114.3551100),\n(385248,'410502000000','410500000000','410502','4105','文峰区','','','文峰区','3','河南省','安阳市','文峰区','河南省安阳市文峰区',null,null,36.0905200,114.3568800),\n(385375,'410503000000','410500000000','410503','4105','北关区','','','北关区','3','河南省','安阳市','北关区','河南省安阳市北关区',null,null,36.1084900,114.3551100),\n(385502,'410505000000','410500000000','410505','4105','殷都区','','','殷都区','3','河南省','安阳市','殷都区','河南省安阳市殷都区',null,null,36.1099400,114.3034500),\n(385598,'410506000000','410500000000','410506','4105','龙安区','','','龙安区','3','河南省','安阳市','龙安区','河南省安阳市龙安区',null,null,36.0760900,114.3008900),\n(385758,'410522000000','410500000000','410522','4105','安阳县','','','安阳县','3','河南省','安阳市','安阳县','河南省安阳市安阳县',null,null,36.2125600,114.2318200),\n(386378,'410523000000','410500000000','410523','4105','汤阴县','','','汤阴县','3','河南省','安阳市','汤阴县','河南省安阳市汤阴县',null,null,35.9213800,114.3572300),\n(386695,'410526000000','410500000000','410526','4105','滑县','','','滑县','3','河南省','安阳市','滑县','河南省安阳市滑县',null,null,35.5753400,114.5193000),\n(387738,'410527000000','410500000000','410527','4105','内黄县','','','内黄县','3','河南省','安阳市','内黄县','河南省安阳市内黄县',null,null,35.9471400,114.8993600),\n(388288,'410571000000','410500000000','410571','4105','安阳高新技术产业开发区','','','安阳高新技术产业开发区','3','河南省','安阳市','安阳高新技术产业开发区','河南省安阳市安阳高新技术产业开发区',null,null,36.0685120,114.3464740),\n(388325,'410581000000','410500000000','410581','4105','林州市','','','林州市','3','河南省','安阳市','林州市','河南省安阳市林州市',null,null,36.0830800,113.8190800),\n(388929,'410600000000','410000000000','4106','41','鹤壁市','','鹤壁市','','2','河南省','鹤壁市','','河南省鹤壁市',null,null,35.9547000,114.1633000),\n(388930,'410601000000','410600000000','410601','4106','市辖区','','','市辖区','3','河南省','鹤壁市','市辖区','河南省鹤壁市市辖区',null,null,35.9547000,114.1633000),\n(388931,'410602000000','410600000000','410602','4106','鹤山区','','','鹤山区','3','河南省','鹤壁市','鹤山区','河南省鹤壁市鹤山区',null,null,35.9547000,114.1633000),\n(389020,'410603000000','410600000000','410603','4106','山城区','','','山城区','3','河南省','鹤壁市','山城区','河南省鹤壁市山城区',null,null,35.8976500,114.1844400),\n(389130,'410611000000','410600000000','410611','4106','淇滨区','','','淇滨区','3','河南省','鹤壁市','淇滨区','河南省鹤壁市淇滨区',null,null,35.7413000,114.2987200),\n(389279,'410621000000','410600000000','410621','4106','浚县','','','浚县','3','河南省','鹤壁市','浚县','河南省鹤壁市浚县',null,null,35.6761700,114.5507800),\n(389755,'410622000000','410600000000','410622','4106','淇县','','','淇县','3','河南省','鹤壁市','淇县','河南省鹤壁市淇县',null,null,35.6078600,114.1976600),\n(389941,'410671000000','410600000000','410671','4106','鹤壁经济技术开发区','','','鹤壁经济技术开发区','3','河南省','鹤壁市','鹤壁经济技术开发区','河南省鹤壁市鹤壁经济技术开发区',null,null,35.7608030,114.3096770),\n(389957,'410700000000','410000000000','4107','41','新乡市','','新乡市','','2','河南省','新乡市','','河南省新乡市',null,null,35.3718000,113.9059800),\n(389958,'410701000000','410700000000','410701','4107','市辖区','','','市辖区','3','河南省','新乡市','市辖区','河南省新乡市市辖区',null,null,35.3718000,113.9059800),\n(389959,'410702000000','410700000000','410702','4107','红旗区','','','红旗区','3','河南省','新乡市','红旗区','河南省新乡市红旗区',null,null,35.3035100,113.8752300),\n(390045,'410703000000','410700000000','410703','4107','卫滨区','','','卫滨区','3','河南省','新乡市','卫滨区','河南省新乡市卫滨区',null,null,35.3022700,113.8658200),\n(390108,'410704000000','410700000000','410704','4107','凤泉区','','','凤泉区','3','河南省','新乡市','凤泉区','河南省新乡市凤泉区',null,null,35.3718000,113.9059800),\n(390160,'410711000000','410700000000','410711','4107','牧野区','','','牧野区','3','河南省','新乡市','牧野区','河南省新乡市牧野区',null,null,35.3149300,113.9086600),\n(390263,'410721000000','410700000000','410721','4107','新乡县','','','新乡县','3','河南省','新乡市','新乡县','河南省新乡市新乡县',null,null,35.1907900,113.8051600),\n(390450,'410724000000','410700000000','410724','4107','获嘉县','','','获嘉县','3','河南省','新乡市','获嘉县','河南省新乡市获嘉县',null,null,35.2596200,113.6571600),\n(390692,'410725000000','410700000000','410725','4107','原阳县','','','原阳县','3','河南省','新乡市','原阳县','河南省新乡市原阳县',null,null,35.0656900,113.9399700),\n(391165,'410726000000','410700000000','410726','4107','延津县','','','延津县','3','河南省','新乡市','延津县','河南省新乡市延津县',null,null,35.1419400,114.2051500),\n(391528,'410727000000','410700000000','410727','4107','封丘县','','','封丘县','3','河南省','新乡市','封丘县','河南省新乡市封丘县',null,null,35.0411900,114.4186100),\n(392156,'410728000000','410700000000','410728','4107','长垣县','','','长垣县','3','河南省','新乡市','长垣县','河南省新乡市长垣县',null,null,35.2004900,114.6688600),\n(392787,'410771000000','410700000000','410771','4107','新乡高新技术产业开发区','','','新乡高新技术产业开发区','3','河南省','新乡市','新乡高新技术产业开发区','河南省新乡市新乡高新技术产业开发区',null,null,35.2840000,113.9027180),\n(392815,'410772000000','410700000000','410772','4107','新乡经济技术开发区','','','新乡经济技术开发区','3','河南省','新乡市','新乡经济技术开发区','河南省新乡市新乡经济技术开发区',null,null,35.2902370,114.0450740),\n(392831,'410773000000','410700000000','410773','4107','新乡市平原城乡一体化示范区','','','新乡市平原城乡一体化示范区','3','河南省','新乡市','新乡市平原城乡一体化示范区','河南省新乡市新乡市平原城乡一体化示范区',null,null,35.0107230,113.8037410),\n(392970,'410781000000','410700000000','410781','4107','卫辉市','','','卫辉市','3','河南省','新乡市','卫辉市','河南省新乡市卫辉市',null,null,35.3984700,114.0645900),\n(393351,'410782000000','410700000000','410782','4107','辉县市','','','辉县市','3','河南省','新乡市','辉县市','河南省新乡市辉县市',null,null,35.4621200,113.8054000),\n(393933,'410800000000','410000000000','4108','41','焦作市','','焦作市','','2','河南省','焦作市','','河南省焦作市',null,null,35.2405200,113.2306400),\n(393934,'410801000000','410800000000','410801','4108','市辖区','','','市辖区','3','河南省','焦作市','市辖区','河南省焦作市市辖区',null,null,35.2405200,113.2306400),\n(393935,'410802000000','410800000000','410802','4108','解放区','','','解放区','3','河南省','焦作市','解放区','河南省焦作市解放区',null,null,35.2405200,113.2306400),\n(394002,'410803000000','410800000000','410803','4108','中站区','','','中站区','3','河南省','焦作市','中站区','河南省焦作市中站区',null,null,35.2367000,113.1829600),\n(394062,'410804000000','410800000000','410804','4108','马村区','','','马村区','3','河南省','焦作市','马村区','河南省焦作市马村区',null,null,35.2561500,113.3229000),\n(394148,'410811000000','410800000000','410811','4108','山阳区','','','山阳区','3','河南省','焦作市','山阳区','河南省焦作市山阳区',null,null,35.2141400,113.2542000),\n(394212,'410821000000','410800000000','410821','4108','修武县','','','修武县','3','河南省','焦作市','修武县','河南省焦作市修武县',null,null,35.2236100,113.4477600),\n(394415,'410822000000','410800000000','410822','4108','博爱县','','','博爱县','3','河南省','焦作市','博爱县','河南省焦作市博爱县',null,null,35.1712300,113.0645300),\n(394643,'410823000000','410800000000','410823','4108','武陟县','','','武陟县','3','河南省','焦作市','武陟县','河南省焦作市武陟县',null,null,35.0995200,113.4018400),\n(395011,'410825000000','410800000000','410825','4108','温县','','','温县','3','河南省','焦作市','温县','河南省焦作市温县',null,null,34.9402300,113.0805700),\n(395292,'410871000000','410800000000','410871','4108','焦作城乡一体化示范区','','','焦作城乡一体化示范区','3','河南省','焦作市','焦作城乡一体化示范区','河南省焦作市焦作城乡一体化示范区',null,null,35.1756210,113.2531970),\n(395403,'410882000000','410800000000','410882','4108','沁阳市','','','沁阳市','3','河南省','焦作市','沁阳市','河南省焦作市沁阳市',null,null,35.0876000,112.9506000),\n(395757,'410883000000','410800000000','410883','4108','孟州市','','','孟州市','3','河南省','焦作市','孟州市','河南省焦作市孟州市',null,null,34.9073500,112.7913400),\n(396058,'410900000000','410000000000','4109','41','濮阳市','','濮阳市','','2','河南省','濮阳市','','河南省濮阳市',null,null,35.7774500,115.0743200),\n(396059,'410901000000','410900000000','410901','4109','市辖区','','','市辖区','3','河南省','濮阳市','市辖区','河南省濮阳市市辖区',null,null,35.7774500,115.0743200),\n(396060,'410902000000','410900000000','410902','4109','华龙区','','','华龙区','3','河南省','濮阳市','华龙区','河南省濮阳市华龙区',null,null,35.7774500,115.0743200),\n(396223,'410922000000','410900000000','410922','4109','清丰县','','','清丰县','3','河南省','濮阳市','清丰县','河南省濮阳市清丰县',null,null,35.8851000,115.1042100),\n(396750,'410923000000','410900000000','410923','4109','南乐县','','','南乐县','3','河南省','濮阳市','南乐县','河南省濮阳市南乐县',null,null,36.0697900,115.2049100),\n(397090,'410926000000','410900000000','410926','4109','范县','','','范县','3','河南省','濮阳市','范县','河南省濮阳市范县',null,null,35.8519300,115.5041100),\n(397684,'410927000000','410900000000','410927','4109','台前县','','','台前县','3','河南省','濮阳市','台前县','河南省濮阳市台前县',null,null,35.9693100,115.8716300),\n(398069,'410928000000','410900000000','410928','4109','濮阳县','','','濮阳县','3','河南省','濮阳市','濮阳县','河南省濮阳市濮阳县',null,null,35.7122100,115.0290300),\n(399076,'410971000000','410900000000','410971','4109','河南濮阳工业园区','','','河南濮阳工业园区','3','河南省','濮阳市','河南濮阳工业园区','河南省濮阳市河南濮阳工业园区',null,null,35.7493970,115.1824800),\n(399101,'410972000000','410900000000','410972','4109','濮阳经济技术开发区','','','濮阳经济技术开发区','3','河南省','濮阳市','濮阳经济技术开发区','河南省濮阳市濮阳经济技术开发区',null,null,35.7667010,114.9909210),\n(399267,'411000000000','410000000000','4110','41','许昌市','','许昌市','','2','河南省','许昌市','','河南省许昌市',null,null,34.1259600,113.8227200),\n(399268,'411001000000','411000000000','411001','4110','市辖区','','','市辖区','3','河南省','许昌市','市辖区','河南省许昌市市辖区',null,null,34.1259600,113.8227200),\n(399269,'411002000000','411000000000','411002','4110','魏都区','','','魏都区','3','河南省','许昌市','魏都区','河南省许昌市魏都区',null,null,34.0461100,113.8308000),\n(399380,'411003000000','411000000000','411003','4110','建安区','','','建安区','3','河南省','许昌市','建安区','河南省许昌市建安区',null,null,34.0357000,113.8523300),\n(399836,'411024000000','411000000000','411024','4110','鄢陵县','','','鄢陵县','3','河南省','许昌市','鄢陵县','河南省许昌市鄢陵县',null,null,34.1023300,114.1773900),\n(400235,'411025000000','411000000000','411025','4110','襄城县','','','襄城县','3','河南省','许昌市','襄城县','河南省许昌市襄城县',null,null,33.8507200,113.5066900),\n(400700,'411071000000','411000000000','411071','4110','许昌经济技术开发区','','','许昌经济技术开发区','3','河南省','许昌市','许昌经济技术开发区','河南省许昌市许昌经济技术开发区',null,null,33.9996190,113.7969670),\n(400728,'411081000000','411000000000','411081','4110','禹州市','','','禹州市','3','河南省','许昌市','禹州市','河南省许昌市禹州市',null,null,34.1404800,113.4879400),\n(401430,'411082000000','411000000000','411082','4110','长葛市','','','长葛市','3','河南省','许昌市','长葛市','河南省许昌市长葛市',null,null,34.2167200,113.7682700),\n(401821,'411100000000','410000000000','4111','41','漯河市','','漯河市','','2','河南省','漯河市','','河南省漯河市',null,null,33.5452800,113.9202000),\n(401822,'411101000000','411100000000','411101','4111','市辖区','','','市辖区','3','河南省','漯河市','市辖区','河南省漯河市市辖区',null,null,33.5452800,113.9202000),\n(401823,'411102000000','411100000000','411102','4111','源汇区','','','源汇区','3','河南省','漯河市','源汇区','河南省漯河市源汇区',null,null,33.5452800,113.9202000),\n(401959,'411103000000','411100000000','411103','4111','郾城区','','','郾城区','3','河南省','漯河市','郾城区','河南省漯河市郾城区',null,null,33.5870500,114.0066400),\n(402168,'411104000000','411100000000','411104','4111','召陵区','','','召陵区','3','河南省','漯河市','召陵区','河南省漯河市召陵区',null,null,33.5864500,114.0938900),\n(402383,'411121000000','411100000000','411121','4111','舞阳县','','','舞阳县','3','河南省','漯河市','舞阳县','河南省漯河市舞阳县',null,null,33.4376500,113.6093100),\n(402795,'411122000000','411100000000','411122','4111','临颍县','','','临颍县','3','河南省','漯河市','临颍县','河南省漯河市临颍县',null,null,33.8095800,113.9344300),\n(403178,'411171000000','411100000000','411171','4111','漯河经济技术开发区','','','漯河经济技术开发区','3','河南省','漯河市','漯河经济技术开发区','河南省漯河市漯河经济技术开发区',null,null,33.5507930,114.0498280),\n(403210,'411200000000','410000000000','4112','41','三门峡市','','三门峡市','','2','河南省','三门峡市','','河南省三门峡市',null,null,34.7714100,111.1874700),\n(403211,'411201000000','411200000000','411201','4112','市辖区','','','市辖区','3','河南省','三门峡市','市辖区','河南省三门峡市市辖区',null,null,34.7714100,111.1874700),\n(403212,'411202000000','411200000000','411202','4112','湖滨区','','','湖滨区','3','河南省','三门峡市','湖滨区','河南省三门峡市湖滨区',null,null,34.7714100,111.1874700),\n(403309,'411203000000','411200000000','411203','4112','陕州区','','','陕州区','3','河南省','三门峡市','陕州区','河南省三门峡市陕州区',null,null,34.7205400,111.1033800),\n(403595,'411221000000','411200000000','411221','4112','渑池县','','','渑池县','3','河南省','三门峡市','渑池县','河南省三门峡市渑池县',null,null,34.7672600,111.7619000),\n(403857,'411224000000','411200000000','411224','4112','卢氏县','','','卢氏县','3','河南省','三门峡市','卢氏县','河南省三门峡市卢氏县',null,null,34.0543800,111.0478300),\n(404244,'411271000000','411200000000','411271','4112','河南三门峡经济开发区','','','河南三门峡经济开发区','3','河南省','三门峡市','河南三门峡经济开发区','河南省三门峡市河南三门峡经济开发区',null,null,34.7918780,111.1619570),\n(404252,'411281000000','411200000000','411281','4112','义马市','','','义马市','3','河南省','三门峡市','义马市','河南省三门峡市义马市',null,null,34.7472500,111.8744900),\n(404295,'411282000000','411200000000','411282','4112','灵宝市','','','灵宝市','3','河南省','三门峡市','灵宝市','河南省三门峡市灵宝市',null,null,34.5168500,110.8945600),\n(404779,'411300000000','410000000000','4113','41','南阳市','','南阳市','','2','河南省','南阳市','','河南省南阳市',null,null,33.0036000,112.5396000),\n(404780,'411301000000','411300000000','411301','4113','市辖区','','','市辖区','3','河南省','南阳市','市辖区','河南省南阳市市辖区',null,null,33.0036000,112.5396000),\n(404781,'411302000000','411300000000','411302','4113','宛城区','','','宛城区','3','河南省','南阳市','宛城区','河南省南阳市宛城区',null,null,33.0036000,112.5396000),\n(405047,'411303000000','411300000000','411303','4113','卧龙区','','','卧龙区','3','河南省','南阳市','卧龙区','河南省南阳市卧龙区',null,null,32.9864600,112.5349400),\n(405359,'411321000000','411300000000','411321','4113','南召县','','','南召县','3','河南省','南阳市','南召县','河南省南阳市南召县',null,null,33.4897900,112.4291400),\n(405729,'411322000000','411300000000','411322','4113','方城县','','','方城县','3','河南省','南阳市','方城县','河南省南阳市方城县',null,null,33.2543900,113.0125500),\n(406314,'411323000000','411300000000','411323','4113','西峡县','','','西峡县','3','河南省','南阳市','西峡县','河南省南阳市西峡县',null,null,33.3056000,111.4724400),\n(406633,'411324000000','411300000000','411324','4113','镇平县','','','镇平县','3','河南省','南阳市','镇平县','河南省南阳市镇平县',null,null,33.0339100,112.2344800),\n(407086,'411325000000','411300000000','411325','4113','内乡县','','','内乡县','3','河南省','南阳市','内乡县','河南省南阳市内乡县',null,null,33.0448300,111.8492600),\n(407399,'411326000000','411300000000','411326','4113','淅川县','','','淅川县','3','河南省','南阳市','淅川县','河南省南阳市淅川县',null,null,33.1381500,111.4907800),\n(407917,'411327000000','411300000000','411327','4113','社旗县','','','社旗县','3','河南省','南阳市','社旗县','河南省南阳市社旗县',null,null,33.0561400,112.9479300),\n(408191,'411328000000','411300000000','411328','4113','唐河县','','','唐河县','3','河南省','南阳市','唐河县','河南省南阳市唐河县',null,null,32.6811700,112.8074500),\n(408753,'411329000000','411300000000','411329','4113','新野县','','','新野县','3','河南省','南阳市','新野县','河南省南阳市新野县',null,null,32.5209300,112.3600600),\n(409041,'411330000000','411300000000','411330','4113','桐柏县','','','桐柏县','3','河南省','南阳市','桐柏县','河南省南阳市桐柏县',null,null,32.3791300,113.4289200),\n(409277,'411371000000','411300000000','411371','4113','南阳高新技术产业开发区','','','南阳高新技术产业开发区','3','河南省','南阳市','南阳高新技术产业开发区','河南省南阳市南阳高新技术产业开发区',null,null,33.0278210,112.5382610),\n(409300,'411372000000','411300000000','411372','4113','南阳市城乡一体化示范区','','','南阳市城乡一体化示范区','3','河南省','南阳市','南阳市城乡一体化示范区','河南省南阳市南阳市城乡一体化示范区',null,null,32.9750400,112.5816730),\n(409361,'411381000000','411300000000','411381','4113','邓州市','','','邓州市','3','河南省','南阳市','邓州市','河南省南阳市邓州市',null,null,32.6877700,112.0873600),\n(410023,'411400000000','410000000000','4114','41','商丘市','','商丘市','','2','河南省','商丘市','','河南省商丘市',null,null,34.4437900,115.6139600),\n(410024,'411401000000','411400000000','411401','4114','市辖区','','','市辖区','3','河南省','商丘市','市辖区','河南省商丘市市辖区',null,null,34.4437900,115.6139600),\n(410025,'411402000000','411400000000','411402','4114','梁园区','','','梁园区','3','河南省','商丘市','梁园区','河南省商丘市梁园区',null,null,34.4437900,115.6139600),\n(410289,'411403000000','411400000000','411403','4114','睢阳区','','','睢阳区','3','河南省','商丘市','睢阳区','河南省商丘市睢阳区',null,null,34.3881800,115.6534700),\n(410692,'411421000000','411400000000','411421','4114','民权县','','','民权县','3','河南省','商丘市','民权县','河南省商丘市民权县',null,null,34.6469100,115.1476600),\n(411272,'411422000000','411400000000','411422','4114','睢县','','','睢县','3','河南省','商丘市','睢县','河南省商丘市睢县',null,null,34.4452600,115.0715300),\n(411850,'411423000000','411400000000','411423','4114','宁陵县','','','宁陵县','3','河南省','商丘市','宁陵县','河南省商丘市宁陵县',null,null,34.4545400,115.3051600),\n(412230,'411424000000','411400000000','411424','4114','柘城县','','','柘城县','3','河南省','商丘市','柘城县','河南省商丘市柘城县',null,null,34.0911400,115.3054400),\n(412770,'411425000000','411400000000','411425','4114','虞城县','','','虞城县','3','河南省','商丘市','虞城县','河南省商丘市虞城县',null,null,34.3973700,115.8651900),\n(413417,'411426000000','411400000000','411426','4114','夏邑县','','','夏邑县','3','河南省','商丘市','夏邑县','河南省商丘市夏邑县',null,null,34.2392900,116.1296900),\n(414187,'411471000000','411400000000','411471','4114','豫东综合物流产业聚集区','','','豫东综合物流产业聚集区','3','河南省','商丘市','豫东综合物流产业聚集区','河南省商丘市豫东综合物流产业聚集区',null,null,34.3316800,115.6581730),\n(414260,'411472000000','411400000000','411472','4114','河南商丘经济开发区','','','河南商丘经济开发区','3','河南省','商丘市','河南商丘经济开发区','河南省商丘市河南商丘经济开发区',null,null,34.3981970,115.7023090),\n(414304,'411481000000','411400000000','411481','4114','永城市','','','永城市','3','河南省','商丘市','永城市','河南省商丘市永城市',null,null,33.9291500,116.4494600),\n(415104,'411500000000','410000000000','4115','41','信阳市','','信阳市','','2','河南省','信阳市','','河南省信阳市',null,null,32.1168300,114.0585700),\n(415105,'411501000000','411500000000','411501','4115','市辖区','','','市辖区','3','河南省','信阳市','市辖区','河南省信阳市市辖区',null,null,32.1168300,114.0585700),\n(415106,'411502000000','411500000000','411502','4115','浉河区','','','浉河区','3','河南省','信阳市','浉河区','河南省信阳市浉河区',null,null,32.1168300,114.0585700),\n(415383,'411503000000','411500000000','411503','4115','平桥区','','','平桥区','3','河南省','信阳市','平桥区','河南省信阳市平桥区',null,null,32.1010500,114.1256100),\n(415732,'411521000000','411500000000','411521','4115','罗山县','','','罗山县','3','河南省','信阳市','罗山县','河南省信阳市罗山县',null,null,32.2031400,114.5130700),\n(416059,'411522000000','411500000000','411522','4115','光山县','','','光山县','3','河南省','信阳市','光山县','河南省信阳市光山县',null,null,32.0099700,114.9187800),\n(416439,'411523000000','411500000000','411523','4115','新县','','','新县','3','河南省','信阳市','新县','河南省信阳市新县',null,null,31.6438900,114.8792900),\n(416662,'411524000000','411500000000','411524','4115','商城县','','','商城县','3','河南省','信阳市','商城县','河南省信阳市商城县',null,null,31.7983600,115.4069000),\n(417053,'411525000000','411500000000','411525','4115','固始县','','','固始县','3','河南省','信阳市','固始县','河南省信阳市固始县',null,null,32.1683900,115.6548100),\n(417736,'411526000000','411500000000','411526','4115','潢川县','','','潢川县','3','河南省','信阳市','潢川县','河南省信阳市潢川县',null,null,32.1315600,115.0512900),\n(418046,'411527000000','411500000000','411527','4115','淮滨县','','','淮滨县','3','河南省','信阳市','淮滨县','河南省信阳市淮滨县',null,null,32.4733900,115.4198700),\n(418361,'411528000000','411500000000','411528','4115','息县','','','息县','3','河南省','信阳市','息县','河南省信阳市息县',null,null,32.3428200,114.7402400),\n(418745,'411571000000','411500000000','411571','4115','信阳高新技术产业开发区','','','信阳高新技术产业开发区','3','河南省','信阳市','信阳高新技术产业开发区','河南省信阳市信阳高新技术产业开发区',null,null,32.1254200,114.1804730),\n(418757,'411600000000','410000000000','4116','41','周口市','','周口市','','2','河南省','周口市','','河南省周口市',null,null,33.6473800,114.6504800),\n(418758,'411601000000','411600000000','411601','4116','市辖区','','','市辖区','3','河南省','周口市','市辖区','河南省周口市市辖区',null,null,33.6473800,114.6504800),\n(418759,'411602000000','411600000000','411602','4116','川汇区','','','川汇区','3','河南省','周口市','川汇区','河南省周口市川汇区',null,null,33.6473800,114.6504800),\n(418930,'411621000000','411600000000','411621','4116','扶沟县','','','扶沟县','3','河南省','周口市','扶沟县','河南省周口市扶沟县',null,null,34.0600000,114.3948200),\n(419359,'411622000000','411600000000','411622','4116','西华县','','','西华县','3','河南省','周口市','西华县','河南省周口市西华县',null,null,33.7675400,114.5297400),\n(419863,'411623000000','411600000000','411623','4116','商水县','','','商水县','3','河南省','周口市','商水县','河南省周口市商水县',null,null,33.5425600,114.6116500),\n(420478,'411624000000','411600000000','411624','4116','沈丘县','','','沈丘县','3','河南省','周口市','沈丘县','河南省周口市沈丘县',null,null,33.4094000,115.0985600),\n(421073,'411625000000','411600000000','411625','4116','郸城县','','','郸城县','3','河南省','周口市','郸城县','河南省周口市郸城县',null,null,33.6447500,115.1770400),\n(421613,'411626000000','411600000000','411626','4116','淮阳县','','','淮阳县','3','河南省','周口市','淮阳县','河南省周口市淮阳县',null,null,33.7315000,114.8861400),\n(422107,'411627000000','411600000000','411627','4116','太康县','','','太康县','3','河南省','周口市','太康县','河南省周口市太康县',null,null,34.0637900,114.8377900),\n(422906,'411628000000','411600000000','411628','4116','鹿邑县','','','鹿邑县','3','河南省','周口市','鹿邑县','河南省周口市鹿邑县',null,null,33.8600900,115.4844300),\n(423487,'411671000000','411600000000','411671','4116','河南周口经济开发区','','','河南周口经济开发区','3','河南省','周口市','河南周口经济开发区','河南省周口市河南周口经济开发区',null,null,33.5866390,114.6775820),\n(423511,'411681000000','411600000000','411681','4116','项城市','','','项城市','3','河南省','周口市','项城市','河南省周口市项城市',null,null,33.4672300,114.8756200),\n(424034,'411700000000','410000000000','4117','41','驻马店市','','驻马店市','','2','河南省','驻马店市','','河南省驻马店市',null,null,32.9731900,113.9938200),\n(424035,'411701000000','411700000000','411701','4117','市辖区','','','市辖区','3','河南省','驻马店市','市辖区','河南省驻马店市市辖区',null,null,32.9731900,113.9938200),\n(424036,'411702000000','411700000000','411702','4117','驿城区','','','驿城区','3','河南省','驻马店市','驿城区','河南省驻马店市驿城区',null,null,32.9731900,113.9938200),\n(424263,'411721000000','411700000000','411721','4117','西平县','','','西平县','3','河南省','驻马店市','西平县','河南省驻马店市西平县',null,null,33.3878000,114.0215800),\n(424570,'411722000000','411700000000','411722','4117','上蔡县','','','上蔡县','3','河南省','驻马店市','上蔡县','河南省驻马店市上蔡县',null,null,33.2625500,114.2643500),\n(425057,'411723000000','411700000000','411723','4117','平舆县','','','平舆县','3','河南省','驻马店市','平舆县','河南省驻马店市平舆县',null,null,32.9625700,114.6191200),\n(425301,'411724000000','411700000000','411724','4117','正阳县','','','正阳县','3','河南省','驻马店市','正阳县','河南省驻马店市正阳县',null,null,32.6056600,114.3927400),\n(425617,'411725000000','411700000000','411725','4117','确山县','','','确山县','3','河南省','驻马店市','确山县','河南省驻马店市确山县',null,null,32.8020700,114.0264800),\n(425833,'411726000000','411700000000','411726','4117','泌阳县','','','泌阳县','3','河南省','驻马店市','泌阳县','河南省驻马店市泌阳县',null,null,32.7241000,113.3270900),\n(426214,'411727000000','411700000000','411727','4117','汝南县','','','汝南县','3','河南省','驻马店市','汝南县','河南省驻马店市汝南县',null,null,33.0068500,114.3622900),\n(426514,'411728000000','411700000000','411728','4117','遂平县','','','遂平县','3','河南省','驻马店市','遂平县','河南省驻马店市遂平县',null,null,33.1457600,114.0131900),\n(426734,'411729000000','411700000000','411729','4117','新蔡县','','','新蔡县','3','河南省','驻马店市','新蔡县','河南省驻马店市新蔡县',null,null,32.7492600,114.9857100),\n(427118,'411771000000','411700000000','411771','4117','河南驻马店经济开发区','','','河南驻马店经济开发区','3','河南省','驻马店市','河南驻马店经济开发区','河南省驻马店市河南驻马店经济开发区',null,null,33.0621760,114.0090180),\n(427149,'419000000000','410000000000','4190','41','省直辖县级行政区划','','省直辖县级行政区划','','2','河南省','省直辖县级行政区划','','河南省省直辖县级行政区划',null,null,null,null),\n(427150,'419001000000','419000000000','419001','4190','济源市','','','济源市','3','河南省','省直辖县级行政区划','济源市','河南省省直辖县级行政区划济源市',null,null,35.0861210,112.6059800),\n(427715,'420000000000','0','42','0','湖北省','湖北省','','','1','湖北省','','','湖北省',null,null,null,null),\n(427716,'420100000000','420000000000','4201','42','武汉市','','武汉市','','2','湖北省','武汉市','','湖北省武汉市',null,null,30.5820300,114.0291900),\n(427717,'420101000000','420100000000','420101','4201','市辖区','','','市辖区','3','湖北省','武汉市','市辖区','湖北省武汉市市辖区',null,null,30.5820300,114.0291900),\n(427718,'420102000000','420100000000','420102','4201','江岸区','','','江岸区','3','湖北省','武汉市','江岸区','湖北省武汉市江岸区',null,null,30.5998200,114.3096000),\n(427891,'420103000000','420100000000','420103','4201','江汉区','','','江汉区','3','湖北省','武汉市','江汉区','湖北省武汉市江汉区',null,null,30.6014700,114.2709600),\n(428017,'420104000000','420100000000','420104','4201','硚口区','','','硚口区','3','湖北省','武汉市','硚口区','湖北省武汉市硚口区',null,null,30.5814500,114.2149800),\n(428165,'420105000000','420100000000','420105','4201','汉阳区','','','汉阳区','3','湖北省','武汉市','汉阳区','湖北省武汉市汉阳区',null,null,30.5547300,114.2177200),\n(428295,'420106000000','420100000000','420106','4201','武昌区','','','武昌区','3','湖北省','武汉市','武昌区','湖北省武汉市武昌区',null,null,30.4998400,114.3425300),\n(428454,'420107000000','420100000000','420107','4201','青山区','','','青山区','3','湖北省','武汉市','青山区','湖北省武汉市青山区',null,null,30.6403900,114.3841500),\n(428572,'420111000000','420100000000','420111','4201','洪山区','','','洪山区','3','湖北省','武汉市','洪山区','湖北省武汉市洪山区',null,null,30.4998400,114.3425300),\n(428881,'420112000000','420100000000','420112','4201','东西湖区','','','东西湖区','3','湖北省','武汉市','东西湖区','湖北省武汉市东西湖区',null,null,30.6199600,114.1370200),\n(429048,'420113000000','420100000000','420113','4201','汉南区','','','汉南区','3','湖北省','武汉市','汉南区','湖北省武汉市汉南区',null,null,30.3089500,114.0846900),\n(429119,'420114000000','420100000000','420114','4201','蔡甸区','','','蔡甸区','3','湖北省','武汉市','蔡甸区','湖北省武汉市蔡甸区',null,null,30.5820300,114.0291900),\n(429535,'420115000000','420100000000','420115','4201','江夏区','','','江夏区','3','湖北省','武汉市','江夏区','湖北省武汉市江夏区',null,null,30.3755900,114.3216800),\n(429980,'420116000000','420100000000','420116','4201','黄陂区','','','黄陂区','3','湖北省','武汉市','黄陂区','湖北省武汉市黄陂区',null,null,30.8813100,114.3750900),\n(430680,'420117000000','420100000000','420117','4201','新洲区','','','新洲区','3','湖北省','武汉市','新洲区','湖北省武汉市新洲区',null,null,30.8415400,114.8011400),\n(431354,'420200000000','420000000000','4202','42','黄石市','','黄石市','','2','湖北省','黄石市','','湖北省黄石市',null,null,30.2228600,115.0661100),\n(431355,'420201000000','420200000000','420201','4202','市辖区','','','市辖区','3','湖北省','黄石市','市辖区','湖北省黄石市市辖区',null,null,30.2228600,115.0661100),\n(431356,'420202000000','420200000000','420202','4202','黄石港区','','','黄石港区','3','湖北省','黄石市','黄石港区','湖北省黄石市黄石港区',null,null,30.2228600,115.0661100),\n(431394,'420203000000','420200000000','420203','4202','西塞山区','','','西塞山区','3','湖北省','黄石市','西塞山区','湖北省黄石市西塞山区',null,null,30.2048900,115.1101900),\n(431436,'420204000000','420200000000','420204','4202','下陆区','','','下陆区','3','湖北省','黄石市','下陆区','湖北省黄石市下陆区',null,null,30.1738400,114.9611800),\n(431479,'420205000000','420200000000','420205','4202','铁山区','','','铁山区','3','湖北省','黄石市','铁山区','湖北省黄石市铁山区',null,null,30.2066600,114.9014300),\n(431495,'420222000000','420200000000','420222','4202','阳新县','','','阳新县','3','湖北省','黄石市','阳新县','湖北省黄石市阳新县',null,null,29.8303900,115.2153000),\n(431976,'420281000000','420200000000','420281','4202','大冶市','','','大冶市','3','湖北省','黄石市','大冶市','湖北省黄石市大冶市',null,null,30.0955100,114.9797700),\n(432416,'420300000000','420000000000','4203','42','十堰市','','十堰市','','2','湖北省','十堰市','','湖北省十堰市',null,null,32.5917500,110.8128500),\n(432417,'420301000000','420300000000','420301','4203','市辖区','','','市辖区','3','湖北省','十堰市','市辖区','湖北省十堰市市辖区',null,null,32.5917500,110.8128500),\n(432418,'420302000000','420300000000','420302','4203','茅箭区','','','茅箭区','3','湖北省','十堰市','茅箭区','湖北省十堰市茅箭区',null,null,32.5917500,110.8128500),\n(432500,'420303000000','420300000000','420303','4203','张湾区','','','张湾区','3','湖北省','十堰市','张湾区','湖北省十堰市张湾区',null,null,32.6519200,110.7691600),\n(432617,'420304000000','420300000000','420304','4203','郧阳区','','','郧阳区','3','湖北省','十堰市','郧阳区','湖北省十堰市郧阳区',null,null,32.8348800,110.8119700),\n(432986,'420322000000','420300000000','420322','4203','郧西县','','','郧西县','3','湖北省','十堰市','郧西县','湖北省十堰市郧西县',null,null,32.9930600,110.4258800),\n(433348,'420323000000','420300000000','420323','4203','竹山县','','','竹山县','3','湖北省','十堰市','竹山县','湖北省十堰市竹山县',null,null,32.2246800,110.2287900),\n(433616,'420324000000','420300000000','420324','4203','竹溪县','','','竹溪县','3','湖北省','十堰市','竹溪县','湖北省十堰市竹溪县',null,null,32.3182400,109.7152700),\n(433993,'420325000000','420300000000','420325','4203','房县','','','房县','3','湖北省','十堰市','房县','湖北省十堰市房县',null,null,32.0555200,110.7411600),\n(434319,'420381000000','420300000000','420381','4203','丹江口市','','','丹江口市','3','湖北省','十堰市','丹江口市','湖北省十堰市丹江口市',null,null,32.5404000,111.5132200),\n(434610,'420500000000','420000000000','4205','42','宜昌市','','宜昌市','','2','湖北省','宜昌市','','湖北省宜昌市',null,null,30.5307000,111.4347100),\n(434611,'420501000000','420500000000','420501','4205','市辖区','','','市辖区','3','湖北省','宜昌市','市辖区','湖北省宜昌市市辖区',null,null,30.5307000,111.4347100),\n(434612,'420502000000','420500000000','420502','4205','西陵区','','','西陵区','3','湖北省','宜昌市','西陵区','湖北省宜昌市西陵区',null,null,30.7108200,111.2858100),\n(434728,'420503000000','420500000000','420503','4205','伍家岗区','','','伍家岗区','3','湖北省','宜昌市','伍家岗区','湖北省宜昌市伍家岗区',null,null,30.6444100,111.3610000),\n(434795,'420504000000','420500000000','420504','4205','点军区','','','点军区','3','湖北省','宜昌市','点军区','湖北省宜昌市点军区',null,null,30.6932200,111.2682400),\n(434854,'420505000000','420500000000','420505','4205','猇亭区','','','猇亭区','3','湖北省','宜昌市','猇亭区','湖北省宜昌市猇亭区',null,null,30.5307000,111.4347100),\n(434884,'420506000000','420500000000','420506','4205','夷陵区','','','夷陵区','3','湖北省','宜昌市','夷陵区','湖北省宜昌市夷陵区',null,null,30.7699000,111.3248800),\n(435096,'420525000000','420500000000','420525','4205','远安县','','','远安县','3','湖北省','宜昌市','远安县','湖北省宜昌市远安县',null,null,31.0614400,111.6398500),\n(435221,'420526000000','420500000000','420526','4205','兴山县','','','兴山县','3','湖北省','宜昌市','兴山县','湖北省宜昌市兴山县',null,null,31.3481300,110.7471900),\n(435326,'420527000000','420500000000','420527','4205','秭归县','','','秭归县','3','湖北省','宜昌市','秭归县','湖北省宜昌市秭归县',null,null,30.8257800,110.9776800),\n(435533,'420528000000','420500000000','420528','4205','长阳土家族自治县','','','长阳土家族自治县','3','湖北省','宜昌市','长阳土家族自治县','湖北省宜昌市长阳土家族自治县',null,null,30.4725000,111.2070500),\n(435710,'420529000000','420500000000','420529','4205','五峰土家族自治县','','','五峰土家族自治县','3','湖北省','宜昌市','五峰土家族自治县','湖北省宜昌市五峰土家族自治县',null,null,30.1998300,110.6745200),\n(435827,'420581000000','420500000000','420581','4205','宜都市','','','宜都市','3','湖北省','宜昌市','宜都市','湖北省宜昌市宜都市',null,null,30.3784600,111.4501000),\n(435994,'420582000000','420500000000','420582','4205','当阳市','','','当阳市','3','湖北省','宜昌市','当阳市','湖北省宜昌市当阳市',null,null,30.8211800,111.7883300),\n(436178,'420583000000','420500000000','420583','4205','枝江市','','','枝江市','3','湖北省','宜昌市','枝江市','湖北省宜昌市枝江市',null,null,30.4258300,111.7604400),\n(436406,'420600000000','420000000000','4206','42','襄阳市','','襄阳市','','2','湖北省','襄阳市','','湖北省襄阳市',null,null,32.0448700,112.1355500),\n(436407,'420601000000','420600000000','420601','4206','市辖区','','','市辖区','3','湖北省','襄阳市','市辖区','湖北省襄阳市市辖区',null,null,32.0448700,112.1355500),\n(436408,'420602000000','420600000000','420602','4206','襄城区','','','襄城区','3','湖北省','襄阳市','襄城区','湖北省襄阳市襄城区',null,null,32.0106700,112.1342300),\n(436592,'420606000000','420600000000','420606','4206','樊城区','','','樊城区','3','湖北省','襄阳市','樊城区','湖北省襄阳市樊城区',null,null,32.0448700,112.1355500),\n(436816,'420607000000','420600000000','420607','4206','襄州区','','','襄州区','3','湖北省','襄阳市','襄州区','湖北省襄阳市襄州区',null,null,32.0871800,112.2119400),\n(437311,'420624000000','420600000000','420624','4206','南漳县','','','南漳县','3','湖北省','襄阳市','南漳县','湖北省襄阳市南漳县',null,null,31.7747100,111.8390200),\n(437634,'420625000000','420600000000','420625','4206','谷城县','','','谷城县','3','湖北省','襄阳市','谷城县','湖北省襄阳市谷城县',null,null,32.2633800,111.6530400),\n(437936,'420626000000','420600000000','420626','4206','保康县','','','保康县','3','湖北省','襄阳市','保康县','湖北省襄阳市保康县',null,null,31.8775300,111.2611700),\n(438212,'420682000000','420600000000','420682','4206','老河口市','','','老河口市','3','湖北省','襄阳市','老河口市','湖北省襄阳市老河口市',null,null,32.3867100,111.6750700),\n(438486,'420683000000','420600000000','420683','4206','枣阳市','','','枣阳市','3','湖北省','襄阳市','枣阳市','湖北省襄阳市枣阳市',null,null,32.1283600,112.7739800),\n(439077,'420684000000','420600000000','420684','4206','宜城市','','','宜城市','3','湖北省','襄阳市','宜城市','湖北省襄阳市宜城市',null,null,31.7197600,112.2577600),\n(439326,'420700000000','420000000000','4207','42','鄂州市','','鄂州市','','2','湖北省','鄂州市','','湖北省鄂州市',null,null,30.4005700,114.8917100),\n(439327,'420701000000','420700000000','420701','4207','市辖区','','','市辖区','3','湖北省','鄂州市','市辖区','湖北省鄂州市市辖区',null,null,30.4005700,114.8917100),\n(439328,'420702000000','420700000000','420702','4207','梁子湖区','','','梁子湖区','3','湖北省','鄂州市','梁子湖区','湖北省鄂州市梁子湖区',null,null,30.0999600,114.6845600),\n(439421,'420703000000','420700000000','420703','4207','华容区','','','华容区','3','湖北省','鄂州市','华容区','湖北省鄂州市华容区',null,null,30.5343400,114.7298300),\n(439544,'420704000000','420700000000','420704','4207','鄂城区','','','鄂城区','3','湖北省','鄂州市','鄂城区','湖北省鄂州市鄂城区',null,null,30.4005700,114.8917100),\n(439740,'420800000000','420000000000','4208','42','荆门市','','荆门市','','2','湖北省','荆门市','','湖北省荆门市',null,null,31.0519300,112.2015800),\n(439741,'420801000000','420800000000','420801','4208','市辖区','','','市辖区','3','湖北省','荆门市','市辖区','湖北省荆门市市辖区',null,null,31.0519300,112.2015800),\n(439742,'420802000000','420800000000','420802','4208','东宝区','','','东宝区','3','湖北省','荆门市','东宝区','湖北省荆门市东宝区',null,null,31.0519300,112.2015800),\n(439963,'420804000000','420800000000','420804','4208','掇刀区','','','掇刀区','3','湖北省','荆门市','掇刀区','湖北省荆门市掇刀区',null,null,30.9730300,112.2071500),\n(440093,'420821000000','420800000000','420821','4208','京山县','','','京山县','3','湖北省','荆门市','京山县','湖北省荆门市京山县',null,null,31.0184800,113.1195300),\n(440545,'420822000000','420800000000','420822','4208','沙洋县','','','沙洋县','3','湖北省','荆门市','沙洋县','湖北省荆门市沙洋县',null,null,30.7091800,112.5885400),\n(440855,'420881000000','420800000000','420881','4208','钟祥市','','','钟祥市','3','湖北省','荆门市','钟祥市','湖北省荆门市钟祥市',null,null,31.1679700,112.5881700),\n(441459,'420900000000','420000000000','4209','42','孝感市','','孝感市','','2','湖北省','孝感市','','湖北省孝感市',null,null,30.9167700,113.9104900),\n(441460,'420901000000','420900000000','420901','4209','市辖区','','','市辖区','3','湖北省','孝感市','市辖区','湖北省孝感市市辖区',null,null,30.9167700,113.9104900),\n(441461,'420902000000','420900000000','420902','4209','孝南区','','','孝南区','3','湖北省','孝感市','孝南区','湖北省孝感市孝南区',null,null,30.9167700,113.9104900),\n(442002,'420921000000','420900000000','420921','4209','孝昌县','','','孝昌县','3','湖北省','孝感市','孝昌县','湖北省孝感市孝昌县',null,null,31.2580300,113.9980200),\n(442474,'420922000000','420900000000','420922','4209','大悟县','','','大悟县','3','湖北省','孝感市','大悟县','湖北省孝感市大悟县',null,null,31.5609600,114.1269400),\n(442867,'420923000000','420900000000','420923','4209','云梦县','','','云梦县','3','湖北省','孝感市','云梦县','湖北省孝感市云梦县',null,null,31.0210300,113.7533100),\n(443178,'420981000000','420900000000','420981','4209','应城市','','','应城市','3','湖北省','孝感市','应城市','湖北省孝感市应城市',null,null,30.9283800,113.5729200),\n(443617,'420982000000','420900000000','420982','4209','安陆市','','','安陆市','3','湖北省','孝感市','安陆市','湖北省孝感市安陆市',null,null,31.2555400,113.6891300),\n(444030,'420984000000','420900000000','420984','4209','汉川市','','','汉川市','3','湖北省','孝感市','汉川市','湖北省孝感市汉川市',null,null,30.6612200,113.8390700),\n(444691,'421000000000','420000000000','4210','42','荆州市','','荆州市','','2','湖北省','荆州市','','湖北省荆州市',null,null,30.3526900,112.1901600),\n(444692,'421001000000','421000000000','421001','4210','市辖区','','','市辖区','3','湖北省','荆州市','市辖区','湖北省荆州市市辖区',null,null,30.3526900,112.1901600),\n(444693,'421002000000','421000000000','421002','4210','沙市区','','','沙市区','3','湖北省','荆州市','沙市区','湖北省荆州市沙市区',null,null,30.3109800,112.2549400),\n(444821,'421003000000','421000000000','421003','4210','荆州区','','','荆州区','3','湖北省','荆州市','荆州区','湖北省荆州市荆州区',null,null,30.3526900,112.1901600),\n(445015,'421022000000','421000000000','421022','4210','公安县','','','公安县','3','湖北省','荆州市','公安县','湖北省荆州市公安县',null,null,30.0583000,112.2294800),\n(445424,'421023000000','421000000000','421023','4210','监利县','','','监利县','3','湖北省','荆州市','监利县','湖北省荆州市监利县',null,null,29.8392800,112.9049200),\n(446175,'421024000000','421000000000','421024','4210','江陵县','','','江陵县','3','湖北省','荆州市','江陵县','湖北省荆州市江陵县',null,null,30.0418400,112.4247000),\n(446403,'421071000000','421000000000','421071','4210','荆州经济技术开发区','','','荆州经济技术开发区','3','湖北省','荆州市','荆州经济技术开发区','湖北省荆州市荆州经济技术开发区',null,null,30.3551830,112.3385930),\n(446469,'421081000000','421000000000','421081','4210','石首市','','','石首市','3','湖北省','荆州市','石首市','湖北省荆州市石首市',null,null,29.7208500,112.4255000),\n(446689,'421083000000','421000000000','421083','4210','洪湖市','','','洪湖市','3','湖北省','荆州市','洪湖市','湖北省荆州市洪湖市',null,null,29.8275600,113.4777500),\n(447188,'421087000000','421000000000','421087','4210','松滋市','','','松滋市','3','湖北省','荆州市','松滋市','湖北省荆州市松滋市',null,null,30.1696000,111.7674300),\n(447483,'421100000000','420000000000','4211','42','黄冈市','','黄冈市','','2','湖北省','黄冈市','','湖北省黄冈市',null,null,30.4347200,114.8800500),\n(447484,'421101000000','421100000000','421101','4211','市辖区','','','市辖区','3','湖北省','黄冈市','市辖区','湖北省黄冈市市辖区',null,null,30.4347200,114.8800500),\n(447485,'421102000000','421100000000','421102','4211','黄州区','','','黄州区','3','湖北省','黄冈市','黄州区','湖北省黄冈市黄州区',null,null,30.4347200,114.8800500),\n(447641,'421121000000','421100000000','421121','4211','团风县','','','团风县','3','湖北省','黄冈市','团风县','湖北省黄冈市团风县',null,null,30.6436200,114.8723200),\n(447954,'421122000000','421100000000','421122','4211','红安县','','','红安县','3','湖北省','黄冈市','红安县','湖北省黄冈市红安县',null,null,31.2881000,114.6181300),\n(448394,'421123000000','421100000000','421123','4211','罗田县','','','罗田县','3','湖北省','黄冈市','罗田县','湖北省黄冈市罗田县',null,null,30.7839900,115.3992700),\n(448865,'421124000000','421100000000','421124','4211','英山县','','','英山县','3','湖北省','黄冈市','英山县','湖北省黄冈市英山县',null,null,30.7351800,115.6814300),\n(449199,'421125000000','421100000000','421125','4211','浠水县','','','浠水县','3','湖北省','黄冈市','浠水县','湖北省黄冈市浠水县',null,null,30.4518400,115.2655100),\n(449888,'421126000000','421100000000','421126','4211','蕲春县','','','蕲春县','3','湖北省','黄冈市','蕲春县','湖北省黄冈市蕲春县',null,null,30.2261700,115.4362100),\n(450489,'421127000000','421100000000','421127','4211','黄梅县','','','黄梅县','3','湖北省','黄冈市','黄梅县','湖北省黄冈市黄梅县',null,null,30.0703700,115.9443200),\n(451034,'421171000000','421100000000','421171','4211','龙感湖管理区','','','龙感湖管理区','3','湖北省','黄冈市','龙感湖管理区','湖北省黄冈市龙感湖管理区',null,null,29.8738100,116.0037770),\n(451105,'421181000000','421100000000','421181','4211','麻城市','','','麻城市','3','湖北省','黄冈市','麻城市','湖北省黄冈市麻城市',null,null,31.1733300,115.0086900),\n(451603,'421182000000','421100000000','421182','4211','武穴市','','','武穴市','3','湖北省','黄冈市','武穴市','湖北省黄冈市武穴市',null,null,29.8443300,115.5613000),\n(451959,'421200000000','420000000000','4212','42','咸宁市','','咸宁市','','2','湖北省','咸宁市','','湖北省咸宁市',null,null,29.8525100,114.2984000),\n(451960,'421201000000','421200000000','421201','4212','市辖区','','','市辖区','3','湖北省','咸宁市','市辖区','湖北省咸宁市市辖区',null,null,29.8525100,114.2984000),\n(451961,'421202000000','421200000000','421202','4212','咸安区','','','咸安区','3','湖北省','咸宁市','咸安区','湖北省咸宁市咸安区',null,null,29.8525100,114.2984000),\n(452173,'421221000000','421200000000','421221','4212','嘉鱼县','','','嘉鱼县','3','湖北省','咸宁市','嘉鱼县','湖北省咸宁市嘉鱼县',null,null,29.9705700,113.9393200),\n(452288,'421222000000','421200000000','421222','4212','通城县','','','通城县','3','湖北省','咸宁市','通城县','湖北省咸宁市通城县',null,null,29.2453500,113.8170200),\n(452494,'421223000000','421200000000','421223','4212','崇阳县','','','崇阳县','3','湖北省','咸宁市','崇阳县','湖北省咸宁市崇阳县',null,null,29.5553700,114.0389200),\n(452711,'421224000000','421200000000','421224','4212','通山县','','','通山县','3','湖北省','咸宁市','通山县','湖北省咸宁市通山县',null,null,29.6063800,114.4827600),\n(452932,'421281000000','421200000000','421281','4212','赤壁市','','','赤壁市','3','湖北省','咸宁市','赤壁市','湖北省咸宁市赤壁市',null,null,29.7247600,113.9005400),\n(453137,'421300000000','420000000000','4213','42','随州市','','随州市','','2','湖北省','随州市','','湖北省随州市',null,null,31.7161500,113.3712000),\n(453138,'421301000000','421300000000','421301','4213','市辖区','','','市辖区','3','湖北省','随州市','市辖区','湖北省随州市市辖区',null,null,31.7161500,113.3712000),\n(453139,'421303000000','421300000000','421303','4213','曾都区','','','曾都区','3','湖北省','随州市','曾都区','湖北省随州市曾都区',null,null,31.7161500,113.3712000),\n(453358,'421321000000','421300000000','421321','4213','随县','','','随县','3','湖北省','随州市','随县','湖北省随州市随县',null,null,31.8538000,113.2999500),\n(453772,'421381000000','421300000000','421381','4213','广水市','','','广水市','3','湖北省','随州市','广水市','湖北省随州市广水市',null,null,31.6168600,113.8260000),\n(454193,'422800000000','420000000000','4228','42','恩施土家族苗族自治州','','恩施土家族苗族自治州','','2','湖北省','恩施土家族苗族自治州','','湖北省恩施土家族苗族自治州',null,null,30.2721700,109.4881700),\n(454194,'422801000000','422800000000','422801','4228','恩施市','','','恩施市','3','湖北省','恩施土家族苗族自治州','恩施市','湖北省恩施土家族苗族自治州恩施市',null,null,30.2950400,109.4791800),\n(454420,'422802000000','422800000000','422802','4228','利川市','','','利川市','3','湖北省','恩施土家族苗族自治州','利川市','湖北省恩施土家族苗族自治州利川市',null,null,30.2912100,108.9359500),\n(455024,'422822000000','422800000000','422822','4228','建始县','','','建始县','3','湖北省','恩施土家族苗族自治州','建始县','湖北省恩施土家族苗族自治州建始县',null,null,30.6021300,109.7221300),\n(455445,'422823000000','422800000000','422823','4228','巴东县','','','巴东县','3','湖北省','恩施土家族苗族自治州','巴东县','湖北省恩施土家族苗族自治州巴东县',null,null,31.0423300,110.3407500),\n(455780,'422825000000','422800000000','422825','4228','宣恩县','','','宣恩县','3','湖北省','恩施土家族苗族自治州','宣恩县','湖北省恩施土家族苗族自治州宣恩县',null,null,29.9871500,109.4918500),\n(456074,'422826000000','422800000000','422826','4228','咸丰县','','','咸丰县','3','湖北省','恩施土家族苗族自治州','咸丰县','湖北省恩施土家族苗族自治州咸丰县',null,null,29.6652100,109.1396300),\n(456355,'422827000000','422800000000','422827','4228','来凤县','','','来凤县','3','湖北省','恩施土家族苗族自治州','来凤县','湖北省恩施土家族苗族自治州来凤县',null,null,29.4939100,109.4070000),\n(456560,'422828000000','422800000000','422828','4228','鹤峰县','','','鹤峰县','3','湖北省','恩施土家族苗族自治州','鹤峰县','湖北省恩施土家族苗族自治州鹤峰县',null,null,29.8908400,110.0349800),\n(456789,'429000000000','420000000000','4290','42','省直辖县级行政区划','','省直辖县级行政区划','','2','湖北省','省直辖县级行政区划','','湖北省省直辖县级行政区划',null,null,null,null),\n(456790,'429004000000','429000000000','429004','4290','仙桃市','','','仙桃市','3','湖北省','省直辖县级行政区划','仙桃市','湖北省省直辖县级行政区划仙桃市',null,null,30.3720610,113.4472730),\n(457577,'429005000000','429000000000','429005','4290','潜江市','','','潜江市','3','湖北省','省直辖县级行政区划','潜江市','湖北省省直辖县级行政区划潜江市',null,null,30.4138200,112.9062190),\n(458076,'429006000000','429000000000','429006','4290','天门市','','','天门市','3','湖北省','省直辖县级行政区划','天门市','湖北省省直辖县级行政区划天门市',null,null,30.6151070,112.8120120),\n(458960,'429021000000','429000000000','429021','4290','神农架林区','','','神农架林区','3','湖北省','省直辖县级行政区划','神农架林区','湖北省省直辖县级行政区划神农架林区',null,null,31.7445200,110.6759800),\n(459049,'430000000000','0','43','0','湖南省','湖南省','','','1','湖南省','','','湖南省',null,null,null,null),\n(459050,'430100000000','430000000000','4301','43','长沙市','','长沙市','','2','湖南省','长沙市','','湖南省长沙市',null,null,28.2559100,112.9862600),\n(459051,'430101000000','430100000000','430101','4301','市辖区','','','市辖区','3','湖南省','长沙市','市辖区','湖南省长沙市市辖区',null,null,28.2559100,112.9862600),\n(459052,'430102000000','430100000000','430102','4301','芙蓉区','','','芙蓉区','3','湖南省','长沙市','芙蓉区','湖南省长沙市芙蓉区',null,null,28.2027900,113.0353900),\n(459139,'430103000000','430100000000','430103','4301','天心区','','','天心区','3','湖南省','长沙市','天心区','湖南省长沙市天心区',null,null,28.1141500,112.9897700),\n(459247,'430104000000','430100000000','430104','4301','岳麓区','','','岳麓区','3','湖南省','长沙市','岳麓区','湖南省长沙市岳麓区',null,null,28.2352900,112.9313400),\n(459436,'430105000000','430100000000','430105','4301','开福区','','','开福区','3','湖南省','长沙市','开福区','湖南省长沙市开福区',null,null,28.2559100,112.9862600),\n(459560,'430111000000','430100000000','430111','4301','雨花区','','','雨花区','3','湖南省','长沙市','雨花区','湖南省长沙市雨花区',null,null,28.1355100,113.0355500),\n(459726,'430112000000','430100000000','430112','4301','望城区','','','望城区','3','湖南省','长沙市','望城区','湖南省长沙市望城区',null,null,28.3612100,112.8179000),\n(459879,'430121000000','430100000000','430121','4301','长沙县','','','长沙县','3','湖南省','长沙市','长沙县','湖南省长沙市长沙县',null,null,28.2459500,113.0809300),\n(460095,'430181000000','430100000000','430181','4301','浏阳市','','','浏阳市','3','湖南省','长沙市','浏阳市','湖南省长沙市浏阳市',null,null,28.1637800,113.6431700),\n(460450,'430182000000','430100000000','430182','4301','宁乡市','','','宁乡市','3','湖南省','长沙市','宁乡市','湖南省长沙市宁乡市',null,null,28.2774100,112.5518300),\n(460758,'430200000000','430000000000','4302','43','株洲市','','株洲市','','2','湖南省','株洲市','','湖南省株洲市',null,null,27.8559500,113.1732900),\n(460759,'430201000000','430200000000','430201','4302','市辖区','','','市辖区','3','湖南省','株洲市','市辖区','湖南省株洲市市辖区',null,null,27.8559500,113.1732900),\n(460760,'430202000000','430200000000','430202','4302','荷塘区','','','荷塘区','3','湖南省','株洲市','荷塘区','湖南省株洲市荷塘区',null,null,27.8559500,113.1732900),\n(460825,'430203000000','430200000000','430203','4302','芦淞区','','','芦淞区','3','湖南省','株洲市','芦淞区','湖南省株洲市芦淞区',null,null,27.7849900,113.1523000),\n(460915,'430204000000','430200000000','430204','4302','石峰区','','','石峰区','3','湖南省','株洲市','石峰区','湖南省株洲市石峰区',null,null,27.8755800,113.1178400),\n(460966,'430211000000','430200000000','430211','4302','天元区','','','天元区','3','湖南省','株洲市','天元区','湖南省株洲市天元区',null,null,27.8268100,113.0823100),\n(461073,'430221000000','430200000000','430221','4302','株洲县','','','株洲县','3','湖南省','株洲市','株洲县','湖南省株洲市株洲县',null,null,27.6993800,113.1439800),\n(461221,'430223000000','430200000000','430223','4302','攸县','','','攸县','3','湖南省','株洲市','攸县','湖南省株洲市攸县',null,null,27.0002300,113.3456900),\n(461540,'430224000000','430200000000','430224','4302','茶陵县','','','茶陵县','3','湖南省','株洲市','茶陵县','湖南省株洲市茶陵县',null,null,26.7774500,113.5392700),\n(461805,'430225000000','430200000000','430225','4302','炎陵县','','','炎陵县','3','湖南省','株洲市','炎陵县','湖南省株洲市炎陵县',null,null,26.4897900,113.7725800),\n(461949,'430271000000','430200000000','430271','4302','云龙示范区','','','云龙示范区','3','湖南省','株洲市','云龙示范区','湖南省株洲市云龙示范区',null,null,27.8950290,113.1710430),\n(461975,'430281000000','430200000000','430281','4302','醴陵市','','','醴陵市','3','湖南省','株洲市','醴陵市','湖南省株洲市醴陵市',null,null,27.6461700,113.4970300),\n(462269,'430300000000','430000000000','4303','43','湘潭市','','湘潭市','','2','湖南省','湘潭市','','湖南省湘潭市',null,null,27.8563200,112.9073700),\n(462270,'430301000000','430300000000','430301','4303','市辖区','','','市辖区','3','湖南省','湘潭市','市辖区','湖南省湘潭市市辖区',null,null,27.8563200,112.9073700),\n(462271,'430302000000','430300000000','430302','4303','雨湖区','','','雨湖区','3','湖南省','湘潭市','雨湖区','湖南省湘潭市雨湖区',null,null,27.8563200,112.9073700),\n(462396,'430304000000','430300000000','430304','4303','岳塘区','','','岳塘区','3','湖南省','湘潭市','岳塘区','湖南省湘潭市岳塘区',null,null,27.8726600,112.9701900),\n(462467,'430321000000','430300000000','430321','4303','湘潭县','','','湘潭县','3','湖南省','湘潭市','湘潭县','湖南省湘潭市湘潭县',null,null,27.7790400,112.9509900),\n(462840,'430371000000','430300000000','430371','4303','湖南湘潭高新技术产业园区','','','湖南湘潭高新技术产业园区','3','湖南省','湘潭市','湖南湘潭高新技术产业园区','湖南省湘潭市湖南湘潭高新技术产业园区',null,null,27.8256400,112.9276120),\n(462861,'430372000000','430300000000','430372','4303','湘潭昭山示范区','','','湘潭昭山示范区','3','湖南省','湘潭市','湘潭昭山示范区','湖南省湘潭市湘潭昭山示范区',null,null,27.9406030,113.0196910),\n(462878,'430373000000','430300000000','430373','4303','湘潭九华示范区','','','湘潭九华示范区','3','湖南省','湘潭市','湘潭九华示范区','湖南省湘潭市湘潭九华示范区',null,null,27.9127500,112.9247280),\n(462906,'430381000000','430300000000','430381','4303','湘乡市','','','湘乡市','3','湖南省','湘潭市','湘乡市','湖南省湘潭市湘乡市',null,null,27.7341000,112.5350400),\n(463277,'430382000000','430300000000','430382','4303','韶山市','','','韶山市','3','湖南省','湘潭市','韶山市','湖南省湘潭市韶山市',null,null,27.9150700,112.5266000),\n(463320,'430400000000','430000000000','4304','43','衡阳市','','衡阳市','','2','湖南省','衡阳市','','湖南省衡阳市',null,null,27.2325800,112.7387600),\n(463321,'430401000000','430400000000','430401','4304','市辖区','','','市辖区','3','湖南省','衡阳市','市辖区','湖南省衡阳市市辖区',null,null,27.2325800,112.7387600),\n(463322,'430405000000','430400000000','430405','4304','珠晖区','','','珠晖区','3','湖南省','衡阳市','珠晖区','湖南省衡阳市珠晖区',null,null,26.8945600,112.6203900),\n(463408,'430406000000','430400000000','430406','4304','雁峰区','','','雁峰区','3','湖南省','衡阳市','雁峰区','湖南省衡阳市雁峰区',null,null,26.8886400,112.6166900),\n(463466,'430407000000','430400000000','430407','4304','石鼓区','','','石鼓区','3','湖南省','衡阳市','石鼓区','湖南省衡阳市石鼓区',null,null,26.9434300,112.5979800),\n(463519,'430408000000','430400000000','430408','4304','蒸湘区','','','蒸湘区','3','湖南省','衡阳市','蒸湘区','湖南省衡阳市蒸湘区',null,null,26.9125900,112.5675500),\n(463575,'430412000000','430400000000','430412','4304','南岳区','','','南岳区','3','湖南省','衡阳市','南岳区','湖南省衡阳市南岳区',null,null,27.2325800,112.7387600),\n(463604,'430421000000','430400000000','430421','4304','衡阳县','','','衡阳县','3','湖南省','衡阳市','衡阳县','湖南省衡阳市衡阳县',null,null,26.9697700,112.3706600),\n(464121,'430422000000','430400000000','430422','4304','衡南县','','','衡南县','3','湖南省','衡阳市','衡南县','湖南省衡阳市衡南县',null,null,26.7383100,112.6779200),\n(464593,'430423000000','430400000000','430423','4304','衡山县','','','衡山县','3','湖南省','衡阳市','衡山县','湖南省衡阳市衡山县',null,null,27.2302200,112.8683100),\n(464759,'430424000000','430400000000','430424','4304','衡东县','','','衡东县','3','湖南省','衡阳市','衡东县','湖南省衡阳市衡东县',null,null,27.0811600,112.9532500),\n(465035,'430426000000','430400000000','430426','4304','祁东县','','','祁东县','3','湖南省','衡阳市','祁东县','湖南省衡阳市祁东县',null,null,26.7996500,112.0904300),\n(465427,'430471000000','430400000000','430471','4304','衡阳综合保税区','','','衡阳综合保税区','3','湖南省','衡阳市','衡阳综合保税区','湖南省衡阳市衡阳综合保税区',null,null,26.8267900,112.6063230),\n(465432,'430472000000','430400000000','430472','4304','湖南衡阳高新技术产业园区','','','湖南衡阳高新技术产业园区','3','湖南省','衡阳市','湖南衡阳高新技术产业园区','湖南省衡阳市湖南衡阳高新技术产业园区',null,null,26.8886300,112.5658490),\n(465450,'430473000000','430400000000','430473','4304','湖南衡阳松木经济开发区','','','湖南衡阳松木经济开发区','3','湖南省','衡阳市','湖南衡阳松木经济开发区','湖南省衡阳市湖南衡阳松木经济开发区',null,null,26.9656390,112.6232380),\n(465459,'430481000000','430400000000','430481','4304','耒阳市','','','耒阳市','3','湖南省','衡阳市','耒阳市','湖南省衡阳市耒阳市',null,null,26.4224300,112.8598800),\n(465868,'430482000000','430400000000','430482','4304','常宁市','','','常宁市','3','湖南省','衡阳市','常宁市','湖南省衡阳市常宁市',null,null,26.4209300,112.3999200),\n(466299,'430500000000','430000000000','4305','43','邵阳市','','邵阳市','','2','湖南省','邵阳市','','湖南省邵阳市',null,null,27.2456600,111.4520700),\n(466300,'430501000000','430500000000','430501','4305','市辖区','','','市辖区','3','湖南省','邵阳市','市辖区','湖南省邵阳市市辖区',null,null,27.2456600,111.4520700),\n(466301,'430502000000','430500000000','430502','4305','双清区','','','双清区','3','湖南省','邵阳市','双清区','湖南省邵阳市双清区',null,null,27.2328500,111.4967400),\n(466405,'430503000000','430500000000','430503','4305','大祥区','','','大祥区','3','湖南省','邵阳市','大祥区','湖南省邵阳市大祥区',null,null,27.2213000,111.4388800),\n(466518,'430511000000','430500000000','430511','4305','北塔区','','','北塔区','3','湖南省','邵阳市','北塔区','湖南省邵阳市北塔区',null,null,27.2456600,111.4520700),\n(466565,'430521000000','430500000000','430521','4305','邵东县','','','邵东县','3','湖南省','邵阳市','邵东县','湖南省邵阳市邵东县',null,null,27.2584400,111.7444600),\n(467174,'430522000000','430500000000','430522','4305','新邵县','','','新邵县','3','湖南省','邵阳市','新邵县','湖南省邵阳市新邵县',null,null,27.3209100,111.4590000),\n(467607,'430523000000','430500000000','430523','4305','邵阳县','','','邵阳县','3','湖南省','邵阳市','邵阳县','湖南省邵阳市邵阳县',null,null,26.9907800,111.2738200),\n(468064,'430524000000','430500000000','430524','4305','隆回县','','','隆回县','3','湖南省','邵阳市','隆回县','湖南省邵阳市隆回县',null,null,27.1140200,111.0324900),\n(468661,'430525000000','430500000000','430525','4305','洞口县','','','洞口县','3','湖南省','邵阳市','洞口县','湖南省邵阳市洞口县',null,null,27.0603800,110.5758300),\n(469048,'430527000000','430500000000','430527','4305','绥宁县','','','绥宁县','3','湖南省','邵阳市','绥宁县','湖南省邵阳市绥宁县',null,null,26.5820100,110.1556800),\n(469308,'430528000000','430500000000','430528','4305','新宁县','','','新宁县','3','湖南省','邵阳市','新宁县','湖南省邵阳市新宁县',null,null,26.4334600,110.8567400),\n(469651,'430529000000','430500000000','430529','4305','城步苗族自治县','','','城步苗族自治县','3','湖南省','邵阳市','城步苗族自治县','湖南省邵阳市城步苗族自治县',null,null,26.3915600,110.3228500),\n(469858,'430581000000','430500000000','430581','4305','武冈市','','','武冈市','3','湖南省','邵阳市','武冈市','湖南省邵阳市武冈市',null,null,26.7265900,110.6313800),\n(470192,'430600000000','430000000000','4306','43','岳阳市','','岳阳市','','2','湖南省','岳阳市','','湖南省岳阳市',null,null,29.4613500,113.0065100),\n(470193,'430601000000','430600000000','430601','4306','市辖区','','','市辖区','3','湖南省','岳阳市','市辖区','湖南省岳阳市市辖区',null,null,29.4613500,113.0065100),\n(470194,'430602000000','430600000000','430602','4306','岳阳楼区','','','岳阳楼区','3','湖南省','岳阳市','岳阳楼区','湖南省岳阳市岳阳楼区',null,null,29.3719700,113.1293100),\n(470392,'430603000000','430600000000','430603','4306','云溪区','','','云溪区','3','湖南省','岳阳市','云溪区','湖南省岳阳市云溪区',null,null,29.4735800,113.2723900),\n(470456,'430611000000','430600000000','430611','4306','君山区','','','君山区','3','湖南省','岳阳市','君山区','湖南省岳阳市君山区',null,null,29.4613500,113.0065100),\n(470549,'430621000000','430600000000','430621','4306','岳阳县','','','岳阳县','3','湖南省','岳阳市','岳阳县','湖南省岳阳市岳阳县',null,null,29.1441500,113.1163500),\n(470782,'430623000000','430600000000','430623','4306','华容县','','','华容县','3','湖南省','岳阳市','华容县','湖南省岳阳市华容县',null,null,29.5301500,112.5394600),\n(471021,'430624000000','430600000000','430624','4306','湘阴县','','','湘阴县','3','湖南省','岳阳市','湘阴县','湖南省岳阳市湘阴县',null,null,28.6892500,112.9091700),\n(471255,'430626000000','430600000000','430626','4306','平江县','','','平江县','3','湖南省','岳阳市','平江县','湖南省岳阳市平江县',null,null,28.7020300,113.5813400),\n(471822,'430671000000','430600000000','430671','4306','岳阳市屈原管理区','','','岳阳市屈原管理区','3','湖南省','岳阳市','岳阳市屈原管理区','湖南省岳阳市岳阳市屈原管理区',null,null,28.8599800,112.9260180),\n(471859,'430681000000','430600000000','430681','4306','汨罗市','','','汨罗市','3','湖南省','岳阳市','汨罗市','湖南省岳阳市汨罗市',null,null,28.8064200,113.0671100),\n(472071,'430682000000','430600000000','430682','4306','临湘市','','','临湘市','3','湖南省','岳阳市','临湘市','湖南省岳阳市临湘市',null,null,29.4768400,113.4505800),\n(472246,'430700000000','430000000000','4307','43','常德市','','常德市','','2','湖南省','常德市','','湖南省常德市',null,null,29.0187100,111.6807200),\n(472247,'430701000000','430700000000','430701','4307','市辖区','','','市辖区','3','湖南省','常德市','市辖区','湖南省常德市市辖区',null,null,29.0187100,111.6807200),\n(472248,'430702000000','430700000000','430702','4307','武陵区','','','武陵区','3','湖南省','常德市','武陵区','湖南省常德市武陵区',null,null,29.0539700,111.6839600),\n(472436,'430703000000','430700000000','430703','4307','鼎城区','','','鼎城区','3','湖南省','常德市','鼎城区','湖南省常德市鼎城区',null,null,29.0187100,111.6807200),\n(472795,'430721000000','430700000000','430721','4307','安乡县','','','安乡县','3','湖南省','常德市','安乡县','湖南省常德市安乡县',null,null,29.4114200,112.1709600),\n(472979,'430722000000','430700000000','430722','4307','汉寿县','','','汉寿县','3','湖南省','常德市','汉寿县','湖南省常德市汉寿县',null,null,28.9054900,111.9704300),\n(473308,'430723000000','430700000000','430723','4307','澧县','','','澧县','3','湖南省','常德市','澧县','湖南省常德市澧县',null,null,29.4409800,111.6473500),\n(473619,'430724000000','430700000000','430724','4307','临澧县','','','临澧县','3','湖南省','常德市','临澧县','湖南省常德市临澧县',null,null,29.4409800,111.6473500),\n(473790,'430725000000','430700000000','430725','4307','桃源县','','','桃源县','3','湖南省','常德市','桃源县','湖南省常德市桃源县',null,null,28.9025900,111.4889300),\n(474248,'430726000000','430700000000','430726','4307','石门县','','','石门县','3','湖南省','常德市','石门县','湖南省常德市石门县',null,null,29.5841300,111.3798200),\n(474607,'430771000000','430700000000','430771','4307','常德市西洞庭管理区','','','常德市西洞庭管理区','3','湖南省','常德市','常德市西洞庭管理区','湖南省常德市常德市西洞庭管理区',null,null,29.0369150,111.6891630),\n(474629,'430781000000','430700000000','430781','4307','津市市','','','津市市','3','湖南省','常德市','津市市','湖南省常德市津市市',null,null,29.6054300,111.8774100),\n(474718,'430800000000','430000000000','4308','43','张家界市','','张家界市','','2','湖南省','张家界市','','湖南省张家界市',null,null,29.3458900,110.5504200),\n(474719,'430801000000','430800000000','430801','4308','市辖区','','','市辖区','3','湖南省','张家界市','市辖区','湖南省张家界市市辖区',null,null,29.3458900,110.5504200),\n(474720,'430802000000','430800000000','430802','4308','永定区','','','永定区','3','湖南省','张家界市','永定区','湖南省张家界市永定区',null,null,29.1198300,110.5373700),\n(474997,'430811000000','430800000000','430811','4308','武陵源区','','','武陵源区','3','湖南省','张家界市','武陵源区','湖南省张家界市武陵源区',null,null,29.3458900,110.5504200),\n(475037,'430821000000','430800000000','430821','4308','慈利县','','','慈利县','3','湖南省','张家界市','慈利县','湖南省张家界市慈利县',null,null,29.4297000,111.1392100),\n(475493,'430822000000','430800000000','430822','4308','桑植县','','','桑植县','3','湖南省','张家界市','桑植县','湖南省张家界市桑植县',null,null,29.3997100,110.1642800),\n(475815,'430900000000','430000000000','4309','43','益阳市','','益阳市','','2','湖南省','益阳市','','湖南省益阳市',null,null,28.5793000,112.3740900),\n(475816,'430901000000','430900000000','430901','4309','市辖区','','','市辖区','3','湖南省','益阳市','市辖区','湖南省益阳市市辖区',null,null,28.5793000,112.3740900),\n(475817,'430902000000','430900000000','430902','4309','资阳区','','','资阳区','3','湖南省','益阳市','资阳区','湖南省益阳市资阳区',null,null,28.5910000,112.3242600),\n(475945,'430903000000','430900000000','430903','4309','赫山区','','','赫山区','3','湖南省','益阳市','赫山区','湖南省益阳市赫山区',null,null,28.5793000,112.3740900),\n(476171,'430921000000','430900000000','430921','4309','南县','','','南县','3','湖南省','益阳市','南县','湖南省益阳市南县',null,null,29.3616200,112.3963600),\n(476348,'430922000000','430900000000','430922','4309','桃江县','','','桃江县','3','湖南省','益阳市','桃江县','湖南省益阳市桃江县',null,null,28.5181900,112.1557100),\n(476610,'430923000000','430900000000','430923','4309','安化县','','','安化县','3','湖南省','益阳市','安化县','湖南省益阳市安化县',null,null,28.3742800,111.2130300),\n(477067,'430971000000','430900000000','430971','4309','益阳市大通湖管理区','','','益阳市大通湖管理区','3','湖南省','益阳市','益阳市大通湖管理区','湖南省益阳市益阳市大通湖管理区',null,null,28.5793000,112.3740900),\n(477112,'430972000000','430900000000','430972','4309','湖南益阳高新技术产业园区','','','湖南益阳高新技术产业园区','3','湖南省','益阳市','湖南益阳高新技术产业园区','湖南省益阳市湖南益阳高新技术产业园区',null,null,28.8111710,112.3548810),\n(477132,'430981000000','430900000000','430981','4309','沅江市','','','沅江市','3','湖南省','益阳市','沅江市','湖南省益阳市沅江市',null,null,28.8440200,112.3546800),\n(477346,'431000000000','430000000000','4310','43','郴州市','','郴州市','','2','湖南省','郴州市','','湖南省郴州市',null,null,25.7839800,113.0110100),\n(477347,'431001000000','431000000000','431001','4310','市辖区','','','市辖区','3','湖南省','郴州市','市辖区','湖南省郴州市市辖区',null,null,25.7839800,113.0110100),\n(477348,'431002000000','431000000000','431002','4310','北湖区','','','北湖区','3','湖南省','郴州市','北湖区','湖南省郴州市北湖区',null,null,25.7839800,113.0110100),\n(477526,'431003000000','431000000000','431003','4310','苏仙区','','','苏仙区','3','湖南省','郴州市','苏仙区','湖南省郴州市苏仙区',null,null,25.8004000,113.0423600),\n(477726,'431021000000','431000000000','431021','4310','桂阳县','','','桂阳县','3','湖南省','郴州市','桂阳县','湖南省郴州市桂阳县',null,null,25.7541000,112.7336800),\n(478120,'431022000000','431000000000','431022','4310','宜章县','','','宜章县','3','湖南省','郴州市','宜章县','湖南省郴州市宜章县',null,null,25.3995700,112.9488700),\n(478404,'431023000000','431000000000','431023','4310','永兴县','','','永兴县','3','湖南省','郴州市','永兴县','湖南省郴州市永兴县',null,null,26.1272000,113.1165900),\n(478699,'431024000000','431000000000','431024','4310','嘉禾县','','','嘉禾县','3','湖南省','郴州市','嘉禾县','湖南省郴州市嘉禾县',null,null,25.5876700,112.3687200),\n(478911,'431025000000','431000000000','431025','4310','临武县','','','临武县','3','湖南省','郴州市','临武县','湖南省郴州市临武县',null,null,25.2759600,112.5629500),\n(479134,'431026000000','431000000000','431026','4310','汝城县','','','汝城县','3','湖南省','郴州市','汝城县','湖南省郴州市汝城县',null,null,25.5503600,113.6849300),\n(479400,'431027000000','431000000000','431027','4310','桂东县','','','桂东县','3','湖南省','郴州市','桂东县','湖南省郴州市桂东县',null,null,26.0775200,113.9445400),\n(479527,'431028000000','431000000000','431028','4310','安仁县','','','安仁县','3','湖南省','郴州市','安仁县','湖南省郴州市安仁县',null,null,26.7094200,113.2694800),\n(479703,'431081000000','431000000000','431081','4310','资兴市','','','资兴市','3','湖南省','郴州市','资兴市','湖南省郴州市资兴市',null,null,25.9761900,113.2360100),\n(479933,'431100000000','430000000000','4311','43','永州市','','永州市','','2','湖南省','永州市','','湖南省永州市',null,null,26.4609800,111.5924400),\n(479934,'431101000000','431100000000','431101','4311','市辖区','','','市辖区','3','湖南省','永州市','市辖区','湖南省永州市市辖区',null,null,26.4609800,111.5924400),\n(479935,'431102000000','431100000000','431102','4311','零陵区','','','零陵区','3','湖南省','永州市','零陵区','湖南省永州市零陵区',null,null,26.2225500,111.6311200),\n(480286,'431103000000','431100000000','431103','4311','冷水滩区','','','冷水滩区','3','湖南省','永州市','冷水滩区','湖南省永州市冷水滩区',null,null,26.4609800,111.5924400),\n(480508,'431121000000','431100000000','431121','4311','祁阳县','','','祁阳县','3','湖南省','永州市','祁阳县','湖南省永州市祁阳县',null,null,26.5801200,111.8401500),\n(481095,'431122000000','431100000000','431122','4311','东安县','','','东安县','3','湖南省','永州市','东安县','湖南省永州市东安县',null,null,26.3920600,111.3164400),\n(481457,'431123000000','431100000000','431123','4311','双牌县','','','双牌县','3','湖南省','永州市','双牌县','湖南省永州市双牌县',null,null,25.9621800,111.6603100),\n(481591,'431124000000','431100000000','431124','4311','道县','','','道县','3','湖南省','永州市','道县','湖南省永州市道县',null,null,25.5275300,111.6000700),\n(481985,'431125000000','431100000000','431125','4311','江永县','','','江永县','3','湖南省','永州市','江永县','湖南省永州市江永县',null,null,25.2735300,111.3438500),\n(482107,'431126000000','431100000000','431126','4311','宁远县','','','宁远县','3','湖南省','永州市','宁远县','湖南省永州市宁远县',null,null,25.5691900,111.9444500),\n(482550,'431127000000','431100000000','431127','4311','蓝山县','','','蓝山县','3','湖南省','永州市','蓝山县','湖南省永州市蓝山县',null,null,25.3694300,112.1967800),\n(482798,'431128000000','431100000000','431128','4311','新田县','','','新田县','3','湖南省','永州市','新田县','湖南省永州市新田县',null,null,25.9043000,112.2032900),\n(483043,'431129000000','431100000000','431129','4311','江华瑶族自治县','','','江华瑶族自治县','3','湖南省','永州市','江华瑶族自治县','湖南省永州市江华瑶族自治县',null,null,25.1853600,111.5795200),\n(483372,'431171000000','431100000000','431171','4311','永州经济技术开发区','','','永州经济技术开发区','3','湖南省','永州市','永州经济技术开发区','湖南省永州市永州经济技术开发区',null,null,26.3986130,111.6034240),\n(483391,'431172000000','431100000000','431172','4311','永州市金洞管理区','','','永州市金洞管理区','3','湖南省','永州市','永州市金洞管理区','湖南省永州市永州市金洞管理区',null,null,26.2934300,112.0910800),\n(483441,'431173000000','431100000000','431173','4311','永州市回龙圩管理区','','','永州市回龙圩管理区','3','湖南省','永州市','永州市回龙圩管理区','湖南省永州市永州市回龙圩管理区',null,null,25.1879900,111.3494570),\n(483454,'431200000000','430000000000','4312','43','怀化市','','怀化市','','2','湖南省','怀化市','','湖南省怀化市',null,null,27.5777100,110.0409800),\n(483455,'431201000000','431200000000','431201','4312','市辖区','','','市辖区','3','湖南省','怀化市','市辖区','湖南省怀化市市辖区',null,null,27.5777100,110.0409800),\n(483456,'431202000000','431200000000','431202','4312','鹤城区','','','鹤城区','3','湖南省','怀化市','鹤城区','湖南省怀化市鹤城区',null,null,27.5777100,110.0409800),\n(483594,'431221000000','431200000000','431221','4312','中方县','','','中方县','3','湖南省','怀化市','中方县','湖南省怀化市中方县',null,null,27.4399200,109.9450100),\n(483756,'431222000000','431200000000','431222','4312','沅陵县','','','沅陵县','3','湖南省','怀化市','沅陵县','湖南省怀化市沅陵县',null,null,28.4527700,110.3938800),\n(484181,'431223000000','431200000000','431223','4312','辰溪县','','','辰溪县','3','湖南省','怀化市','辰溪县','湖南省怀化市辰溪县',null,null,28.0065200,110.1836800),\n(484498,'431224000000','431200000000','431224','4312','溆浦县','','','溆浦县','3','湖南省','怀化市','溆浦县','湖南省怀化市溆浦县',null,null,27.9083400,110.5948600),\n(484940,'431225000000','431200000000','431225','4312','会同县','','','会同县','3','湖南省','怀化市','会同县','湖南省怀化市会同县',null,null,26.8871800,109.7357000),\n(485202,'431226000000','431200000000','431226','4312','麻阳苗族自治县','','','麻阳苗族自治县','3','湖南省','怀化市','麻阳苗族自治县','湖南省怀化市麻阳苗族自治县',null,null,27.8655500,109.8025600),\n(485442,'431227000000','431200000000','431227','4312','新晃侗族自治县','','','新晃侗族自治县','3','湖南省','怀化市','新晃侗族自治县','湖南省怀化市新晃侗族自治县',null,null,27.3526400,109.1749200),\n(485605,'431228000000','431200000000','431228','4312','芷江侗族自治县','','','芷江侗族自治县','3','湖南省','怀化市','芷江侗族自治县','湖南省怀化市芷江侗族自治县',null,null,27.4432800,109.6851900),\n(485842,'431229000000','431200000000','431229','4312','靖州苗族侗族自治县','','','靖州苗族侗族自治县','3','湖南省','怀化市','靖州苗族侗族自治县','湖南省怀化市靖州苗族侗族自治县',null,null,26.5751400,109.6962700),\n(485992,'431230000000','431200000000','431230','4312','通道侗族自治县','','','通道侗族自治县','3','湖南省','怀化市','通道侗族自治县','湖南省怀化市通道侗族自治县',null,null,26.1579400,109.7844900),\n(486170,'431271000000','431200000000','431271','4312','怀化市洪江管理区','','','怀化市洪江管理区','3','湖南省','怀化市','怀化市洪江管理区','湖南省怀化市怀化市洪江管理区',null,null,27.1096230,110.0030140),\n(486211,'431281000000','431200000000','431281','4312','洪江市','','','洪江市','3','湖南省','怀化市','洪江市','湖南省怀化市洪江市',null,null,27.2092500,109.8365500),\n(486450,'431300000000','430000000000','4313','43','娄底市','','娄底市','','2','湖南省','娄底市','','湖南省娄底市',null,null,27.7297800,112.0017000),\n(486451,'431301000000','431300000000','431301','4313','市辖区','','','市辖区','3','湖南省','娄底市','市辖区','湖南省娄底市市辖区',null,null,27.7297800,112.0017000),\n(486452,'431302000000','431300000000','431302','4313','娄星区','','','娄星区','3','湖南省','娄底市','娄星区','湖南省娄底市娄星区',null,null,27.7297800,112.0017000),\n(486697,'431321000000','431300000000','431321','4313','双峰县','','','双峰县','3','湖南省','娄底市','双峰县','湖南省娄底市双峰县',null,null,27.4570200,112.1939200),\n(487237,'431322000000','431300000000','431322','4313','新化县','','','新化县','3','湖南省','娄底市','新化县','湖南省娄底市新化县',null,null,27.7266300,111.3274300),\n(487954,'431381000000','431300000000','431381','4313','冷水江市','','','冷水江市','3','湖南省','娄底市','冷水江市','湖南省娄底市冷水江市',null,null,27.6861500,111.4352500),\n(488115,'431382000000','431300000000','431382','4313','涟源市','','','涟源市','3','湖南省','娄底市','涟源市','湖南省娄底市涟源市',null,null,27.6927100,111.6644600),\n(488639,'433100000000','430000000000','4331','43','湘西土家族苗族自治州','','湘西土家族苗族自治州','','2','湖南省','湘西土家族苗族自治州','','湖南省湘西土家族苗族自治州',null,null,28.3117300,109.7389300),\n(488640,'433101000000','433100000000','433101','4331','吉首市','','','吉首市','3','湖南省','湘西土家族苗族自治州','吉首市','湖南省湘西土家族苗族自治州吉首市',null,null,28.2624400,109.6981100),\n(488792,'433122000000','433100000000','433122','4331','泸溪县','','','泸溪县','3','湖南省','湘西土家族苗族自治州','泸溪县','湖南省湘西土家族苗族自治州泸溪县',null,null,28.2163900,110.2196500),\n(488953,'433123000000','433100000000','433123','4331','凤凰县','','','凤凰县','3','湖南省','湘西土家族苗族自治州','凤凰县','湖南省湘西土家族苗族自治州凤凰县',null,null,27.9484300,109.5983200),\n(489252,'433124000000','433100000000','433124','4331','花垣县','','','花垣县','3','湖南省','湘西土家族苗族自治州','花垣县','湖南省湘西土家族苗族自治州花垣县',null,null,28.5721100,109.4822400),\n(489506,'433125000000','433100000000','433125','4331','保靖县','','','保靖县','3','湖南省','湘西土家族苗族自治州','保靖县','湖南省湘西土家族苗族自治州保靖县',null,null,28.7000100,109.6605400),\n(489697,'433126000000','433100000000','433126','4331','古丈县','','','古丈县','3','湖南省','湘西土家族苗族自治州','古丈县','湖南省湘西土家族苗族自治州古丈县',null,null,28.6171100,109.9508500),\n(489826,'433127000000','433100000000','433127','4331','永顺县','','','永顺县','3','湖南省','湘西土家族苗族自治州','永顺县','湖南省湘西土家族苗族自治州永顺县',null,null,29.0051500,109.8480700),\n(490151,'433130000000','433100000000','433130','4331','龙山县','','','龙山县','3','湖南省','湘西土家族苗族自治州','龙山县','湖南省湘西土家族苗族自治州龙山县',null,null,29.4579000,109.4438700),\n(490570,'433172000000','433100000000','433172','4331','湖南吉首经济开发区','','','湖南吉首经济开发区','3','湖南省','湘西土家族苗族自治州','湖南吉首经济开发区','湖南省湘西土家族苗族自治州湖南吉首经济开发区',null,null,28.2608700,109.6972580),\n(490583,'433173000000','433100000000','433173','4331','湖南永顺经济开发区','','','湖南永顺经济开发区','3','湖南省','湘西土家族苗族自治州','湖南永顺经济开发区','湖南省湘西土家族苗族自治州湖南永顺经济开发区',null,null,29.0051500,109.8480700),\n(490587,'440000000000','0','44','0','广东省','广东省','','','1','广东省','','','广东省',null,null,null,null),\n(490588,'440100000000','440000000000','4401','44','广州市','','广州市','','2','广东省','广州市','','广东省广州市',null,null,23.1579200,113.2732400),\n(490589,'440101000000','440100000000','440101','4401','市辖区','','','市辖区','3','广东省','广州市','市辖区','广东省广州市市辖区',null,null,23.1579200,113.2732400),\n(490590,'440103000000','440100000000','440103','4401','荔湾区','','','荔湾区','3','广东省','广州市','荔湾区','广东省广州市荔湾区',null,null,23.1258600,113.2442800),\n(490799,'440104000000','440100000000','440104','4401','越秀区','','','越秀区','3','广东省','广州市','越秀区','广东省广州市越秀区',null,null,23.1290100,113.2668000),\n(491040,'440105000000','440100000000','440105','4401','海珠区','','','海珠区','3','广东省','广州市','海珠区','广东省广州市海珠区',null,null,23.0833100,113.3172000),\n(491324,'440106000000','440100000000','440106','4401','天河区','','','天河区','3','广东省','广州市','天河区','广东省广州市天河区',null,null,23.1246300,113.3619900),\n(491565,'440111000000','440100000000','440111','4401','白云区','','','白云区','3','广东省','广州市','白云区','广东省广州市白云区',null,null,23.1579200,113.2732400),\n(491984,'440112000000','440100000000','440112','4401','黄埔区','','','黄埔区','3','广东省','广州市','黄埔区','广东省广州市黄埔区',null,null,23.1813900,113.4806700),\n(492127,'440113000000','440100000000','440113','4401','番禺区','','','番禺区','3','广东省','广州市','番禺区','广东省广州市番禺区',null,null,22.9377200,113.3842400),\n(492418,'440114000000','440100000000','440114','4401','花都区','','','花都区','3','广东省','广州市','花都区','广东省广州市花都区',null,null,23.4039100,113.2202600),\n(492681,'440115000000','440100000000','440115','4401','南沙区','','','南沙区','3','广东省','广州市','南沙区','广东省广州市南沙区',null,null,22.8016900,113.5249700),\n(492858,'440117000000','440100000000','440117','4401','从化区','','','从化区','3','广东省','广州市','从化区','广东省广州市从化区',null,null,23.5483500,113.5864600),\n(493145,'440118000000','440100000000','440118','4401','增城区','','','增城区','3','广东省','广州市','增城区','广东省广州市增城区',null,null,23.2609300,113.8109000),\n(493498,'440200000000','440000000000','4402','44','韶关市','','韶关市','','2','广东省','韶关市','','广东省韶关市',null,null,24.6826000,113.6045800),\n(493499,'440201000000','440200000000','440201','4402','市辖区','','','市辖区','3','广东省','韶关市','市辖区','广东省韶关市市辖区',null,null,24.6826000,113.6045800),\n(493500,'440203000000','440200000000','440203','4402','武江区','','','武江区','3','广东省','韶关市','武江区','广东省韶关市武江区',null,null,24.7926800,113.5877100),\n(493592,'440204000000','440200000000','440204','4402','浈江区','','','浈江区','3','广东省','韶关市','浈江区','广东省韶关市浈江区',null,null,24.8044600,113.6109500),\n(493716,'440205000000','440200000000','440205','4402','曲江区','','','曲江区','3','广东省','韶关市','曲江区','广东省韶关市曲江区',null,null,24.6826000,113.6045800),\n(493838,'440222000000','440200000000','440222','4402','始兴县','','','始兴县','3','广东省','韶关市','始兴县','广东省韶关市始兴县',null,null,24.9526900,114.0620600),\n(493978,'440224000000','440200000000','440224','4402','仁化县','','','仁化县','3','广东省','韶关市','仁化县','广东省韶关市仁化县',null,null,25.0856600,113.7491800),\n(494115,'440229000000','440200000000','440229','4402','翁源县','','','翁源县','3','广东省','韶关市','翁源县','广东省韶关市翁源县',null,null,24.3502000,114.1303300),\n(494298,'440232000000','440200000000','440232','4402','乳源瑶族自治县','','','乳源瑶族自治县','3','广东省','韶关市','乳源瑶族自治县','广东省韶关市乳源瑶族自治县',null,null,24.7759100,113.2759600),\n(494427,'440233000000','440200000000','440233','4402','新丰县','','','新丰县','3','广东省','韶关市','新丰县','广东省韶关市新丰县',null,null,24.0595900,114.2068900),\n(494592,'440281000000','440200000000','440281','4402','乐昌市','','','乐昌市','3','广东省','韶关市','乐昌市','广东省韶关市乐昌市',null,null,25.1301400,113.3474600),\n(494837,'440282000000','440200000000','440282','4402','南雄市','','','南雄市','3','广东省','韶关市','南雄市','广东省韶关市南雄市',null,null,25.1196200,114.3108400),\n(495090,'440300000000','440000000000','4403','44','深圳市','','深圳市','','2','广东省','深圳市','','广东省深圳市',null,null,22.5532900,113.8830800),\n(495091,'440301000000','440300000000','440301','4403','市辖区','','','市辖区','3','广东省','深圳市','市辖区','广东省深圳市市辖区',null,null,22.5532900,113.8830800),\n(495092,'440303000000','440300000000','440303','4403','罗湖区','','','罗湖区','3','广东省','深圳市','罗湖区','广东省深圳市罗湖区',null,null,22.5483600,114.1316600),\n(495215,'440304000000','440300000000','440304','4403','福田区','','','福田区','3','广东省','深圳市','福田区','广东省深圳市福田区',null,null,22.5229100,114.0545400),\n(495343,'440305000000','440300000000','440305','4403','南山区','','','南山区','3','广东省','深圳市','南山区','广东省深圳市南山区',null,null,22.5333200,113.9304100),\n(495456,'440306000000','440300000000','440306','4403','宝安区','','','宝安区','3','广东省','深圳市','宝安区','广东省深圳市宝安区',null,null,22.5532900,113.8830800),\n(495646,'440307000000','440300000000','440307','4403','龙岗区','','','龙岗区','3','广东省','深圳市','龙岗区','广东省深圳市龙岗区',null,null,22.7199100,114.2477900),\n(495805,'440308000000','440300000000','440308','4403','盐田区','','','盐田区','3','广东省','深圳市','盐田区','广东省深圳市盐田区',null,null,22.5570000,114.2367900),\n(495837,'440309000000','440300000000','440309','4403','龙华区','','','龙华区','3','广东省','深圳市','龙华区','广东省深圳市龙华区',null,null,22.7217400,114.0603100),\n(495952,'440310000000','440300000000','440310','4403','坪山区','','','坪山区','3','广东省','深圳市','坪山区','广东省深圳市坪山区',null,null,22.6908400,114.3463200),\n(495984,'440400000000','440000000000','4404','44','珠海市','','珠海市','','2','广东省','珠海市','','广东省珠海市',null,null,22.2090700,113.2967300),\n(495985,'440401000000','440400000000','440401','4404','市辖区','','','市辖区','3','广东省','珠海市','市辖区','广东省珠海市市辖区',null,null,22.2090700,113.2967300),\n(495986,'440402000000','440400000000','440402','4404','香洲区','','','香洲区','3','广东省','珠海市','香洲区','广东省珠海市香洲区',null,null,22.2666600,113.5434200),\n(496163,'440403000000','440400000000','440403','4404','斗门区','','','斗门区','3','广东省','珠海市','斗门区','广东省珠海市斗门区',null,null,22.2090700,113.2967300),\n(496301,'440404000000','440400000000','440404','4404','金湾区','','','金湾区','3','广东省','珠海市','金湾区','广东省珠海市金湾区',null,null,22.1458900,113.3642000),\n(496350,'440500000000','440000000000','4405','44','汕头市','','汕头市','','2','广东省','汕头市','','广东省汕头市',null,null,23.2502900,116.4331000),\n(496351,'440501000000','440500000000','440501','4405','市辖区','','','市辖区','3','广东省','汕头市','市辖区','广东省汕头市市辖区',null,null,23.2502900,116.4331000),\n(496352,'440507000000','440500000000','440507','4405','龙湖区','','','龙湖区','3','广东省','汕头市','龙湖区','广东省汕头市龙湖区',null,null,23.3724600,116.7167700),\n(496481,'440511000000','440500000000','440511','4405','金平区','','','金平区','3','广东省','汕头市','金平区','广东省汕头市金平区',null,null,23.3652500,116.7054000),\n(496670,'440512000000','440500000000','440512','4405','濠江区','','','濠江区','3','广东省','汕头市','濠江区','广东省汕头市濠江区',null,null,23.2859200,116.7266400),\n(496738,'440513000000','440500000000','440513','4405','潮阳区','','','潮阳区','3','广东省','汕头市','潮阳区','广东省汕头市潮阳区',null,null,23.2648900,116.6015700),\n(497024,'440514000000','440500000000','440514','4405','潮南区','','','潮南区','3','广东省','汕头市','潮南区','广东省汕头市潮南区',null,null,23.2502900,116.4331000),\n(497268,'440515000000','440500000000','440515','4405','澄海区','','','澄海区','3','广东省','汕头市','澄海区','广东省汕头市澄海区',null,null,23.4661300,116.7560800),\n(497464,'440523000000','440500000000','440523','4405','南澳县','','','南澳县','3','广东省','汕头市','南澳县','广东省汕头市南澳县',null,null,23.4217800,117.0234800),\n(497514,'440600000000','440000000000','4406','44','佛山市','','佛山市','','2','广东省','佛山市','','广东省佛山市',null,null,22.9002600,112.8926200),\n(497515,'440601000000','440600000000','440601','4406','市辖区','','','市辖区','3','广东省','佛山市','市辖区','广东省佛山市市辖区',null,null,22.9002600,112.8926200),\n(497516,'440604000000','440600000000','440604','4406','禅城区','','','禅城区','3','广东省','佛山市','禅城区','广东省佛山市禅城区',null,null,23.0094400,113.1224900),\n(497664,'440605000000','440600000000','440605','4406','南海区','','','南海区','3','广东省','佛山市','南海区','广东省佛山市南海区',null,null,23.0288200,113.1427800),\n(497963,'440606000000','440600000000','440606','4406','顺德区','','','顺德区','3','广东省','佛山市','顺德区','广东省佛山市顺德区',null,null,22.8053600,113.2932100),\n(498178,'440607000000','440600000000','440607','4406','三水区','','','三水区','3','广东省','佛山市','三水区','广东省佛山市三水区',null,null,23.1562300,112.8962900),\n(498266,'440608000000','440600000000','440608','4406','高明区','','','高明区','3','广东省','佛山市','高明区','广东省佛山市高明区',null,null,22.9002600,112.8926200),\n(498351,'440700000000','440000000000','4407','44','江门市','','江门市','','2','广东省','江门市','','广东省江门市',null,null,22.5602800,113.1110300),\n(498352,'440701000000','440700000000','440701','4407','市辖区','','','市辖区','3','广东省','江门市','市辖区','广东省江门市市辖区',null,null,22.5602800,113.1110300),\n(498353,'440703000000','440700000000','440703','4407','蓬江区','','','蓬江区','3','广东省','江门市','蓬江区','广东省江门市蓬江区',null,null,22.5951400,113.0784500),\n(498503,'440704000000','440700000000','440704','4407','江海区','','','江海区','3','广东省','江门市','江海区','广东省江门市江海区',null,null,22.5602800,113.1110300),\n(498569,'440705000000','440700000000','440705','4407','新会区','','','新会区','3','广东省','江门市','新会区','广东省江门市新会区',null,null,22.4587700,113.0323100),\n(498815,'440781000000','440700000000','440781','4407','台山市','','','台山市','3','广东省','江门市','台山市','广东省江门市台山市',null,null,22.2515600,112.7939000),\n(499146,'440783000000','440700000000','440783','4407','开平市','','','开平市','3','广东省','江门市','开平市','广东省江门市开平市',null,null,22.3763800,112.6985100),\n(499434,'440784000000','440700000000','440784','4407','鹤山市','','','鹤山市','3','广东省','江门市','鹤山市','广东省江门市鹤山市',null,null,22.7653000,112.9643600),\n(499587,'440785000000','440700000000','440785','4407','恩平市','','','恩平市','3','广东省','江门市','恩平市','广东省江门市恩平市',null,null,22.1829400,112.3053200),\n(499775,'440800000000','440000000000','4408','44','湛江市','','湛江市','','2','广东省','湛江市','','广东省湛江市',null,null,21.2662400,110.3653400),\n(499776,'440801000000','440800000000','440801','4408','市辖区','','','市辖区','3','广东省','湛江市','市辖区','广东省湛江市市辖区',null,null,21.2662400,110.3653400),\n(499777,'440802000000','440800000000','440802','4408','赤坎区','','','赤坎区','3','广东省','湛江市','赤坎区','广东省湛江市赤坎区',null,null,21.2662400,110.3653400),\n(499833,'440803000000','440800000000','440803','4408','霞山区','','','霞山区','3','广东省','湛江市','霞山区','广东省湛江市霞山区',null,null,21.1916900,110.3982100),\n(499924,'440804000000','440800000000','440804','4408','坡头区','','','坡头区','3','广东省','湛江市','坡头区','广东省湛江市坡头区',null,null,21.2447500,110.4555000),\n(500003,'440811000000','440800000000','440811','4408','麻章区','','','麻章区','3','广东省','湛江市','麻章区','广东省湛江市麻章区',null,null,21.2633100,110.3342700),\n(500156,'440823000000','440800000000','440823','4408','遂溪县','','','遂溪县','3','广东省','湛江市','遂溪县','广东省湛江市遂溪县',null,null,21.3770800,110.2500600),\n(500522,'440825000000','440800000000','440825','4408','徐闻县','','','徐闻县','3','广东省','湛江市','徐闻县','广东省湛江市徐闻县',null,null,20.3265200,110.1750200),\n(500750,'440881000000','440800000000','440881','4408','廉江市','','','廉江市','3','广东省','湛江市','廉江市','广东省湛江市廉江市',null,null,21.6096200,110.2862500),\n(501173,'440882000000','440800000000','440882','4408','雷州市','','','雷州市','3','广东省','湛江市','雷州市','广东省湛江市雷州市',null,null,20.9144400,110.0965100),\n(501693,'440883000000','440800000000','440883','4408','吴川市','','','吴川市','3','广东省','湛江市','吴川市','广东省湛江市吴川市',null,null,21.4418200,110.7782400),\n(501905,'440900000000','440000000000','4409','44','茂名市','','茂名市','','2','广东省','茂名市','','广东省茂名市',null,null,21.5142800,111.0163600),\n(501906,'440901000000','440900000000','440901','4409','市辖区','','','市辖区','3','广东省','茂名市','市辖区','广东省茂名市市辖区',null,null,21.5142800,111.0163600),\n(501907,'440902000000','440900000000','440902','4409','茂南区','','','茂南区','3','广东省','茂名市','茂南区','广东省茂名市茂南区',null,null,21.6410900,110.9187900),\n(502164,'440904000000','440900000000','440904','4409','电白区','','','电白区','3','广东省','茂名市','电白区','广东省茂名市电白区',null,null,21.5142800,111.0163600),\n(502600,'440981000000','440900000000','440981','4409','高州市','','','高州市','3','广东省','茂名市','高州市','广东省茂名市高州市',null,null,21.9181200,110.8533800),\n(503123,'440982000000','440900000000','440982','4409','化州市','','','化州市','3','广东省','茂名市','化州市','广东省茂名市化州市',null,null,21.6639700,110.6395400),\n(503528,'440983000000','440900000000','440983','4409','信宜市','','','信宜市','3','广东省','茂名市','信宜市','广东省茂名市信宜市',null,null,22.3542900,110.9471000),\n(503950,'441200000000','440000000000','4412','44','肇庆市','','肇庆市','','2','广东省','肇庆市','','广东省肇庆市',null,null,23.1581500,112.5670600),\n(503951,'441201000000','441200000000','441201','4412','市辖区','','','市辖区','3','广东省','肇庆市','市辖区','广东省肇庆市市辖区',null,null,23.1581500,112.5670600),\n(503952,'441202000000','441200000000','441202','4412','端州区','','','端州区','3','广东省','肇庆市','端州区','广东省肇庆市端州区',null,null,23.0519600,112.4846100),\n(504017,'441203000000','441200000000','441203','4412','鼎湖区','','','鼎湖区','3','广东省','肇庆市','鼎湖区','广东省肇庆市鼎湖区',null,null,23.1581500,112.5670600),\n(504106,'441204000000','441200000000','441204','4412','高要区','','','高要区','3','广东省','肇庆市','高要区','广东省肇庆市高要区',null,null,23.0258100,112.4583900),\n(504476,'441223000000','441200000000','441223','4412','广宁县','','','广宁县','3','广东省','肇庆市','广宁县','广东省肇庆市广宁县',null,null,23.6349300,112.4411200),\n(504670,'441224000000','441200000000','441224','4412','怀集县','','','怀集县','3','广东省','肇庆市','怀集县','广东省肇庆市怀集县',null,null,23.9118800,112.1845400),\n(505018,'441225000000','441200000000','441225','4412','封开县','','','封开县','3','广东省','肇庆市','封开县','广东省肇庆市封开县',null,null,23.4244800,111.5119600),\n(505234,'441226000000','441200000000','441226','4412','德庆县','','','德庆县','3','广东省','肇庆市','德庆县','广东省肇庆市德庆县',null,null,23.1437600,111.7855900),\n(505441,'441284000000','441200000000','441284','4412','四会市','','','四会市','3','广东省','肇庆市','四会市','广东省肇庆市四会市',null,null,23.3274300,112.7340400),\n(505620,'441300000000','440000000000','4413','44','惠州市','','惠州市','','2','广东省','惠州市','','广东省惠州市',null,null,23.0838300,114.3827300),\n(505621,'441301000000','441300000000','441301','4413','市辖区','','','市辖区','3','广东省','惠州市','市辖区','广东省惠州市市辖区',null,null,23.0838300,114.3827300),\n(505622,'441302000000','441300000000','441302','4413','惠城区','','','惠城区','3','广东省','惠州市','惠城区','广东省惠州市惠城区',null,null,23.0838300,114.3827300),\n(505913,'441303000000','441300000000','441303','4413','惠阳区','','','惠阳区','3','广东省','惠州市','惠阳区','广东省惠州市惠阳区',null,null,22.7885100,114.4564600),\n(506096,'441322000000','441300000000','441322','4413','博罗县','','','博罗县','3','广东省','惠州市','博罗县','广东省惠州市博罗县',null,null,23.1731500,114.2897300),\n(506496,'441323000000','441300000000','441323','4413','惠东县','','','惠东县','3','广东省','惠州市','惠东县','广东省惠州市惠东县',null,null,22.9848600,114.7199900),\n(506813,'441324000000','441300000000','441324','4413','龙门县','','','龙门县','3','广东省','惠州市','龙门县','广东省惠州市龙门县',null,null,23.7276300,114.2548600),\n(507010,'441400000000','440000000000','4414','44','梅州市','','梅州市','','2','广东省','梅州市','','广东省梅州市',null,null,24.3099600,116.1169900),\n(507011,'441401000000','441400000000','441401','4414','市辖区','','','市辖区','3','广东省','梅州市','市辖区','广东省梅州市市辖区',null,null,24.3099600,116.1169900),\n(507012,'441402000000','441400000000','441402','4414','梅江区','','','梅江区','3','广东省','梅州市','梅江区','广东省梅州市梅江区',null,null,24.3099600,116.1169900),\n(507146,'441403000000','441400000000','441403','4414','梅县区','','','梅县区','3','广东省','梅州市','梅县区','广东省梅州市梅县区',null,null,24.2653900,116.0824500),\n(507557,'441422000000','441400000000','441422','4414','大埔县','','','大埔县','3','广东省','梅州市','大埔县','广东省梅州市大埔县',null,null,24.3479200,116.6952000),\n(507833,'441423000000','441400000000','441423','4414','丰顺县','','','丰顺县','3','广东省','梅州市','丰顺县','广东省梅州市丰顺县',null,null,23.7394500,116.1822500),\n(508133,'441424000000','441400000000','441424','4414','五华县','','','五华县','3','广东省','梅州市','五华县','广东省梅州市五华县',null,null,23.9325400,115.7760900),\n(508596,'441426000000','441400000000','441426','4414','平远县','','','平远县','3','广东省','梅州市','平远县','广东省梅州市平远县',null,null,24.5663200,115.8911200),\n(508752,'441427000000','441400000000','441427','4414','蕉岭县','','','蕉岭县','3','广东省','梅州市','蕉岭县','广东省梅州市蕉岭县',null,null,24.6586100,116.1712300),\n(508873,'441481000000','441400000000','441481','4414','兴宁市','','','兴宁市','3','广东省','梅州市','兴宁市','广东省梅州市兴宁市',null,null,24.1365000,115.7311900),\n(509389,'441500000000','440000000000','4415','44','汕尾市','','汕尾市','','2','广东省','汕尾市','','广东省汕尾市',null,null,22.7787000,115.3650200),\n(509390,'441501000000','441500000000','441501','4415','市辖区','','','市辖区','3','广东省','汕尾市','市辖区','广东省汕尾市市辖区',null,null,22.7787000,115.3650200),\n(509391,'441502000000','441500000000','441502','4415','城区','','','城区','3','广东省','汕尾市','城区','广东省汕尾市城区',null,null,22.7787000,115.3650200),\n(509525,'441521000000','441500000000','441521','4415','海丰县','','','海丰县','3','广东省','汕尾市','海丰县','广东省汕尾市海丰县',null,null,22.9665700,115.3234100),\n(509826,'441523000000','441500000000','441523','4415','陆河县','','','陆河县','3','广东省','汕尾市','陆河县','广东省汕尾市陆河县',null,null,23.3014800,115.6599600),\n(509962,'441581000000','441500000000','441581','4415','陆丰市','','','陆丰市','3','广东省','汕尾市','陆丰市','广东省汕尾市陆丰市',null,null,22.9451100,115.6446200),\n(510352,'441600000000','440000000000','4416','44','河源市','','河源市','','2','广东省','河源市','','广东省河源市',null,null,23.7341700,114.7024600),\n(510353,'441601000000','441600000000','441601','4416','市辖区','','','市辖区','3','广东省','河源市','市辖区','广东省河源市市辖区',null,null,23.7341700,114.7024600),\n(510354,'441602000000','441600000000','441602','4416','源城区','','','源城区','3','广东省','河源市','源城区','广东省河源市源城区',null,null,23.7341700,114.7024600),\n(510434,'441621000000','441600000000','441621','4416','紫金县','','','紫金县','3','广东省','河源市','紫金县','广东省河源市紫金县',null,null,23.6353200,115.1839800),\n(510753,'441622000000','441600000000','441622','4416','龙川县','','','龙川县','3','广东省','河源市','龙川县','广东省河源市龙川县',null,null,24.1001400,115.2598400),\n(511135,'441623000000','441600000000','441623','4416','连平县','','','连平县','3','广东省','河源市','连平县','广东省河源市连平县',null,null,24.3695600,114.4886500),\n(511324,'441624000000','441600000000','441624','4416','和平县','','','和平县','3','广东省','河源市','和平县','广东省河源市和平县',null,null,24.4420100,114.9387200),\n(511587,'441625000000','441600000000','441625','4416','东源县','','','东源县','3','广东省','河源市','东源县','广东省河源市东源县',null,null,23.7885600,114.7462500),\n(511893,'441700000000','440000000000','4417','44','阳江市','','阳江市','','2','广东省','阳江市','','广东省阳江市',null,null,21.8618200,111.9551600),\n(511894,'441701000000','441700000000','441701','4417','市辖区','','','市辖区','3','广东省','阳江市','市辖区','广东省阳江市市辖区',null,null,21.8618200,111.9551600),\n(511895,'441702000000','441700000000','441702','4417','江城区','','','江城区','3','广东省','阳江市','江城区','广东省阳江市江城区',null,null,21.8618200,111.9551600),\n(512076,'441704000000','441700000000','441704','4417','阳东区','','','阳东区','3','广东省','阳江市','阳东区','广东省阳江市阳东区',null,null,21.8682900,112.0067000),\n(512276,'441721000000','441700000000','441721','4417','阳西县','','','阳西县','3','广东省','阳江市','阳西县','广东省阳江市阳西县',null,null,21.7522900,111.6179100),\n(512438,'441781000000','441700000000','441781','4417','阳春市','','','阳春市','3','广东省','阳江市','阳春市','广东省阳江市阳春市',null,null,22.1703000,111.7915300),\n(512825,'441800000000','440000000000','4418','44','清远市','','清远市','','2','广东省','清远市','','广东省清远市',null,null,23.6979500,113.0626900),\n(512826,'441801000000','441800000000','441801','4418','市辖区','','','市辖区','3','广东省','清远市','市辖区','广东省清远市市辖区',null,null,23.6979500,113.0626900),\n(512827,'441802000000','441800000000','441802','4418','清城区','','','清城区','3','广东省','清远市','清城区','广东省清远市清城区',null,null,23.6979500,113.0626900),\n(512995,'441803000000','441800000000','441803','4418','清新区','','','清新区','3','广东省','清远市','清新区','广东省清远市清新区',null,null,23.7347400,113.0165800),\n(513214,'441821000000','441800000000','441821','4418','佛冈县','','','佛冈县','3','广东省','清远市','佛冈县','广东省清远市佛冈县',null,null,23.8792100,113.5317200),\n(513311,'441823000000','441800000000','441823','4418','阳山县','','','阳山县','3','广东省','清远市','阳山县','广东省清远市阳山县',null,null,24.4650000,112.6413200),\n(513492,'441825000000','441800000000','441825','4418','连山壮族瑶族自治县','','','连山壮族瑶族自治县','3','广东省','清远市','连山壮族瑶族自治县','广东省清远市连山壮族瑶族自治县',null,null,24.5703600,112.0934800),\n(513556,'441826000000','441800000000','441826','4418','连南瑶族自治县','','','连南瑶族自治县','3','广东省','清远市','连南瑶族自治县','广东省清远市连南瑶族自治县',null,null,24.7254000,112.2869800),\n(513635,'441881000000','441800000000','441881','4418','英德市','','','英德市','3','广东省','清远市','英德市','广东省清远市英德市',null,null,24.1857200,113.4150500),\n(513959,'441882000000','441800000000','441882','4418','连州市','','','连州市','3','广东省','清远市','连州市','广东省清远市连州市',null,null,24.7799800,112.3767700),\n(514145,'441900000000','440000000000','4419','44','东莞市','','东莞市','','2','广东省','东莞市','','广东省东莞市',null,null,23.0206700,113.7517900),\n(514146,'442000000000','440000000000','4420','44','中山市','','中山市','','2','广东省','中山市','','广东省中山市',null,null,22.5159500,113.3926000),\n(514147,'445100000000','440000000000','4451','44','潮州市','','潮州市','','2','广东省','潮州市','','广东省潮州市',null,null,23.4624400,116.6780900),\n(514148,'445101000000','445100000000','445101','4451','市辖区','','','市辖区','3','广东省','潮州市','市辖区','广东省潮州市市辖区',null,null,23.4624400,116.6780900),\n(514149,'445102000000','445100000000','445102','4451','湘桥区','','','湘桥区','3','广东省','潮州市','湘桥区','广东省潮州市湘桥区',null,null,23.6744100,116.6283400),\n(514341,'445103000000','445100000000','445103','4451','潮安区','','','潮安区','3','广东省','潮州市','潮安区','广东省潮州市潮安区',null,null,23.4624400,116.6780900),\n(514816,'445122000000','445100000000','445122','4451','饶平县','','','饶平县','3','广东省','潮州市','饶平县','广东省潮州市饶平县',null,null,23.6641200,117.0039000),\n(515241,'445200000000','440000000000','4452','44','揭阳市','','揭阳市','','2','广东省','揭阳市','','广东省揭阳市',null,null,23.5660600,116.4121100),\n(515242,'445201000000','445200000000','445201','4452','市辖区','','','市辖区','3','广东省','揭阳市','市辖区','广东省揭阳市市辖区',null,null,23.5660600,116.4121100),\n(515243,'445202000000','445200000000','445202','4452','榕城区','','','榕城区','3','广东省','揭阳市','榕城区','广东省揭阳市榕城区',null,null,23.5248600,116.3669200),\n(515456,'445203000000','445200000000','445203','4452','揭东区','','','揭东区','3','广东省','揭阳市','揭东区','广东省揭阳市揭东区',null,null,23.5660600,116.4121100),\n(515694,'445222000000','445200000000','445222','4452','揭西县','','','揭西县','3','广东省','揭阳市','揭西县','广东省揭阳市揭西县',null,null,23.4314100,115.8418900),\n(516042,'445224000000','445200000000','445224','4452','惠来县','','','惠来县','3','广东省','揭阳市','惠来县','广东省揭阳市惠来县',null,null,23.0332100,116.2951100),\n(516389,'445281000000','445200000000','445281','4452','普宁市','','','普宁市','3','广东省','揭阳市','普宁市','广东省揭阳市普宁市',null,null,23.2973600,116.1656900),\n(517001,'445300000000','440000000000','4453','44','云浮市','','云浮市','','2','广东省','云浮市','','广东省云浮市',null,null,23.0710100,112.0032400),\n(517002,'445301000000','445300000000','445301','4453','市辖区','','','市辖区','3','广东省','云浮市','市辖区','广东省云浮市市辖区',null,null,23.0710100,112.0032400),\n(517003,'445302000000','445300000000','445302','4453','云城区','','','云城区','3','广东省','云浮市','云城区','广东省云浮市云城区',null,null,22.9279700,112.0437300),\n(517129,'445303000000','445300000000','445303','4453','云安区','','','云安区','3','广东省','云浮市','云安区','广东省云浮市云安区',null,null,23.0710100,112.0032400),\n(517253,'445321000000','445300000000','445321','4453','新兴县','','','新兴县','3','广东省','云浮市','新兴县','广东省云浮市新兴县',null,null,22.6957300,112.2253600),\n(517471,'445322000000','445300000000','445322','4453','郁南县','','','郁南县','3','广东省','云浮市','郁南县','广东省云浮市郁南县',null,null,23.2346400,111.5353600),\n(517695,'445381000000','445300000000','445381','4453','罗定市','','','罗定市','3','广东省','云浮市','罗定市','广东省云浮市罗定市',null,null,22.7683000,111.5700400),\n(518055,'450000000000','0','45','0','广西壮族自治区','广西壮族自治区','','','1','广西壮族自治区','','','广西壮族自治区',null,null,null,null),\n(518056,'450100000000','450000000000','4501','45','南宁市','','南宁市','','2','广西壮族自治区','南宁市','','广西壮族自治区南宁市',null,null,22.7812100,108.2733100),\n(518057,'450101000000','450100000000','450101','4501','市辖区','','','市辖区','3','广西壮族自治区','南宁市','市辖区','广西壮族自治区南宁市市辖区',null,null,22.7812100,108.2733100),\n(518058,'450102000000','450100000000','450102','4501','兴宁区','','','兴宁区','3','广西壮族自治区','南宁市','兴宁区','广西壮族自治区南宁市兴宁区',null,null,22.8542900,108.3683600),\n(518141,'450103000000','450100000000','450103','4501','青秀区','','','青秀区','3','广西壮族自治区','南宁市','青秀区','广西壮族自治区南宁市青秀区',null,null,22.7865800,108.4969300),\n(518258,'450105000000','450100000000','450105','4501','江南区','','','江南区','3','广西壮族自治区','南宁市','江南区','广西壮族自治区南宁市江南区',null,null,22.7812100,108.2733100),\n(518387,'450107000000','450100000000','450107','4501','西乡塘区','','','西乡塘区','3','广西壮族自治区','南宁市','西乡塘区','广西壮族自治区南宁市西乡塘区',null,null,22.8339300,108.3134300),\n(518557,'450108000000','450100000000','450108','4501','良庆区','','','良庆区','3','广西壮族自治区','南宁市','良庆区','广西壮族自治区南宁市良庆区',null,null,22.7561900,108.3208200),\n(518645,'450109000000','450100000000','450109','4501','邕宁区','','','邕宁区','3','广西壮族自治区','南宁市','邕宁区','广西壮族自治区南宁市邕宁区',null,null,22.7583700,108.4873700),\n(518725,'450110000000','450100000000','450110','4501','武鸣区','','','武鸣区','3','广西壮族自治区','南宁市','武鸣区','广西壮族自治区南宁市武鸣区',null,null,23.1586600,108.2746100),\n(518981,'450123000000','450100000000','450123','4501','隆安县','','','隆安县','3','广西壮族自治区','南宁市','隆安县','广西壮族自治区南宁市隆安县',null,null,23.1658900,107.6961000),\n(519130,'450124000000','450100000000','450124','4501','马山县','','','马山县','3','广西壮族自治区','南宁市','马山县','广西壮族自治区南宁市马山县',null,null,23.7081700,108.1770200),\n(519295,'450125000000','450100000000','450125','4501','上林县','','','上林县','3','广西壮族自治区','南宁市','上林县','广西壮族自治区南宁市上林县',null,null,23.4320500,108.6050600),\n(519438,'450126000000','450100000000','450126','4501','宾阳县','','','宾阳县','3','广西壮族自治区','南宁市','宾阳县','广西壮族自治区南宁市宾阳县',null,null,23.2176800,108.8103000),\n(519691,'450127000000','450100000000','450127','4501','横县','','','横县','3','广西壮族自治区','南宁市','横县','广西壮族自治区南宁市横县',null,null,22.6799900,109.2614700),\n(520034,'450200000000','450000000000','4502','45','柳州市','','柳州市','','2','广西壮族自治区','柳州市','','广西壮族自治区柳州市',null,null,24.3394100,109.4462600),\n(520035,'450201000000','450200000000','450201','4502','市辖区','','','市辖区','3','广西壮族自治区','柳州市','市辖区','广西壮族自治区柳州市市辖区',null,null,24.3394100,109.4462600),\n(520036,'450202000000','450200000000','450202','4502','城中区','','','城中区','3','广西壮族自治区','柳州市','城中区','广西壮族自治区柳州市城中区',null,null,24.3394100,109.4462600),\n(520078,'450203000000','450200000000','450203','4502','鱼峰区','','','鱼峰区','3','广西壮族自治区','柳州市','鱼峰区','广西壮族自治区柳州市鱼峰区',null,null,24.2815400,109.4472600),\n(520165,'450204000000','450200000000','450204','4502','柳南区','','','柳南区','3','广西壮族自治区','柳州市','柳南区','广西壮族自治区柳州市柳南区',null,null,24.3359900,109.3859000),\n(520252,'450205000000','450200000000','450205','4502','柳北区','','','柳北区','3','广西壮族自治区','柳州市','柳北区','广西壮族自治区柳州市柳北区',null,null,24.3625900,109.4020900),\n(520361,'450206000000','450200000000','450206','4502','柳江区','','','柳江区','3','广西壮族自治区','柳州市','柳江区','广西壮族自治区柳州市柳江区',null,null,24.2546500,109.3267200),\n(520527,'450222000000','450200000000','450222','4502','柳城县','','','柳城县','3','广西壮族自治区','柳州市','柳城县','广西壮族自治区柳州市柳城县',null,null,24.6505800,109.2446800),\n(520680,'450223000000','450200000000','450223','4502','鹿寨县','','','鹿寨县','3','广西壮族自治区','柳州市','鹿寨县','广西壮族自治区柳州市鹿寨县',null,null,24.4730800,109.7517900),\n(520808,'450224000000','450200000000','450224','4502','融安县','','','融安县','3','广西壮族自治区','柳州市','融安县','广西壮族自治区柳州市融安县',null,null,25.2246700,109.3976400),\n(520969,'450225000000','450200000000','450225','4502','融水苗族自治县','','','融水苗族自治县','3','广西壮族自治区','柳州市','融水苗族自治县','广西壮族自治区柳州市融水苗族自治县',null,null,25.0662900,109.2563600),\n(521196,'450226000000','450200000000','450226','4502','三江侗族自治县','','','三江侗族自治县','3','广西壮族自治区','柳州市','三江侗族自治县','广西壮族自治区柳州市三江侗族自治县',null,null,25.7831400,109.6078800),\n(521381,'450300000000','450000000000','4503','45','桂林市','','桂林市','','2','广西壮族自治区','桂林市','','广西壮族自治区桂林市',null,null,25.3140200,110.3018800),\n(521382,'450301000000','450300000000','450301','4503','市辖区','','','市辖区','3','广西壮族自治区','桂林市','市辖区','广西壮族自治区桂林市市辖区',null,null,25.3140200,110.3018800),\n(521383,'450302000000','450300000000','450302','4503','秀峰区','','','秀峰区','3','广西壮族自治区','桂林市','秀峰区','广西壮族自治区桂林市秀峰区',null,null,25.2813100,110.2890300),\n(521415,'450303000000','450300000000','450303','4503','叠彩区','','','叠彩区','3','广西壮族自治区','桂林市','叠彩区','广西壮族自治区桂林市叠彩区',null,null,25.3140200,110.3018800),\n(521455,'450304000000','450300000000','450304','4503','象山区','','','象山区','3','广西壮族自治区','桂林市','象山区','广西壮族自治区桂林市象山区',null,null,25.2615900,110.2811000),\n(521502,'450305000000','450300000000','450305','4503','七星区','','','七星区','3','广西壮族自治区','桂林市','七星区','广西壮族自治区桂林市七星区',null,null,25.2523500,110.3177100),\n(521555,'450311000000','450300000000','450311','4503','雁山区','','','雁山区','3','广西壮族自治区','桂林市','雁山区','广西壮族自治区桂林市雁山区',null,null,25.0603900,110.3091400),\n(521603,'450312000000','450300000000','450312','4503','临桂区','','','临桂区','3','广西壮族自治区','桂林市','临桂区','广西壮族自治区桂林市临桂区',null,null,25.2386800,110.2124000),\n(521786,'450321000000','450300000000','450321','4503','阳朔县','','','阳朔县','3','广西壮族自治区','桂林市','阳朔县','广西壮族自治区桂林市阳朔县',null,null,24.7784300,110.4966300),\n(521910,'450323000000','450300000000','450323','4503','灵川县','','','灵川县','3','广西壮族自治区','桂林市','灵川县','广西壮族自治区桂林市灵川县',null,null,25.4097000,110.3255200),\n(522072,'450324000000','450300000000','450324','4503','全州县','','','全州县','3','广西壮族自治区','桂林市','全州县','广西壮族自治区桂林市全州县',null,null,25.9286100,111.0730400),\n(522375,'450325000000','450300000000','450325','4503','兴安县','','','兴安县','3','广西壮族自治区','桂林市','兴安县','广西壮族自治区桂林市兴安县',null,null,25.6116900,110.6714700),\n(522511,'450326000000','450300000000','450326','4503','永福县','','','永福县','3','广西壮族自治区','桂林市','永福县','广西壮族自治区桂林市永福县',null,null,24.9800100,109.9831800),\n(522620,'450327000000','450300000000','450327','4503','灌阳县','','','灌阳县','3','广西壮族自治区','桂林市','灌阳县','广西壮族自治区桂林市灌阳县',null,null,25.4893200,111.1608300),\n(522771,'450328000000','450300000000','450328','4503','龙胜各族自治县','','','龙胜各族自治县','3','广西壮族自治区','桂林市','龙胜各族自治县','广西壮族自治区桂林市龙胜各族自治县',null,null,25.7980900,110.0114900),\n(522909,'450329000000','450300000000','450329','4503','资源县','','','资源县','3','广西壮族自治区','桂林市','资源县','广西壮族自治区桂林市资源县',null,null,26.0424100,110.6525900),\n(522991,'450330000000','450300000000','450330','4503','平乐县','','','平乐县','3','广西壮族自治区','桂林市','平乐县','广西壮族自治区桂林市平乐县',null,null,24.6332500,110.6432200),\n(523155,'450331000000','450300000000','450331','4503','荔浦县','','','荔浦县','3','广西壮族自治区','桂林市','荔浦县','广西壮族自治区桂林市荔浦县',null,null,24.4878500,110.3950800),\n(523313,'450332000000','450300000000','450332','4503','恭城瑶族自治县','','','恭城瑶族自治县','3','广西壮族自治区','桂林市','恭城瑶族自治县','广西壮族自治区桂林市恭城瑶族自治县',null,null,24.8313500,110.8283500),\n(523450,'450400000000','450000000000','4504','45','梧州市','','梧州市','','2','广西壮族自治区','梧州市','','广西壮族自治区梧州市',null,null,23.4855500,111.2746600),\n(523451,'450401000000','450400000000','450401','4504','市辖区','','','市辖区','3','广西壮族自治区','梧州市','市辖区','广西壮族自治区梧州市市辖区',null,null,23.4855500,111.2746600),\n(523452,'450403000000','450400000000','450403','4504','万秀区','','','万秀区','3','广西壮族自治区','梧州市','万秀区','广西壮族自治区梧州市万秀区',null,null,23.4730300,111.3203300),\n(523537,'450405000000','450400000000','450405','4504','长洲区','','','长洲区','3','广西壮族自治区','梧州市','长洲区','广西壮族自治区梧州市长洲区',null,null,23.4855500,111.2746600),\n(523583,'450406000000','450400000000','450406','4504','龙圩区','','','龙圩区','3','广西壮族自治区','梧州市','龙圩区','广西壮族自治区梧州市龙圩区',null,null,23.4151300,111.2475200),\n(523667,'450421000000','450400000000','450421','4504','苍梧县','','','苍梧县','3','广西壮族自治区','梧州市','苍梧县','广西壮族自治区梧州市苍梧县',null,null,23.8423200,111.5448800),\n(523822,'450422000000','450400000000','450422','4504','藤县','','','藤县','3','广西壮族自治区','梧州市','藤县','广西壮族自治区梧州市藤县',null,null,23.3749700,110.9149700),\n(524138,'450423000000','450400000000','450423','4504','蒙山县','','','蒙山县','3','广西壮族自治区','梧州市','蒙山县','广西壮族自治区梧州市蒙山县',null,null,24.1935500,110.5249200),\n(524232,'450481000000','450400000000','450481','4504','岑溪市','','','岑溪市','3','广西壮族自治区','梧州市','岑溪市','广西壮族自治区梧州市岑溪市',null,null,22.9182800,110.9949000),\n(524529,'450500000000','450000000000','4505','45','北海市','','北海市','','2','广西壮族自治区','北海市','','广西壮族自治区北海市',null,null,21.4752500,109.1175000),\n(524530,'450501000000','450500000000','450501','4505','市辖区','','','市辖区','3','广西壮族自治区','北海市','市辖区','广西壮族自治区北海市市辖区',null,null,21.4752500,109.1175000),\n(524531,'450502000000','450500000000','450502','4505','海城区','','','海城区','3','广西壮族自治区','北海市','海城区','广西壮族自治区北海市海城区',null,null,21.4752500,109.1175000),\n(524606,'450503000000','450500000000','450503','4505','银海区','','','银海区','3','广西壮族自治区','北海市','银海区','广西壮族自治区北海市银海区',null,null,21.4487200,109.1391600),\n(524664,'450512000000','450500000000','450512','4505','铁山港区','','','铁山港区','3','广西壮族自治区','北海市','铁山港区','广西壮族自治区北海市铁山港区',null,null,21.5290900,109.4216000),\n(524711,'450521000000','450500000000','450521','4505','合浦县','','','合浦县','3','广西壮族自治区','北海市','合浦县','广西壮族自治区北海市合浦县',null,null,21.6608900,109.2072500),\n(525003,'450600000000','450000000000','4506','45','防城港市','','防城港市','','2','广西壮族自治区','防城港市','','广西壮族自治区防城港市',null,null,21.7691300,108.3534200),\n(525004,'450601000000','450600000000','450601','4506','市辖区','','','市辖区','3','广西壮族自治区','防城港市','市辖区','广西壮族自治区防城港市市辖区',null,null,21.7691300,108.3534200),\n(525005,'450602000000','450600000000','450602','4506','港口区','','','港口区','3','广西壮族自治区','防城港市','港口区','广西壮族自治区防城港市港口区',null,null,21.6434800,108.3801200),\n(525053,'450603000000','450600000000','450603','4506','防城区','','','防城区','3','广西壮族自治区','防城港市','防城区','广西壮族自治区防城港市防城区',null,null,21.7691300,108.3534200),\n(525239,'450621000000','450600000000','450621','4506','上思县','','','上思县','3','广西壮族自治区','防城港市','上思县','广西壮族自治区防城港市上思县',null,null,22.1537000,107.9836200),\n(525360,'450681000000','450600000000','450681','4506','东兴市','','','东兴市','3','广西壮族自治区','防城港市','东兴市','广西壮族自治区防城港市东兴市',null,null,21.5479200,107.9718800),\n(525406,'450700000000','450000000000','4507','45','钦州市','','钦州市','','2','广西壮族自治区','钦州市','','广西壮族自治区钦州市',null,null,22.1707500,108.5732400),\n(525407,'450701000000','450700000000','450701','4507','市辖区','','','市辖区','3','广西壮族自治区','钦州市','市辖区','广西壮族自治区钦州市市辖区',null,null,22.1707500,108.5732400),\n(525408,'450702000000','450700000000','450702','4507','钦南区','','','钦南区','3','广西壮族自治区','钦州市','钦南区','广西壮族自治区钦州市钦南区',null,null,21.9385400,108.6569000),\n(525601,'450703000000','450700000000','450703','4507','钦北区','','','钦北区','3','广西壮族自治区','钦州市','钦北区','广西壮族自治区钦州市钦北区',null,null,22.1707500,108.5732400),\n(525799,'450721000000','450700000000','450721','4507','灵山县','','','灵山县','3','广西壮族自治区','钦州市','灵山县','广西壮族自治区钦州市灵山县',null,null,22.4165000,109.2909400),\n(526235,'450722000000','450700000000','450722','4507','浦北县','','','浦北县','3','广西壮族自治区','钦州市','浦北县','广西壮族自治区钦州市浦北县',null,null,22.2715200,109.5569800),\n(526527,'450800000000','450000000000','4508','45','贵港市','','贵港市','','2','广西壮族自治区','贵港市','','广西壮族自治区贵港市',null,null,23.1108400,109.5733900),\n(526528,'450801000000','450800000000','450801','4508','市辖区','','','市辖区','3','广西壮族自治区','贵港市','市辖区','广西壮族自治区贵港市市辖区',null,null,23.1108400,109.5733900),\n(526529,'450802000000','450800000000','450802','4508','港北区','','','港北区','3','广西壮族自治区','贵港市','港北区','广西壮族自治区贵港市港北区',null,null,23.1108400,109.5733900),\n(526661,'450803000000','450800000000','450803','4508','港南区','','','港南区','3','广西壮族自治区','贵港市','港南区','广西壮族自治区贵港市港南区',null,null,23.0750400,109.5999600),\n(526838,'450804000000','450800000000','450804','4508','覃塘区','','','覃塘区','3','广西壮族自治区','贵港市','覃塘区','广西壮族自治区贵港市覃塘区',null,null,23.1271800,109.4526900),\n(526995,'450821000000','450800000000','450821','4508','平南县','','','平南县','3','广西壮族自治区','贵港市','平南县','广西壮族自治区贵港市平南县',null,null,23.5391900,110.3921500),\n(527305,'450881000000','450800000000','450881','4508','桂平市','','','桂平市','3','广西壮族自治区','贵港市','桂平市','广西壮族自治区贵港市桂平市',null,null,23.3941000,110.0790100),\n(527764,'450900000000','450000000000','4509','45','玉林市','','玉林市','','2','广西壮族自治区','玉林市','','广西壮族自治区玉林市',null,null,22.5795700,110.0512500),\n(527765,'450901000000','450900000000','450901','4509','市辖区','','','市辖区','3','广西壮族自治区','玉林市','市辖区','广西壮族自治区玉林市市辖区',null,null,22.5795700,110.0512500),\n(527766,'450902000000','450900000000','450902','4509','玉州区','','','玉州区','3','广西壮族自治区','玉林市','玉州区','广西壮族自治区玉林市玉州区',null,null,22.6281100,110.1513300),\n(527884,'450903000000','450900000000','450903','4509','福绵区','','','福绵区','3','广西壮族自治区','玉林市','福绵区','广西壮族自治区玉林市福绵区',null,null,22.5795700,110.0512500),\n(528007,'450921000000','450900000000','450921','4509','容县','','','容县','3','广西壮族自治区','玉林市','容县','广西壮族自治区玉林市容县',null,null,22.8578300,110.5578600),\n(528250,'450922000000','450900000000','450922','4509','陆川县','','','陆川县','3','广西壮族自治区','玉林市','陆川县','广西壮族自治区玉林市陆川县',null,null,22.3210900,110.2641300),\n(528430,'450923000000','450900000000','450923','4509','博白县','','','博白县','3','广西壮族自治区','玉林市','博白县','广西壮族自治区玉林市博白县',null,null,22.2730600,109.9762700),\n(528818,'450924000000','450900000000','450924','4509','兴业县','','','兴业县','3','广西壮族自治区','玉林市','兴业县','广西壮族自治区玉林市兴业县',null,null,22.7363600,109.8751700),\n(529046,'450981000000','450900000000','450981','4509','北流市','','','北流市','3','广西壮族自治区','玉林市','北流市','广西壮族自治区玉林市北流市',null,null,22.7083700,110.3542600),\n(529384,'451000000000','450000000000','4510','45','百色市','','百色市','','2','广西壮族自治区','百色市','','广西壮族自治区百色市',null,null,23.9011500,106.6189700),\n(529385,'451001000000','451000000000','451001','4510','市辖区','','','市辖区','3','广西壮族自治区','百色市','市辖区','广西壮族自治区百色市市辖区',null,null,23.9011500,106.6189700),\n(529386,'451002000000','451000000000','451002','4510','右江区','','','右江区','3','广西壮族自治区','百色市','右江区','广西壮族自治区百色市右江区',null,null,23.9011500,106.6189700),\n(529516,'451021000000','451000000000','451021','4510','田阳县','','','田阳县','3','广西壮族自治区','百色市','田阳县','广西壮族自治区百色市田阳县',null,null,23.7356700,106.9156700),\n(529684,'451022000000','451000000000','451022','4510','田东县','','','田东县','3','广西壮族自治区','百色市','田东县','广西壮族自治区百色市田东县',null,null,23.5972400,107.1260800),\n(529863,'451023000000','451000000000','451023','4510','平果县','','','平果县','3','广西壮族自治区','百色市','平果县','广西壮族自治区百色市平果县',null,null,23.3293400,107.5898800),\n(530059,'451024000000','451000000000','451024','4510','德保县','','','德保县','3','广西壮族自治区','百色市','德保县','广西壮族自治区百色市德保县',null,null,23.3234000,106.6155000),\n(530259,'451026000000','451000000000','451026','4510','那坡县','','','那坡县','3','广西壮族自治区','百色市','那坡县','广西壮族自治区百色市那坡县',null,null,23.3871000,105.8334900),\n(530399,'451027000000','451000000000','451027','4510','凌云县','','','凌云县','3','广西壮族自治区','百色市','凌云县','广西壮族自治区百色市凌云县',null,null,24.3475100,106.5615900),\n(530518,'451028000000','451000000000','451028','4510','乐业县','','','乐业县','3','广西壮族自治区','百色市','乐业县','广西壮族自治区百色市乐业县',null,null,24.7858300,106.5616300),\n(530615,'451029000000','451000000000','451029','4510','田林县','','','田林县','3','广西壮族自治区','百色市','田林县','广西壮族自治区百色市田林县',null,null,24.2943800,106.2285200),\n(530798,'451030000000','451000000000','451030','4510','西林县','','','西林县','3','广西壮族自治区','百色市','西林县','广西壮族自治区百色市西林县',null,null,24.4895700,105.0938300),\n(530904,'451031000000','451000000000','451031','4510','隆林各族自治县','','','隆林各族自治县','3','广西壮族自治区','百色市','隆林各族自治县','广西壮族自治区百色市隆林各族自治县',null,null,24.7706600,105.3438900),\n(531100,'451081000000','451000000000','451081','4510','靖西市','','','靖西市','3','广西壮族自治区','百色市','靖西市','广西壮族自治区百色市靖西市',null,null,23.1340200,106.4176900),\n(531412,'451100000000','450000000000','4511','45','贺州市','','贺州市','','2','广西壮族自治区','贺州市','','广西壮族自治区贺州市',null,null,24.4117500,111.5519700),\n(531413,'451101000000','451100000000','451101','4511','市辖区','','','市辖区','3','广西壮族自治区','贺州市','市辖区','广西壮族自治区贺州市市辖区',null,null,24.4117500,111.5519700),\n(531414,'451102000000','451100000000','451102','4511','八步区','','','八步区','3','广西壮族自治区','贺州市','八步区','广西壮族自治区贺州市八步区',null,null,24.4117500,111.5519700),\n(531633,'451103000000','451100000000','451103','4511','平桂区','','','平桂区','3','广西壮族自治区','贺州市','平桂区','广西壮族自治区贺州市平桂区',null,null,24.4529600,111.4797100),\n(531767,'451121000000','451100000000','451121','4511','昭平县','','','昭平县','3','广西壮族自治区','贺州市','昭平县','广西壮族自治区贺州市昭平县',null,null,24.1694700,110.8113700),\n(531939,'451122000000','451100000000','451122','4511','钟山县','','','钟山县','3','广西壮族自治区','贺州市','钟山县','广西壮族自治区贺州市钟山县',null,null,24.5264000,111.3027800),\n(532068,'451123000000','451100000000','451123','4511','富川瑶族自治县','','','富川瑶族自治县','3','广西壮族自治区','贺州市','富川瑶族自治县','广西壮族自治区贺州市富川瑶族自治县',null,null,24.8143300,111.2775300),\n(532236,'451200000000','450000000000','4512','45','河池市','','河池市','','2','广西壮族自治区','河池市','','广西壮族自治区河池市',null,null,24.6898300,108.0371900),\n(532237,'451201000000','451200000000','451201','4512','市辖区','','','市辖区','3','广西壮族自治区','河池市','市辖区','广西壮族自治区河池市市辖区',null,null,24.6898300,108.0371900),\n(532238,'451202000000','451200000000','451202','4512','金城江区','','','金城江区','3','广西壮族自治区','河池市','金城江区','广西壮族自治区河池市金城江区',null,null,24.6898300,108.0371900),\n(532396,'451203000000','451200000000','451203','4512','宜州区','','','宜州区','3','广西壮族自治区','河池市','宜州区','广西壮族自治区河池市宜州区',null,null,24.4851300,108.6365600),\n(532623,'451221000000','451200000000','451221','4512','南丹县','','','南丹县','3','广西壮族自治区','河池市','南丹县','广西壮族自治区河池市南丹县',null,null,24.9753500,107.5422400),\n(532786,'451222000000','451200000000','451222','4512','天峨县','','','天峨县','3','广西壮族自治区','河池市','天峨县','广西壮族自治区河池市天峨县',null,null,24.9991100,107.1737200),\n(532891,'451223000000','451200000000','451223','4512','凤山县','','','凤山县','3','广西壮族自治区','河池市','凤山县','广西壮族自治区河池市凤山县',null,null,24.5469900,107.0422100),\n(532999,'451224000000','451200000000','451224','4512','东兰县','','','东兰县','3','广西壮族自治区','河池市','东兰县','广西壮族自治区河池市东兰县',null,null,24.5107200,107.3742100),\n(533163,'451225000000','451200000000','451225','4512','罗城仫佬族自治县','','','罗城仫佬族自治县','3','广西壮族自治区','河池市','罗城仫佬族自治县','广西壮族自治区河池市罗城仫佬族自治县',null,null,24.7773900,108.9046500),\n(533318,'451226000000','451200000000','451226','4512','环江毛南族自治县','','','环江毛南族自治县','3','广西壮族自治区','河池市','环江毛南族自治县','广西壮族自治区河池市环江毛南族自治县',null,null,24.8260100,108.2583000),\n(533479,'451227000000','451200000000','451227','4512','巴马瑶族自治县','','','巴马瑶族自治县','3','广西壮族自治区','河池市','巴马瑶族自治县','广西壮族自治区河池市巴马瑶族自治县',null,null,24.1410800,107.2596500),\n(533597,'451228000000','451200000000','451228','4512','都安瑶族自治县','','','都安瑶族自治县','3','广西壮族自治区','河池市','都安瑶族自治县','广西壮族自治区河池市都安瑶族自治县',null,null,23.9312200,108.1055500),\n(533866,'451229000000','451200000000','451229','4512','大化瑶族自治县','','','大化瑶族自治县','3','广西壮族自治区','河池市','大化瑶族自治县','广西壮族自治区河池市大化瑶族自治县',null,null,23.7364000,107.9981400),\n(534041,'451300000000','450000000000','4513','45','来宾市','','来宾市','','2','广西壮族自治区','来宾市','','广西壮族自治区来宾市',null,null,23.7274200,109.2346200),\n(534042,'451301000000','451300000000','451301','4513','市辖区','','','市辖区','3','广西壮族自治区','来宾市','市辖区','广西壮族自治区来宾市市辖区',null,null,23.7274200,109.2346200),\n(534043,'451302000000','451300000000','451302','4513','兴宾区','','','兴宾区','3','广西壮族自治区','来宾市','兴宾区','广西壮族自治区来宾市兴宾区',null,null,23.7274200,109.2346200),\n(534365,'451321000000','451300000000','451321','4513','忻城县','','','忻城县','3','广西壮族自治区','来宾市','忻城县','广西壮族自治区来宾市忻城县',null,null,24.0661700,108.6657500),\n(534508,'451322000000','451300000000','451322','4513','象州县','','','象州县','3','广西壮族自治区','来宾市','象州县','广西壮族自治区来宾市象州县',null,null,23.9737400,109.7052600),\n(534645,'451323000000','451300000000','451323','4513','武宣县','','','武宣县','3','广西壮族自治区','来宾市','武宣县','广西壮族自治区来宾市武宣县',null,null,23.5941400,109.6632500),\n(534808,'451324000000','451300000000','451324','4513','金秀瑶族自治县','','','金秀瑶族自治县','3','广西壮族自治区','来宾市','金秀瑶族自治县','广西壮族自治区来宾市金秀瑶族自治县',null,null,24.1303900,110.1894200),\n(534902,'451381000000','451300000000','451381','4513','合山市','','','合山市','3','广西壮族自治区','来宾市','合山市','广西壮族自治区来宾市合山市',null,null,23.8066000,108.8861100),\n(534942,'451400000000','450000000000','4514','45','崇左市','','崇左市','','2','广西壮族自治区','崇左市','','广西壮族自治区崇左市',null,null,22.4056600,107.3532500),\n(534943,'451401000000','451400000000','451401','4514','市辖区','','','市辖区','3','广西壮族自治区','崇左市','市辖区','广西壮族自治区崇左市市辖区',null,null,22.4056600,107.3532500),\n(534944,'451402000000','451400000000','451402','4514','江州区','','','江州区','3','广西壮族自治区','崇左市','江州区','广西壮族自治区崇左市江州区',null,null,22.4056600,107.3532500),\n(535097,'451421000000','451400000000','451421','4514','扶绥县','','','扶绥县','3','广西壮族自治区','崇左市','扶绥县','广西壮族自治区崇左市扶绥县',null,null,22.6349700,107.9041100),\n(535251,'451422000000','451400000000','451422','4514','宁明县','','','宁明县','3','广西壮族自治区','崇左市','宁明县','广西壮族自治区崇左市宁明县',null,null,22.1401600,107.0767300),\n(535449,'451423000000','451400000000','451423','4514','龙州县','','','龙州县','3','广西壮族自治区','崇左市','龙州县','广西壮族自治区崇左市龙州县',null,null,22.3426200,106.8545500),\n(535590,'451424000000','451400000000','451424','4514','大新县','','','大新县','3','广西壮族自治区','崇左市','大新县','广西壮族自治区崇左市大新县',null,null,22.8304000,107.2012400),\n(535763,'451425000000','451400000000','451425','4514','天等县','','','天等县','3','广西壮族自治区','崇左市','天等县','广西壮族自治区崇左市天等县',null,null,23.0813400,107.1436300),\n(535901,'451481000000','451400000000','451481','4514','凭祥市','','','凭祥市','3','广西壮族自治区','崇左市','凭祥市','广西壮族自治区崇左市凭祥市',null,null,22.0943900,106.7664900),\n(535948,'460000000000','0','46','0','海南省','海南省','','','1','海南省','','','海南省',null,null,null,null),\n(535949,'460100000000','460000000000','4601','46','海口市','','海口市','','2','海南省','海口市','','海南省海口市',null,null,20.0297100,110.3294100),\n(535950,'460101000000','460100000000','460101','4601','市辖区','','','市辖区','3','海南省','海口市','市辖区','海南省海口市市辖区',null,null,20.0297100,110.3294100),\n(535951,'460105000000','460100000000','460105','4601','秀英区','','','秀英区','3','海南省','海口市','秀英区','海南省海口市秀英区',null,null,20.0076000,110.2935700),\n(536055,'460106000000','460100000000','460106','4601','龙华区','','','龙华区','3','海南省','海口市','龙华区','海南省海口市龙华区',null,null,20.0297100,110.3294100),\n(536196,'460107000000','460100000000','460107','4601','琼山区','','','琼山区','3','海南省','海口市','琼山区','海南省海口市琼山区',null,null,20.0039000,110.3543200),\n(536328,'460108000000','460100000000','460108','4601','美兰区','','','美兰区','3','海南省','海口市','美兰区','海南省海口市美兰区',null,null,20.0286400,110.3666300),\n(536468,'460200000000','460000000000','4602','46','三亚市','','三亚市','','2','海南省','三亚市','','海南省三亚市',null,null,18.4000500,109.7525000),\n(536469,'460201000000','460200000000','460201','4602','市辖区','','','市辖区','3','海南省','三亚市','市辖区','海南省三亚市市辖区',null,null,18.4000500,109.7525000),\n(536470,'460202000000','460200000000','460202','4602','海棠区','','','海棠区','3','海南省','三亚市','海棠区','海南省三亚市海棠区',null,null,18.4000500,109.7525000),\n(536495,'460203000000','460200000000','460203','4602','吉阳区','','','吉阳区','3','海南省','三亚市','吉阳区','海南省三亚市吉阳区',null,null,18.2822500,109.5784100),\n(536535,'460204000000','460200000000','460204','4602','天涯区','','','天涯区','3','海南省','三亚市','天涯区','海南省三亚市天涯区',null,null,18.2992100,109.4526300),\n(536592,'460205000000','460200000000','460205','4602','崖州区','','','崖州区','3','海南省','三亚市','崖州区','海南省三亚市崖州区',null,null,18.3575300,109.1718600),\n(536626,'460300000000','460000000000','4603','46','三沙市','','三沙市','','2','海南省','三沙市','','海南省三沙市',null,null,16.8327200,112.3335600),\n(536627,'460321000000','460300000000','460321','4603','西沙群岛','','','西沙群岛','3','海南省','三沙市','西沙群岛','海南省三沙市西沙群岛',null,null,16.3366210,112.0175750),\n(536630,'460322000000','460300000000','460322','4603','南沙群岛','','','南沙群岛','3','海南省','三沙市','南沙群岛','海南省三沙市南沙群岛',null,null,7.7526680,114.2260280),\n(536633,'460323000000','460300000000','460323','4603','中沙群岛的岛礁及其海域','','','中沙群岛的岛礁及其海域','3','海南省','三沙市','中沙群岛的岛礁及其海域','海南省三沙市中沙群岛的岛礁及其海域',null,null,15.1695580,117.8017640),\n(536636,'460400000000','460000000000','4604','46','儋州市','','儋州市','','2','海南省','儋州市','','海南省儋州市',null,null,19.5209300,109.5806900),\n(536637,'469000000000','460000000000','4690','46','省直辖县级行政区划','','省直辖县级行政区划','','2','海南省','省直辖县级行政区划','','海南省省直辖县级行政区划',null,null,null,null),\n(536638,'469001000000','469000000000','469001','4690','五指山市','','','五指山市','3','海南省','省直辖县级行政区划','五指山市','海南省省直辖县级行政区划五指山市',null,null,18.7969490,109.5212480),\n(536721,'469002000000','469000000000','469002','4690','琼海市','','','琼海市','3','海南省','省直辖县级行政区划','琼海市','海南省省直辖县级行政区划琼海市',null,null,19.2503380,110.4685060),\n(536950,'469005000000','469000000000','469005','4690','文昌市','','','文昌市','3','海南省','省直辖县级行政区划','文昌市','海南省省直辖县级行政区划文昌市',null,null,19.9724010,110.6397710),\n(537273,'469006000000','469000000000','469006','4690','万宁市','','','万宁市','3','海南省','省直辖县级行政区划','万宁市','海南省省直辖县级行政区划万宁市',null,null,18.7977500,110.3882290),\n(537524,'469007000000','469000000000','469007','4690','东方市','','','东方市','3','海南省','省直辖县级行政区划','东方市','海南省省直辖县级行政区划东方市',null,null,19.0962890,108.6840440),\n(537741,'469021000000','469000000000','469021','4690','定安县','','','定安县','3','海南省','省直辖县级行政区划','定安县','海南省省直辖县级行政区划定安县',null,null,19.4372900,110.2133480),\n(537882,'469022000000','469000000000','469022','4690','屯昌县','','','屯昌县','3','海南省','省直辖县级行政区划','屯昌县','海南省省直辖县级行政区划屯昌县',null,null,19.3652590,110.1020970),\n(538015,'469023000000','469000000000','469023','4690','澄迈县','','','澄迈县','3','海南省','省直辖县级行政区划','澄迈县','海南省省直辖县级行政区划澄迈县',null,null,19.7414800,110.0044020),\n(538225,'469024000000','469000000000','469024','4690','临高县','','','临高县','3','海南省','省直辖县级行政区划','临高县','海南省省直辖县级行政区划临高县',null,null,19.8922290,109.5334470),\n(538428,'469025000000','469000000000','469025','4690','白沙黎族自治县','','','白沙黎族自治县','3','海南省','省直辖县级行政区划','白沙黎族自治县','海南省省直辖县级行政区划白沙黎族自治县',null,null,19.2163110,109.4503710),\n(538532,'469026000000','469000000000','469026','4690','昌江黎族自治县','','','昌江黎族自治县','3','海南省','省直辖县级行政区划','昌江黎族自治县','海南省省直辖县级行政区划昌江黎族自治县',null,null,19.2767300,109.0608600),\n(538640,'469027000000','469000000000','469027','4690','乐东黎族自治县','','','乐东黎族自治县','3','海南省','省直辖县级行政区划','乐东黎族自治县','海南省省直辖县级行政区划乐东黎族自治县',null,null,18.5792060,108.7350620),\n(538852,'469028000000','469000000000','469028','4690','陵水黎族自治县','','','陵水黎族自治县','3','海南省','省直辖县级行政区划','陵水黎族自治县','海南省省直辖县级行政区划陵水黎族自治县',null,null,18.5016310,110.0247340),\n(538985,'469029000000','469000000000','469029','4690','保亭黎族苗族自治县','','','保亭黎族苗族自治县','3','海南省','省直辖县级行政区划','保亭黎族苗族自治县','海南省省直辖县级行政区划保亭黎族苗族自治县',null,null,18.6942010,109.6759490),\n(539071,'469030000000','469000000000','469030','4690','琼中黎族苗族自治县','','','琼中黎族苗族自治县','3','海南省','省直辖县级行政区划','琼中黎族苗族自治县','海南省省直辖县级行政区划琼中黎族苗族自治县',null,null,19.0447900,109.9244540),\n(539211,'500000000000','0','50','0','重庆市','重庆市','','','1','重庆市','','','重庆市',null,null,29.4026800,106.5404100),\n(539212,'500100000000','500000000000','5001','50','市辖区','','市辖区','','2','重庆市','市辖区','','重庆市市辖区',null,null,29.4026800,106.5404100),\n(539213,'500101000000','500100000000','500101','5001','万州区','','','万州区','3','重庆市','市辖区','万州区','重庆市市辖区万州区',null,null,30.8079000,108.4087300),\n(539901,'500102000000','500100000000','500102','5001','涪陵区','','','涪陵区','3','重庆市','市辖区','涪陵区','重庆市市辖区涪陵区',null,null,29.7023900,107.3877900),\n(540351,'500103000000','500100000000','500103','5001','渝中区','','','渝中区','3','重庆市','市辖区','渝中区','重庆市市辖区渝中区',null,null,29.5531400,106.5686000),\n(540441,'500104000000','500100000000','500104','5001','大渡口区','','','大渡口区','3','重庆市','市辖区','大渡口区','重庆市市辖区大渡口区',null,null,29.4840800,106.4822500),\n(540542,'500105000000','500100000000','500105','5001','江北区','','','江北区','3','重庆市','市辖区','江北区','重庆市市辖区江北区',null,null,29.6066100,106.5743900),\n(540686,'500106000000','500100000000','500106','5001','沙坪坝区','','','沙坪坝区','3','重庆市','市辖区','沙坪坝区','重庆市市辖区沙坪坝区',null,null,29.5409800,106.4577300),\n(540908,'500107000000','500100000000','500107','5001','九龙坡区','','','九龙坡区','3','重庆市','市辖区','九龙坡区','重庆市市辖区九龙坡区',null,null,29.5020700,106.5114000),\n(541146,'500108000000','500100000000','500108','5001','南岸区','','','南岸区','3','重庆市','市辖区','南岸区','重庆市市辖区南岸区',null,null,29.5216800,106.5625600),\n(541315,'500109000000','500100000000','500109','5001','北碚区','','','北碚区','3','重庆市','市辖区','北碚区','重庆市市辖区北碚区',null,null,29.8058300,106.3962800),\n(541524,'500110000000','500100000000','500110','5001','綦江区','','','綦江区','3','重庆市','市辖区','綦江区','重庆市市辖区綦江区',null,null,28.9646300,106.9285200),\n(542035,'500111000000','500100000000','500111','5001','大足区','','','大足区','3','重庆市','市辖区','大足区','重庆市市辖区大足区',null,null,29.4860400,105.7801700),\n(542372,'500112000000','500100000000','500112','5001','渝北区','','','渝北区','3','重庆市','市辖区','渝北区','重庆市市辖区渝北区',null,null,29.7179800,106.6304300),\n(542804,'500113000000','500100000000','500113','5001','巴南区','','','巴南区','3','重庆市','市辖区','巴南区','重庆市市辖区巴南区',null,null,29.4026800,106.5404100),\n(543127,'500114000000','500100000000','500114','5001','黔江区','','','黔江区','3','重庆市','市辖区','黔江区','重庆市市辖区黔江区',null,null,29.5334800,108.7707900),\n(543377,'500115000000','500100000000','500115','5001','长寿区','','','长寿区','3','重庆市','市辖区','长寿区','重庆市市辖区长寿区',null,null,29.8578100,107.0810500),\n(543661,'500116000000','500100000000','500116','5001','江津区','','','江津区','3','重庆市','市辖区','江津区','重庆市市辖区江津区',null,null,29.2901400,106.2593600),\n(543969,'500117000000','500100000000','500117','5001','合川区','','','合川区','3','重庆市','市辖区','合川区','重庆市市辖区合川区',null,null,29.9728800,106.2767900),\n(544415,'500118000000','500100000000','500118','5001','永川区','','','永川区','3','重庆市','市辖区','永川区','重庆市市辖区永川区',null,null,29.3560000,105.9270900),\n(544700,'500119000000','500100000000','500119','5001','南川区','','','南川区','3','重庆市','市辖区','南川区','重庆市市辖区南川区',null,null,29.1578800,107.0989600),\n(544979,'500120000000','500100000000','500120','5001','璧山区','','','璧山区','3','重庆市','市辖区','璧山区','重庆市市辖区璧山区',null,null,29.5920200,106.2274200),\n(545182,'500151000000','500100000000','500151','5001','铜梁区','','','铜梁区','3','重庆市','市辖区','铜梁区','重庆市市辖区铜梁区',null,null,29.8447500,106.0563800),\n(545544,'500152000000','500100000000','500152','5001','潼南区','','','潼南区','3','重庆市','市辖区','潼南区','重庆市市辖区潼南区',null,null,30.1905400,105.8395200),\n(545871,'500153000000','500100000000','500153','5001','荣昌区','','','荣昌区','3','重庆市','市辖区','荣昌区','重庆市市辖区荣昌区',null,null,29.4167100,105.6118800),\n(546060,'500154000000','500100000000','500154','5001','开州区','','','开州区','3','重庆市','市辖区','开州区','重庆市市辖区开州区',null,null,31.1609800,108.3931100),\n(546635,'500155000000','500100000000','500155','5001','梁平区','','','梁平区','3','重庆市','市辖区','梁平区','重庆市市辖区梁平区',null,null,30.6737300,107.8023500),\n(547016,'500156000000','500100000000','500156','5001','武隆区','','','武隆区','3','重庆市','市辖区','武隆区','重庆市市辖区武隆区',null,null,29.3254300,107.7599300),\n(547253,'500200000000','500000000000','5002','50','县','','县','','2','重庆市','县','','重庆市县',null,null,29.4026800,106.5404100),\n(547254,'500229000000','500200000000','500229','5002','城口县','','','城口县','3','重庆市','县','城口县','重庆市县城口县',null,null,31.9476700,108.6643300),\n(547484,'500230000000','500200000000','500230','5002','丰都县','','','丰都县','3','重庆市','县','丰都县','重庆市县丰都县',null,null,29.8635200,107.7308500),\n(547845,'500231000000','500200000000','500231','5002','垫江县','','','垫江县','3','重庆市','县','垫江县','重庆市县垫江县',null,null,30.3268000,107.3351500),\n(548173,'500233000000','500200000000','500233','5002','忠县','','','忠县','3','重庆市','县','忠县','重庆市县忠县',null,null,30.3002600,108.0376700),\n(548571,'500235000000','500200000000','500235','5002','云阳县','','','云阳县','3','重庆市','县','云阳县','重庆市县云阳县',null,null,30.9306300,108.6969800),\n(549092,'500236000000','500200000000','500236','5002','奉节县','','','奉节县','3','重庆市','县','奉节县','重庆市县奉节县',null,null,31.0184600,109.4640600),\n(549515,'500237000000','500200000000','500237','5002','巫山县','','','巫山县','3','重庆市','县','巫山县','重庆市县巫山县',null,null,31.0746200,109.8788000),\n(549883,'500238000000','500200000000','500238','5002','巫溪县','','','巫溪县','3','重庆市','县','巫溪县','重庆市县巫溪县',null,null,31.3986000,109.5701600),\n(550247,'500240000000','500200000000','500240','5002','石柱土家族自治县','','','石柱土家族自治县','3','重庆市','县','石柱土家族自治县','重庆市县石柱土家族自治县',null,null,29.9996800,108.1141500),\n(550523,'500241000000','500200000000','500241','5002','秀山土家族苗族自治县','','','秀山土家族苗族自治县','3','重庆市','县','秀山土家族苗族自治县','重庆市县秀山土家族苗族自治县',null,null,28.4483200,109.0071400),\n(550819,'500242000000','500200000000','500242','5002','酉阳土家族苗族自治县','','','酉阳土家族苗族自治县','3','重庆市','县','酉阳土家族苗族自治县','重庆市县酉阳土家族苗族自治县',null,null,28.8412600,108.7677800),\n(551137,'500243000000','500200000000','500243','5002','彭水苗族土家族自治县','','','彭水苗族土家族自治县','3','重庆市','县','彭水苗族土家族自治县','重庆市县彭水苗族土家族自治县',null,null,29.2937600,108.1655500),\n(551473,'510000000000','0','51','0','四川省','四川省','','','1','四川省','','','四川省',null,null,null,null),\n(551474,'510100000000','510000000000','5101','51','成都市','','成都市','','2','四川省','成都市','','四川省成都市',null,null,30.6598400,104.1019400),\n(551475,'510101000000','510100000000','510101','5101','市辖区','','','市辖区','3','四川省','成都市','市辖区','四川省成都市市辖区',null,null,30.6598400,104.1019400),\n(551476,'510104000000','510100000000','510104','5101','锦江区','','','锦江区','3','四川省','成都市','锦江区','四川省成都市锦江区',null,null,30.6561800,104.0832900),\n(551582,'510105000000','510100000000','510105','5101','青羊区','','','青羊区','3','四川省','成都市','青羊区','四川省成都市青羊区',null,null,30.6748500,104.0629100),\n(551676,'510106000000','510100000000','510106','5101','金牛区','','','金牛区','3','四川省','成都市','金牛区','四川省成都市金牛区',null,null,30.6901500,104.0529300),\n(551802,'510107000000','510100000000','510107','5101','武侯区','','','武侯区','3','四川省','成都市','武侯区','四川省成都市武侯区',null,null,30.6424200,104.0431100),\n(551951,'510108000000','510100000000','510108','5101','成华区','','','成华区','3','四川省','成都市','成华区','四川省成都市成华区',null,null,30.6598400,104.1019400),\n(552069,'510112000000','510100000000','510112','5101','龙泉驿区','','','龙泉驿区','3','四川省','成都市','龙泉驿区','四川省成都市龙泉驿区',null,null,30.5566300,104.2747100),\n(552226,'510113000000','510100000000','510113','5101','青白江区','','','青白江区','3','四川省','成都市','青白江区','四川省成都市青白江区',null,null,30.8784900,104.2512200),\n(552362,'510114000000','510100000000','510114','5101','新都区','','','新都区','3','四川省','成都市','新都区','四川省成都市新都区',null,null,30.8240400,104.1580100),\n(552631,'510115000000','510100000000','510115','5101','温江区','','','温江区','3','四川省','成都市','温江区','四川省成都市温江区',null,null,30.6814400,103.8559000),\n(552758,'510116000000','510100000000','510116','5101','双流区','','','双流区','3','四川省','成都市','双流区','四川省成都市双流区',null,null,30.5744700,103.9237700),\n(553077,'510117000000','510100000000','510117','5101','郫都区','','','郫都区','3','四川省','成都市','郫都区','四川省成都市郫都区',null,null,30.7958900,103.9025600),\n(553314,'510121000000','510100000000','510121','5101','金堂县','','','金堂县','3','四川省','成都市','金堂县','四川省成都市金堂县',null,null,30.8620300,104.4120500),\n(553568,'510129000000','510100000000','510129','5101','大邑县','','','大邑县','3','四川省','成都市','大邑县','四川省成都市大邑县',null,null,30.5875900,103.5207100),\n(553807,'510131000000','510100000000','510131','5101','蒲江县','','','蒲江县','3','四川省','成都市','蒲江县','四川省成都市蒲江县',null,null,30.1967600,103.5062800),\n(553954,'510132000000','510100000000','510132','5101','新津县','','','新津县','3','四川省','成都市','新津县','四川省成都市新津县',null,null,30.4102600,103.8116500),\n(554073,'510181000000','510100000000','510181','5101','都江堰市','','','都江堰市','3','四川省','成都市','都江堰市','四川省成都市都江堰市',null,null,30.9883700,103.6466200),\n(554349,'510182000000','510100000000','510182','5101','彭州市','','','彭州市','3','四川省','成都市','彭州市','四川省成都市彭州市',null,null,30.9901800,103.9581100),\n(554725,'510183000000','510100000000','510183','5101','邛崃市','','','邛崃市','3','四川省','成都市','邛崃市','四川省成都市邛崃市',null,null,30.4103200,103.4643600),\n(555021,'510184000000','510100000000','510184','5101','崇州市','','','崇州市','3','四川省','成都市','崇州市','四川省成都市崇州市',null,null,30.6302100,103.6728900),\n(555300,'510185000000','510100000000','510185','5101','简阳市','','','简阳市','3','四川省','成都市','简阳市','四川省成都市简阳市',null,null,30.4113300,104.5473300),\n(556213,'510300000000','510000000000','5103','51','自贡市','','自贡市','','2','四川省','自贡市','','四川省自贡市',null,null,29.3637100,104.7739000),\n(556214,'510301000000','510300000000','510301','5103','市辖区','','','市辖区','3','四川省','自贡市','市辖区','四川省自贡市市辖区',null,null,29.3637100,104.7739000),\n(556215,'510302000000','510300000000','510302','5103','自流井区','','','自流井区','3','四川省','自贡市','自流井区','四川省自贡市自流井区',null,null,29.3374000,104.7772800),\n(556351,'510303000000','510300000000','510303','5103','贡井区','','','贡井区','3','四川省','自贡市','贡井区','四川省自贡市贡井区',null,null,29.3457600,104.7152600),\n(556547,'510304000000','510300000000','510304','5103','大安区','','','大安区','3','四川省','自贡市','大安区','四川省自贡市大安区',null,null,29.3637100,104.7739000),\n(556754,'510311000000','510300000000','510311','5103','沿滩区','','','沿滩区','3','四川省','自贡市','沿滩区','四川省自贡市沿滩区',null,null,29.2723400,104.8742300),\n(556961,'510321000000','510300000000','510321','5103','荣县','','','荣县','3','四川省','自贡市','荣县','四川省自贡市荣县',null,null,29.4445000,104.4176600),\n(557336,'510322000000','510300000000','510322','5103','富顺县','','','富顺县','3','四川省','自贡市','富顺县','四川省自贡市富顺县',null,null,29.1802100,104.9751200),\n(557751,'510400000000','510000000000','5104','51','攀枝花市','','攀枝花市','','2','四川省','攀枝花市','','四川省攀枝花市',null,null,26.5463900,101.7041300),\n(557752,'510401000000','510400000000','510401','5104','市辖区','','','市辖区','3','四川省','攀枝花市','市辖区','四川省攀枝花市市辖区',null,null,26.5463900,101.7041300),\n(557753,'510402000000','510400000000','510402','5104','东区','','','东区','3','四川省','攀枝花市','东区','四川省攀枝花市东区',null,null,26.5463900,101.7041300),\n(557833,'510403000000','510400000000','510403','5104','西区','','','西区','3','四川省','攀枝花市','西区','四川省攀枝花市西区',null,null,26.5975700,101.6306400),\n(557883,'510411000000','510400000000','510411','5104','仁和区','','','仁和区','3','四川省','攀枝花市','仁和区','四川省攀枝花市仁和区',null,null,26.4977800,101.7386600),\n(557999,'510421000000','510400000000','510421','5104','米易县','','','米易县','3','四川省','攀枝花市','米易县','四川省攀枝花市米易县',null,null,26.8906700,102.1102400),\n(558111,'510422000000','510400000000','510422','5104','盐边县','','','盐边县','3','四川省','攀枝花市','盐边县','四川省攀枝花市盐边县',null,null,26.6826500,101.8539300),\n(558300,'510500000000','510000000000','5105','51','泸州市','','泸州市','','2','四川省','泸州市','','四川省泸州市',null,null,28.8787500,105.4350100),\n(558301,'510501000000','510500000000','510501','5105','市辖区','','','市辖区','3','四川省','泸州市','市辖区','四川省泸州市市辖区',null,null,28.8787500,105.4350100),\n(558302,'510502000000','510500000000','510502','5105','江阳区','','','江阳区','3','四川省','泸州市','江阳区','四川省泸州市江阳区',null,null,28.8787500,105.4350100),\n(558479,'510503000000','510500000000','510503','5105','纳溪区','','','纳溪区','3','四川省','泸州市','纳溪区','四川省泸州市纳溪区',null,null,28.7731300,105.3713100),\n(558698,'510504000000','510500000000','510504','5105','龙马潭区','','','龙马潭区','3','四川省','泸州市','龙马潭区','四川省泸州市龙马潭区',null,null,28.9131800,105.4377900),\n(558801,'510521000000','510500000000','510521','5105','泸县','','','泸县','3','四川省','泸州市','泸县','四川省泸州市泸县',null,null,29.1516000,105.3818500),\n(559127,'510522000000','510500000000','510522','5105','合江县','','','合江县','3','四川省','泸州市','合江县','四川省泸州市合江县',null,null,28.8114700,105.8313500),\n(559482,'510524000000','510500000000','510524','5105','叙永县','','','叙永县','3','四川省','泸州市','叙永县','四川省泸州市叙永县',null,null,28.1558800,105.4447500),\n(559772,'510525000000','510500000000','510525','5105','古蔺县','','','古蔺县','3','四川省','泸州市','古蔺县','四川省泸州市古蔺县',null,null,28.0388400,105.8123900),\n(560092,'510600000000','510000000000','5106','51','德阳市','','德阳市','','2','四川省','德阳市','','四川省德阳市',null,null,31.1426300,104.4170200),\n(560093,'510601000000','510600000000','510601','5106','市辖区','','','市辖区','3','四川省','德阳市','市辖区','四川省德阳市市辖区',null,null,31.1426300,104.4170200),\n(560094,'510603000000','510600000000','510603','5106','旌阳区','','','旌阳区','3','四川省','德阳市','旌阳区','四川省德阳市旌阳区',null,null,31.1426300,104.4170200),\n(560342,'510604000000','510600000000','510604','5106','罗江区','','','罗江区','3','四川省','德阳市','罗江区','四川省德阳市罗江区',null,null,31.3168100,104.5102100),\n(560480,'510623000000','510600000000','510623','5106','中江县','','','中江县','3','四川省','德阳市','中江县','四川省德阳市中江县',null,null,31.0330400,104.6787200),\n(561363,'510681000000','510600000000','510681','5106','广汉市','','','广汉市','3','四川省','德阳市','广汉市','四川省德阳市广汉市',null,null,30.9770600,104.2824900),\n(561605,'510682000000','510600000000','510682','5106','什邡市','','','什邡市','3','四川省','德阳市','什邡市','四川省德阳市什邡市',null,null,31.1273600,104.1669400),\n(561793,'510683000000','510600000000','510683','5106','绵竹市','','','绵竹市','3','四川省','德阳市','绵竹市','四川省德阳市绵竹市',null,null,31.3377600,104.2208300),\n(562022,'510700000000','510000000000','5107','51','绵阳市','','绵阳市','','2','四川省','绵阳市','','四川省绵阳市',null,null,31.5347400,104.5675600),\n(562023,'510701000000','510700000000','510701','5107','市辖区','','','市辖区','3','四川省','绵阳市','市辖区','四川省绵阳市市辖区',null,null,31.5347400,104.5675600),\n(562024,'510703000000','510700000000','510703','5107','涪城区','','','涪城区','3','四川省','绵阳市','涪城区','四川省绵阳市涪城区',null,null,31.4549800,104.7570800),\n(562302,'510704000000','510700000000','510704','5107','游仙区','','','游仙区','3','四川省','绵阳市','游仙区','四川省绵阳市游仙区',null,null,31.4736700,104.7667000),\n(562650,'510705000000','510700000000','510705','5107','安州区','','','安州区','3','四川省','绵阳市','安州区','四川省绵阳市安州区',null,null,31.5347400,104.5675600),\n(562930,'510722000000','510700000000','510722','5107','三台县','','','三台县','3','四川省','绵阳市','三台县','四川省绵阳市三台县',null,null,31.0956300,105.0945900),\n(564036,'510723000000','510700000000','510723','5107','盐亭县','','','盐亭县','3','四川省','绵阳市','盐亭县','四川省绵阳市盐亭县',null,null,31.2081900,105.3899600),\n(564592,'510725000000','510700000000','510725','5107','梓潼县','','','梓潼县','3','四川省','绵阳市','梓潼县','四川省绵阳市梓潼县',null,null,31.6352900,105.1611800),\n(564974,'510726000000','510700000000','510726','5107','北川羌族自治县','','','北川羌族自治县','3','四川省','绵阳市','北川羌族自治县','四川省绵阳市北川羌族自治县',null,null,31.8914800,104.3075500),\n(565341,'510727000000','510700000000','510727','5107','平武县','','','平武县','3','四川省','绵阳市','平武县','四川省绵阳市平武县',null,null,32.4085800,104.5290400),\n(565631,'510781000000','510700000000','510781','5107','江油市','','','江油市','3','四川省','绵阳市','江油市','四川省绵阳市江油市',null,null,31.7569100,104.7245800),\n(566135,'510800000000','510000000000','5108','51','广元市','','广元市','','2','四川省','广元市','','四川省广元市',null,null,32.6440900,105.8903400),\n(566136,'510801000000','510800000000','510801','5108','市辖区','','','市辖区','3','四川省','广元市','市辖区','四川省广元市市辖区',null,null,32.6440900,105.8903400),\n(566137,'510802000000','510800000000','510802','5108','利州区','','','利州区','3','四川省','广元市','利州区','四川省广元市利州区',null,null,32.4339600,105.8455900),\n(566413,'510811000000','510800000000','510811','5108','昭化区','','','昭化区','3','四川省','广元市','昭化区','四川省广元市昭化区',null,null,32.3232000,105.9630400),\n(566679,'510812000000','510800000000','510812','5108','朝天区','','','朝天区','3','四川省','广元市','朝天区','四川省广元市朝天区',null,null,32.6440900,105.8903400),\n(566926,'510821000000','510800000000','510821','5108','旺苍县','','','旺苍县','3','四川省','广元市','旺苍县','四川省广元市旺苍县',null,null,32.2291000,106.2897400),\n(567360,'510822000000','510800000000','510822','5108','青川县','','','青川县','3','四川省','广元市','青川县','四川省广元市青川县',null,null,32.5841000,105.2382200),\n(567708,'510823000000','510800000000','510823','5108','剑阁县','','','剑阁县','3','四川省','广元市','剑阁县','四川省广元市剑阁县',null,null,32.2884900,105.5252600),\n(568345,'510824000000','510800000000','510824','5108','苍溪县','','','苍溪县','3','四川省','广元市','苍溪县','四川省广元市苍溪县',null,null,31.7324400,105.9344200),\n(569196,'510900000000','510000000000','5109','51','遂宁市','','遂宁市','','2','四川省','遂宁市','','四川省遂宁市',null,null,30.3554100,105.4563600),\n(569197,'510901000000','510900000000','510901','5109','市辖区','','','市辖区','3','四川省','遂宁市','市辖区','四川省遂宁市市辖区',null,null,30.3554100,105.4563600),\n(569198,'510903000000','510900000000','510903','5109','船山区','','','船山区','3','四川省','遂宁市','船山区','四川省遂宁市船山区',null,null,30.5255200,105.5682100),\n(569525,'510904000000','510900000000','510904','5109','安居区','','','安居区','3','四川省','遂宁市','安居区','四川省遂宁市安居区',null,null,30.3554100,105.4563600),\n(570073,'510921000000','510900000000','510921','5109','蓬溪县','','','蓬溪县','3','四川省','遂宁市','蓬溪县','四川省遂宁市蓬溪县',null,null,30.7577800,105.7075600),\n(570657,'510922000000','510900000000','510922','5109','射洪县','','','射洪县','3','四川省','遂宁市','射洪县','四川省遂宁市射洪县',null,null,30.8711300,105.3883600),\n(571346,'510923000000','510900000000','510923','5109','大英县','','','大英县','3','四川省','遂宁市','大英县','四川省遂宁市大英县',null,null,30.5945000,105.2364900),\n(571694,'511000000000','510000000000','5110','51','内江市','','内江市','','2','四川省','内江市','','四川省内江市',null,null,29.5934600,105.0745900),\n(571695,'511001000000','511000000000','511001','5110','市辖区','','','市辖区','3','四川省','内江市','市辖区','四川省内江市市辖区',null,null,29.5934600,105.0745900),\n(571696,'511002000000','511000000000','511002','5110','市中区','','','市中区','3','四川省','内江市','市中区','四川省内江市市中区',null,null,29.5869800,105.0677600),\n(571915,'511011000000','511000000000','511011','5110','东兴区','','','东兴区','3','四川省','内江市','东兴区','四川省内江市东兴区',null,null,29.5934600,105.0745900),\n(572435,'511024000000','511000000000','511024','5110','威远县','','','威远县','3','四川省','内江市','威远县','四川省内江市威远县',null,null,29.5274200,104.6688500),\n(572830,'511025000000','511000000000','511025','5110','资中县','','','资中县','3','四川省','内江市','资中县','四川省内江市资中县',null,null,29.7641600,104.8521200),\n(573704,'511071000000','511000000000','511071','5110','内江经济开发区','','','内江经济开发区','3','四川省','内江市','内江经济开发区','四川省内江市内江经济开发区',null,null,29.5835690,105.0185620),\n(573735,'511083000000','511000000000','511083','5110','隆昌市','','','隆昌市','3','四川省','内江市','隆昌市','四川省内江市隆昌市',null,null,29.3394800,105.2877300),\n(574168,'511100000000','510000000000','5111','51','乐山市','','乐山市','','2','四川省','乐山市','','四川省乐山市',null,null,29.2444700,103.0787900),\n(574169,'511101000000','511100000000','511101','5111','市辖区','','','市辖区','3','四川省','乐山市','市辖区','四川省乐山市市辖区',null,null,29.2444700,103.0787900),\n(574170,'511102000000','511100000000','511102','5111','市中区','','','市中区','3','四川省','乐山市','市中区','四川省乐山市市中区',null,null,29.5554400,103.7612000),\n(574493,'511111000000','511100000000','511111','5111','沙湾区','','','沙湾区','3','四川省','乐山市','沙湾区','四川省乐山市沙湾区',null,null,29.4130600,103.5502700),\n(574656,'511112000000','511100000000','511112','5111','五通桥区','','','五通桥区','3','四川省','乐山市','五通桥区','四川省乐山市五通桥区',null,null,29.4072600,103.8184600),\n(574841,'511113000000','511100000000','511113','5111','金口河区','','','金口河区','3','四川省','乐山市','金口河区','四川省乐山市金口河区',null,null,29.2444700,103.0787900),\n(574893,'511123000000','511100000000','511123','5111','犍为县','','','犍为县','3','四川省','乐山市','犍为县','四川省乐山市犍为县',null,null,29.2082800,103.9493100),\n(575313,'511124000000','511100000000','511124','5111','井研县','','','井研县','3','四川省','乐山市','井研县','四川省乐山市井研县',null,null,29.6530500,104.0648200),\n(575572,'511126000000','511100000000','511126','5111','夹江县','','','夹江县','3','四川省','乐山市','夹江县','四川省乐山市夹江县',null,null,29.7375300,103.5715600),\n(575842,'511129000000','511100000000','511129','5111','沐川县','','','沐川县','3','四川省','乐山市','沐川县','四川省乐山市沐川县',null,null,28.9567300,103.9024100),\n(576075,'511132000000','511100000000','511132','5111','峨边彝族自治县','','','峨边彝族自治县','3','四川省','乐山市','峨边彝族自治县','四川省乐山市峨边彝族自治县',null,null,29.2304700,103.2620200),\n(576233,'511133000000','511100000000','511133','5111','马边彝族自治县','','','马边彝族自治县','3','四川省','乐山市','马边彝族自治县','四川省乐山市马边彝族自治县',null,null,28.8355700,103.5463500),\n(576377,'511181000000','511100000000','511181','5111','峨眉山市','','','峨眉山市','3','四川省','乐山市','峨眉山市','四川省乐山市峨眉山市',null,null,29.6012500,103.4844700),\n(576670,'511300000000','510000000000','5113','51','南充市','','南充市','','2','四川省','南充市','','四川省南充市',null,null,30.7815400,106.1187700),\n(576671,'511301000000','511300000000','511301','5113','市辖区','','','市辖区','3','四川省','南充市','市辖区','四川省南充市市辖区',null,null,30.7815400,106.1187700),\n(576672,'511302000000','511300000000','511302','5113','顺庆区','','','顺庆区','3','四川省','南充市','顺庆区','四川省南充市顺庆区',null,null,30.7965300,106.0922400),\n(577019,'511303000000','511300000000','511303','5113','高坪区','','','高坪区','3','四川省','南充市','高坪区','四川省南充市高坪区',null,null,30.7815400,106.1187700),\n(577451,'511304000000','511300000000','511304','5113','嘉陵区','','','嘉陵区','3','四川省','南充市','嘉陵区','四川省南充市嘉陵区',null,null,30.7587400,106.0717600),\n(578089,'511321000000','511300000000','511321','5113','南部县','','','南部县','3','四川省','南充市','南部县','四川省南充市南部县',null,null,31.3531600,106.0673400),\n(579282,'511322000000','511300000000','511322','5113','营山县','','','营山县','3','四川省','南充市','营山县','四川省南充市营山县',null,null,31.0767000,106.5655300),\n(580021,'511323000000','511300000000','511323','5113','蓬安县','','','蓬安县','3','四川省','南充市','蓬安县','四川省南充市蓬安县',null,null,31.0286000,106.4123000),\n(580710,'511324000000','511300000000','511324','5113','仪陇县','','','仪陇县','3','四川省','南充市','仪陇县','四川省南充市仪陇县',null,null,31.2699800,106.3033000),\n(581704,'511325000000','511300000000','511325','5113','西充县','','','西充县','3','四川省','南充市','西充县','四川省南充市西充县',null,null,30.9952600,105.9008600),\n(582370,'511381000000','511300000000','511381','5113','阆中市','','','阆中市','3','四川省','南充市','阆中市','四川省南充市阆中市',null,null,31.5583700,106.0049900),\n(582935,'511400000000','510000000000','5114','51','眉山市','','眉山市','','2','四川省','眉山市','','四川省眉山市',null,null,30.0422800,103.8321100),\n(582936,'511401000000','511400000000','511401','5114','市辖区','','','市辖区','3','四川省','眉山市','市辖区','四川省眉山市市辖区',null,null,30.0422800,103.8321100),\n(582937,'511402000000','511400000000','511402','5114','东坡区','','','东坡区','3','四川省','眉山市','东坡区','四川省眉山市东坡区',null,null,30.0422800,103.8321100),\n(583275,'511403000000','511400000000','511403','5114','彭山区','','','彭山区','3','四川省','眉山市','彭山区','四川省眉山市彭山区',null,null,30.1929900,103.8728300),\n(583397,'511421000000','511400000000','511421','5114','仁寿县','','','仁寿县','3','四川省','眉山市','仁寿县','四川省眉山市仁寿县',null,null,29.9957200,104.1340700),\n(584076,'511423000000','511400000000','511423','5114','洪雅县','','','洪雅县','3','四川省','眉山市','洪雅县','四川省眉山市洪雅县',null,null,29.9049600,103.3728800),\n(584251,'511424000000','511400000000','511424','5114','丹棱县','','','丹棱县','3','四川省','眉山市','丹棱县','四川省眉山市丹棱县',null,null,30.0145300,103.5128400),\n(584337,'511425000000','511400000000','511425','5114','青神县','','','青神县','3','四川省','眉山市','青神县','四川省眉山市青神县',null,null,29.8315000,103.8465600),\n(584437,'511500000000','510000000000','5115','51','宜宾市','','宜宾市','','2','四川省','宜宾市','','四川省宜宾市',null,null,28.7659300,104.6194700),\n(584438,'511501000000','511500000000','511501','5115','市辖区','','','市辖区','3','四川省','宜宾市','市辖区','四川省宜宾市市辖区',null,null,28.7659300,104.6194700),\n(584439,'511502000000','511500000000','511502','5115','翠屏区','','','翠屏区','3','四川省','宜宾市','翠屏区','四川省宜宾市翠屏区',null,null,28.7659300,104.6194700),\n(584810,'511503000000','511500000000','511503','5115','南溪区','','','南溪区','3','四川省','宜宾市','南溪区','四川省宜宾市南溪区',null,null,28.8454800,104.9695300),\n(585067,'511521000000','511500000000','511521','5115','宜宾县','','','宜宾县','3','四川省','宜宾市','宜宾县','四川省宜宾市宜宾县',null,null,28.6899800,104.5331600),\n(585684,'511523000000','511500000000','511523','5115','江安县','','','江安县','3','四川省','宜宾市','江安县','四川省宜宾市江安县',null,null,28.7238900,105.0668800),\n(586027,'511524000000','511500000000','511524','5115','长宁县','','','长宁县','3','四川省','宜宾市','长宁县','四川省宜宾市长宁县',null,null,28.5822700,104.9211000),\n(586345,'511525000000','511500000000','511525','5115','高县','','','高县','3','四川省','宜宾市','高县','四川省宜宾市高县',null,null,28.4362200,104.5176000),\n(586682,'511526000000','511500000000','511526','5115','珙县','','','珙县','3','四川省','宜宾市','珙县','四川省宜宾市珙县',null,null,28.4388500,104.7087800),\n(586963,'511527000000','511500000000','511527','5115','筠连县','','','筠连县','3','四川省','宜宾市','筠连县','四川省宜宾市筠连县',null,null,28.1641800,104.5118500),\n(587242,'511528000000','511500000000','511528','5115','兴文县','','','兴文县','3','四川省','宜宾市','兴文县','四川省宜宾市兴文县',null,null,28.3036100,105.2364600),\n(587517,'511529000000','511500000000','511529','5115','屏山县','','','屏山县','3','四川省','宜宾市','屏山县','四川省宜宾市屏山县',null,null,28.6531200,104.1512500),\n(587808,'511600000000','510000000000','5116','51','广安市','','广安市','','2','四川省','广安市','','四川省广安市',null,null,30.4739200,106.6418800),\n(587809,'511601000000','511600000000','511601','5116','市辖区','','','市辖区','3','四川省','广安市','市辖区','四川省广安市市辖区',null,null,30.4739200,106.6418800),\n(587810,'511602000000','511600000000','511602','5116','广安区','','','广安区','3','四川省','广安市','广安区','四川省广安市广安区',null,null,30.4739200,106.6418800),\n(588463,'511603000000','511600000000','511603','5116','前锋区','','','前锋区','3','四川省','广安市','前锋区','四川省广安市前锋区',null,null,30.4959200,106.8912500),\n(588764,'511621000000','511600000000','511621','5116','岳池县','','','岳池县','3','四川省','广安市','岳池县','四川省广安市岳池县',null,null,30.5379500,106.4398800),\n(589688,'511622000000','511600000000','511622','5116','武胜县','','','武胜县','3','四川省','广安市','武胜县','四川省广安市武胜县',null,null,30.3493500,106.2959700),\n(590279,'511623000000','511600000000','511623','5116','邻水县','','','邻水县','3','四川省','广安市','邻水县','四川省广安市邻水县',null,null,30.3345800,106.9304800),\n(590850,'511681000000','511600000000','511681','5116','华蓥市','','','华蓥市','3','四川省','广安市','华蓥市','四川省广安市华蓥市',null,null,30.3900100,106.7829800),\n(590999,'511700000000','510000000000','5117','51','达州市','','达州市','','2','四川省','达州市','','四川省达州市',null,null,31.1960300,107.5117700),\n(591000,'511701000000','511700000000','511701','5117','市辖区','','','市辖区','3','四川省','达州市','市辖区','四川省达州市市辖区',null,null,31.1960300,107.5117700),\n(591001,'511702000000','511700000000','511702','5117','通川区','','','通川区','3','四川省','达州市','通川区','四川省达州市通川区',null,null,31.2147300,107.5045500),\n(591297,'511703000000','511700000000','511703','5117','达川区','','','达川区','3','四川省','达州市','达川区','四川省达州市达川区',null,null,31.1960300,107.5117700),\n(592035,'511722000000','511700000000','511722','5117','宣汉县','','','宣汉县','3','四川省','达州市','宣汉县','四川省达州市宣汉县',null,null,31.3538600,107.7271000),\n(592659,'511723000000','511700000000','511723','5117','开江县','','','开江县','3','四川省','达州市','开江县','四川省达州市开江县',null,null,31.0831600,107.8685200),\n(592907,'511724000000','511700000000','511724','5117','大竹县','','','大竹县','3','四川省','达州市','大竹县','四川省达州市大竹县',null,null,30.7360700,107.2044100),\n(593402,'511725000000','511700000000','511725','5117','渠县','','','渠县','3','四川省','达州市','渠县','四川省达州市渠县',null,null,30.8366400,106.9729900),\n(594029,'511771000000','511700000000','511771','5117','达州经济开发区','','','达州经济开发区','3','四川省','达州市','达州经济开发区','四川省达州市达州经济开发区',null,null,31.1362110,107.4946440),\n(594078,'511781000000','511700000000','511781','5117','万源市','','','万源市','3','四川省','达州市','万源市','四川省达州市万源市',null,null,32.0819700,108.0344600),\n(594545,'511800000000','510000000000','5118','51','雅安市','','雅安市','','2','四川省','雅安市','','四川省雅安市',null,null,30.0698200,103.1095400),\n(594546,'511801000000','511800000000','511801','5118','市辖区','','','市辖区','3','四川省','雅安市','市辖区','四川省雅安市市辖区',null,null,30.0698200,103.1095400),\n(594547,'511802000000','511800000000','511802','5118','雨城区','','','雨城区','3','四川省','雅安市','雨城区','四川省雅安市雨城区',null,null,30.0053400,103.0331100),\n(594777,'511803000000','511800000000','511803','5118','名山区','','','名山区','3','四川省','雅安市','名山区','四川省雅安市名山区',null,null,30.0698200,103.1095400),\n(595007,'511822000000','511800000000','511822','5118','荥经县','','','荥经县','3','四川省','雅安市','荥经县','四川省雅安市荥经县',null,null,29.7930800,102.8467100),\n(595141,'511823000000','511800000000','511823','5118','汉源县','','','汉源县','3','四川省','雅安市','汉源县','四川省雅安市汉源县',null,null,29.3445700,102.6526100),\n(595382,'511824000000','511800000000','511824','5118','石棉县','','','石棉县','3','四川省','雅安市','石棉县','四川省雅安市石棉县',null,null,29.2279900,102.3594400),\n(595500,'511825000000','511800000000','511825','5118','天全县','','','天全县','3','四川省','雅安市','天全县','四川省雅安市天全县',null,null,30.0667200,102.7584000),\n(595660,'511826000000','511800000000','511826','5118','芦山县','','','芦山县','3','四川省','雅安市','芦山县','四川省雅安市芦山县',null,null,30.1440700,102.9282600),\n(595717,'511827000000','511800000000','511827','5118','宝兴县','','','宝兴县','3','四川省','雅安市','宝兴县','四川省雅安市宝兴县',null,null,30.3680600,102.8145700),\n(595785,'511900000000','510000000000','5119','51','巴中市','','巴中市','','2','四川省','巴中市','','四川省巴中市',null,null,31.8513100,106.7689700),\n(595786,'511901000000','511900000000','511901','5119','市辖区','','','市辖区','3','四川省','巴中市','市辖区','四川省巴中市市辖区',null,null,31.8513100,106.7689700),\n(595787,'511902000000','511900000000','511902','5119','巴州区','','','巴州区','3','四川省','巴中市','巴州区','四川省巴中市巴州区',null,null,31.8513100,106.7689700),\n(596253,'511903000000','511900000000','511903','5119','恩阳区','','','恩阳区','3','四川省','巴中市','恩阳区','四川省巴中市恩阳区',null,null,31.7895600,106.6360200),\n(596720,'511921000000','511900000000','511921','5119','通江县','','','通江县','3','四川省','巴中市','通江县','四川省巴中市通江县',null,null,31.9118000,107.2449300),\n(597338,'511922000000','511900000000','511922','5119','南江县','','','南江县','3','四川省','巴中市','南江县','四川省巴中市南江县',null,null,32.3464500,106.8290700),\n(598014,'511923000000','511900000000','511923','5119','平昌县','','','平昌县','3','四川省','巴中市','平昌县','四川省巴中市平昌县',null,null,31.5605400,107.1035800),\n(598609,'511971000000','511900000000','511971','5119','巴中经济开发区','','','巴中经济开发区','3','四川省','巴中市','巴中经济开发区','四川省巴中市巴中经济开发区',null,null,31.8588330,106.7527770),\n(598654,'512000000000','510000000000','5120','51','资阳市','','资阳市','','2','四川省','资阳市','','四川省资阳市',null,null,30.1175800,104.6522000),\n(598655,'512001000000','512000000000','512001','5120','市辖区','','','市辖区','3','四川省','资阳市','市辖区','四川省资阳市市辖区',null,null,30.1175800,104.6522000),\n(598656,'512002000000','512000000000','512002','5120','雁江区','','','雁江区','3','四川省','资阳市','雁江区','四川省资阳市雁江区',null,null,30.1175800,104.6522000),\n(599213,'512021000000','512000000000','512021','5120','安岳县','','','安岳县','3','四川省','资阳市','安岳县','四川省资阳市安岳县',null,null,30.0973300,105.3353700),\n(600261,'512022000000','512000000000','512022','5120','乐至县','','','乐至县','3','四川省','资阳市','乐至县','四川省资阳市乐至县',null,null,30.2759000,105.0213300),\n(600920,'513200000000','510000000000','5132','51','阿坝藏族羌族自治州','','阿坝藏族羌族自治州','','2','四川省','阿坝藏族羌族自治州','','四川省阿坝藏族羌族自治州',null,null,31.8994000,102.2247700),\n(600921,'513201000000','513200000000','513201','5132','马尔康市','','','马尔康市','3','四川省','阿坝藏族羌族自治州','马尔康市','四川省阿坝藏族羌族自治州马尔康市',null,null,31.9058500,102.2064400),\n(601044,'513221000000','513200000000','513221','5132','汶川县','','','汶川县','3','四川省','阿坝藏族羌族自治州','汶川县','四川省阿坝藏族羌族自治州汶川县',null,null,31.4768600,103.5903000),\n(601184,'513222000000','513200000000','513222','5132','理县','','','理县','3','四川省','阿坝藏族羌族自治州','理县','四川省阿坝藏族羌族自治州理县',null,null,31.4365900,103.1670000),\n(601287,'513223000000','513200000000','513223','5132','茂县','','','茂县','3','四川省','阿坝藏族羌族自治州','茂县','四川省阿坝藏族羌族自治州茂县',null,null,31.6816300,103.8533400),\n(601461,'513224000000','513200000000','513224','5132','松潘县','','','松潘县','3','四川省','阿坝藏族羌族自治州','松潘县','四川省阿坝藏族羌族自治州松潘县',null,null,32.6381300,103.5989300),\n(601636,'513225000000','513200000000','513225','5132','九寨沟县','','','九寨沟县','3','四川省','阿坝藏族羌族自治州','九寨沟县','四川省阿坝藏族羌族自治州九寨沟县',null,null,33.2614200,104.2356700),\n(601788,'513226000000','513200000000','513226','5132','金川县','','','金川县','3','四川省','阿坝藏族羌族自治州','金川县','四川省阿坝藏族羌族自治州金川县',null,null,31.4759700,102.0632500),\n(601923,'513227000000','513200000000','513227','5132','小金县','','','小金县','3','四川省','阿坝藏族羌族自治州','小金县','四川省阿坝藏族羌族自治州小金县',null,null,30.9991800,102.3644000),\n(602081,'513228000000','513200000000','513228','5132','黑水县','','','黑水县','3','四川省','阿坝藏族羌族自治州','黑水县','四川省阿坝藏族羌族自治州黑水县',null,null,32.0617900,102.9902100),\n(602227,'513230000000','513200000000','513230','5132','壤塘县','','','壤塘县','3','四川省','阿坝藏族羌族自治州','壤塘县','四川省阿坝藏族羌族自治州壤塘县',null,null,32.2654500,100.9786100),\n(602303,'513231000000','513200000000','513231','5132','阿坝县','','','阿坝县','3','四川省','阿坝藏族羌族自治州','阿坝县','四川省阿坝藏族羌族自治州阿坝县',null,null,32.9024500,101.7063400),\n(602414,'513232000000','513200000000','513232','5132','若尔盖县','','','若尔盖县','3','四川省','阿坝藏族羌族自治州','若尔盖县','四川省阿坝藏族羌族自治州若尔盖县',null,null,33.5758600,102.9618700),\n(602535,'513233000000','513200000000','513233','5132','红原县','','','红原县','3','四川省','阿坝藏族羌族自治州','红原县','四川省阿坝藏族羌族自治州红原县',null,null,32.7908700,102.5443800),\n(602585,'513300000000','510000000000','5133','51','甘孜藏族自治州','','甘孜藏族自治州','','2','四川省','甘孜藏族自治州','','四川省甘孜藏族自治州',null,null,30.0493200,101.9625400),\n(602586,'513301000000','513300000000','513301','5133','康定市','','','康定市','3','四川省','甘孜藏族自治州','康定市','四川省甘孜藏族自治州康定市',null,null,30.0544100,101.9630800),\n(602852,'513322000000','513300000000','513322','5133','泸定县','','','泸定县','3','四川省','甘孜藏族自治州','泸定县','四川省甘孜藏族自治州泸定县',null,null,29.9141200,102.2347100),\n(603017,'513323000000','513300000000','513323','5133','丹巴县','','','丹巴县','3','四川省','甘孜藏族自治州','丹巴县','四川省甘孜藏族自治州丹巴县',null,null,30.8786800,101.8907700),\n(603218,'513324000000','513300000000','513324','5133','九龙县','','','九龙县','3','四川省','甘孜藏族自治州','九龙县','四川省甘孜藏族自治州九龙县',null,null,29.0001900,101.5072900),\n(603302,'513325000000','513300000000','513325','5133','雅江县','','','雅江县','3','四川省','甘孜藏族自治州','雅江县','四川省甘孜藏族自治州雅江县',null,null,30.0314500,101.0142600),\n(603434,'513326000000','513300000000','513326','5133','道孚县','','','道孚县','3','四川省','甘孜藏族自治州','道孚县','四川省甘孜藏族自治州道孚县',null,null,30.9793600,101.1250800),\n(603617,'513327000000','513300000000','513327','5133','炉霍县','','','炉霍县','3','四川省','甘孜藏族自治州','炉霍县','四川省甘孜藏族自治州炉霍县',null,null,31.3900500,100.6770300),\n(603809,'513328000000','513300000000','513328','5133','甘孜县','','','甘孜县','3','四川省','甘孜藏族自治州','甘孜县','四川省甘孜藏族自治州甘孜县',null,null,31.6230000,99.9926600),\n(604055,'513329000000','513300000000','513329','5133','新龙县','','','新龙县','3','四川省','甘孜藏族自治州','新龙县','四川省甘孜藏族自治州新龙县',null,null,30.9393200,100.3115200),\n(604225,'513330000000','513300000000','513330','5133','德格县','','','德格县','3','四川省','甘孜藏族自治州','德格县','四川省甘孜藏族自治州德格县',null,null,31.8061200,98.5808800),\n(604426,'513331000000','513300000000','513331','5133','白玉县','','','白玉县','3','四川省','甘孜藏族自治州','白玉县','四川省甘孜藏族自治州白玉县',null,null,31.2101400,98.8241800),\n(604603,'513332000000','513300000000','513332','5133','石渠县','','','石渠县','3','四川省','甘孜藏族自治州','石渠县','四川省甘孜藏族自治州石渠县',null,null,32.9783400,98.1029400),\n(604796,'513333000000','513300000000','513333','5133','色达县','','','色达县','3','四川省','甘孜藏族自治州','色达县','四川省甘孜藏族自治州色达县',null,null,32.2681400,100.3326400),\n(604952,'513334000000','513300000000','513334','5133','理塘县','','','理塘县','3','四川省','甘孜藏族自治州','理塘县','四川省甘孜藏族自治州理塘县',null,null,29.9960300,100.2696300),\n(605195,'513335000000','513300000000','513335','5133','巴塘县','','','巴塘县','3','四川省','甘孜藏族自治州','巴塘县','四川省甘孜藏族自治州巴塘县',null,null,30.0053700,99.1105000),\n(605338,'513336000000','513300000000','513336','5133','乡城县','','','乡城县','3','四川省','甘孜藏族自治州','乡城县','四川省甘孜藏族自治州乡城县',null,null,28.9311800,99.7984200),\n(605443,'513337000000','513300000000','513337','5133','稻城县','','','稻城县','3','四川省','甘孜藏族自治州','稻城县','四川省甘孜藏族自治州稻城县',null,null,29.0370400,100.2982900),\n(605582,'513338000000','513300000000','513338','5133','得荣县','','','得荣县','3','四川省','甘孜藏族自治州','得荣县','四川省甘孜藏族自治州得荣县',null,null,28.7130700,99.2863900),\n(605725,'513400000000','510000000000','5134','51','凉山彝族自治州','','凉山彝族自治州','','2','四川省','凉山彝族自治州','','四川省凉山彝族自治州',null,null,27.8816400,102.2674600),\n(605726,'513401000000','513400000000','513401','5134','西昌市','','','西昌市','3','四川省','凉山彝族自治州','西昌市','四川省凉山彝族自治州西昌市',null,null,27.8944900,102.2630500),\n(606040,'513422000000','513400000000','513422','5134','木里藏族自治县','','','木里藏族自治县','3','四川省','凉山彝族自治州','木里藏族自治县','四川省凉山彝族自治州木里藏族自治县',null,null,27.9285900,101.2804800),\n(606193,'513423000000','513400000000','513423','5134','盐源县','','','盐源县','3','四川省','凉山彝族自治州','盐源县','四川省凉山彝族自治州盐源县',null,null,27.4224100,101.5091900),\n(606481,'513424000000','513400000000','513424','5134','德昌县','','','德昌县','3','四川省','凉山彝族自治州','德昌县','四川省凉山彝族自治州德昌县',null,null,27.4028900,102.1755900),\n(606643,'513425000000','513400000000','513425','5134','会理县','','','会理县','3','四川省','凉山彝族自治州','会理县','四川省凉山彝族自治州会理县',null,null,26.6552700,102.2445700),\n(606984,'513426000000','513400000000','513426','5134','会东县','','','会东县','3','四川省','凉山彝族自治州','会东县','四川省凉山彝族自治州会东县',null,null,26.6346000,102.5781700),\n(607330,'513427000000','513400000000','513427','5134','宁南县','','','宁南县','3','四川省','凉山彝族自治州','宁南县','四川省凉山彝族自治州宁南县',null,null,27.0666700,102.7605200),\n(607490,'513428000000','513400000000','513428','5134','普格县','','','普格县','3','四川省','凉山彝族自治州','普格县','四川省凉山彝族自治州普格县',null,null,27.3765000,102.5409200),\n(607686,'513429000000','513400000000','513429','5134','布拖县','','','布拖县','3','四川省','凉山彝族自治州','布拖县','四川省凉山彝族自治州布拖县',null,null,27.7062200,102.8114900),\n(607909,'513430000000','513400000000','513430','5134','金阳县','','','金阳县','3','四川省','凉山彝族自治州','金阳县','四川省凉山彝族自治州金阳县',null,null,27.6965400,103.2490300),\n(608122,'513431000000','513400000000','513431','5134','昭觉县','','','昭觉县','3','四川省','凉山彝族自治州','昭觉县','四川省凉山彝族自治州昭觉县',null,null,28.0142500,102.8426500),\n(608442,'513432000000','513400000000','513432','5134','喜德县','','','喜德县','3','四川省','凉山彝族自治州','喜德县','四川省凉山彝族自治州喜德县',null,null,28.3066600,102.4123100),\n(608640,'513433000000','513400000000','513433','5134','冕宁县','','','冕宁县','3','四川省','凉山彝族自治州','冕宁县','四川省凉山彝族自治州冕宁县',null,null,28.5501800,102.1767800),\n(608911,'513434000000','513400000000','513434','5134','越西县','','','越西县','3','四川省','凉山彝族自治州','越西县','四川省凉山彝族自治州越西县',null,null,28.6399900,102.5075000),\n(609244,'513435000000','513400000000','513435','5134','甘洛县','','','甘洛县','3','四川省','凉山彝族自治州','甘洛县','四川省凉山彝族自治州甘洛县',null,null,28.9587300,102.7703300),\n(609503,'513436000000','513400000000','513436','5134','美姑县','','','美姑县','3','四川省','凉山彝族自治州','美姑县','四川省凉山彝族自治州美姑县',null,null,28.3288500,103.1322900),\n(609835,'513437000000','513400000000','513437','5134','雷波县','','','雷波县','3','四川省','凉山彝族自治州','雷波县','四川省凉山彝族自治州雷波县',null,null,28.2627200,103.5715000),\n(610174,'520000000000','0','52','0','贵州省','贵州省','','','1','贵州省','','','贵州省',null,null,null,null),\n(610175,'520100000000','520000000000','5201','52','贵阳市','','贵阳市','','2','贵州省','贵阳市','','贵州省贵阳市',null,null,26.6785600,106.6230400),\n(610176,'520101000000','520100000000','520101','5201','市辖区','','','市辖区','3','贵州省','贵阳市','市辖区','贵州省贵阳市市辖区',null,null,26.6785600,106.6230400),\n(610177,'520102000000','520100000000','520102','5201','南明区','','','南明区','3','贵州省','贵阳市','南明区','贵州省贵阳市南明区',null,null,26.5682200,106.7141000),\n(610393,'520103000000','520100000000','520103','5201','云岩区','','','云岩区','3','贵州省','贵阳市','云岩区','贵州省贵阳市云岩区',null,null,26.6049100,106.7256600),\n(610596,'520111000000','520100000000','520111','5201','花溪区','','','花溪区','3','贵州省','贵阳市','花溪区','贵州省贵阳市花溪区',null,null,26.4098500,106.6703400),\n(610836,'520112000000','520100000000','520112','5201','乌当区','','','乌当区','3','贵州省','贵阳市','乌当区','贵州省贵阳市乌当区',null,null,26.6295900,106.7520800),\n(610951,'520113000000','520100000000','520113','5201','白云区','','','白云区','3','贵州省','贵阳市','白云区','贵州省贵阳市白云区',null,null,26.6785600,106.6230400),\n(611057,'520115000000','520100000000','520115','5201','观山湖区','','','观山湖区','3','贵州省','贵阳市','观山湖区','贵州省贵阳市观山湖区',null,null,26.6015000,106.6225400),\n(611189,'520121000000','520100000000','520121','5201','开阳县','','','开阳县','3','贵州省','贵阳市','开阳县','贵州省贵阳市开阳县',null,null,27.0575900,106.9648600),\n(611342,'520122000000','520100000000','520122','5201','息烽县','','','息烽县','3','贵州省','贵阳市','息烽县','贵州省贵阳市息烽县',null,null,27.0905300,106.7404000),\n(611531,'520123000000','520100000000','520123','5201','修文县','','','修文县','3','贵州省','贵阳市','修文县','贵州省贵阳市修文县',null,null,26.8389000,106.5920300),\n(611671,'520181000000','520100000000','520181','5201','清镇市','','','清镇市','3','贵州省','贵阳市','清镇市','贵州省贵阳市清镇市',null,null,26.5560700,106.4705700),\n(611913,'520200000000','520000000000','5202','52','六盘水市','','六盘水市','','2','贵州省','六盘水市','','贵州省六盘水市',null,null,26.2014100,105.4802500),\n(611914,'520201000000','520200000000','520201','5202','钟山区','','','钟山区','3','贵州省','六盘水市','钟山区','贵州省六盘水市钟山区',null,null,26.5758500,104.8444700),\n(612073,'520203000000','520200000000','520203','5202','六枝特区','','','六枝特区','3','贵州省','六盘水市','六枝特区','贵州省六盘水市六枝特区',null,null,26.2014100,105.4802500),\n(612335,'520221000000','520200000000','520221','5202','水城县','','','水城县','3','贵州省','六盘水市','水城县','贵州省六盘水市水城县',null,null,26.5465800,104.9576400),\n(612571,'520281000000','520200000000','520281','5202','盘州市','','','盘州市','3','贵州省','六盘水市','盘州市','贵州省六盘水市盘州市',null,null,25.7099300,104.4715800),\n(613115,'520300000000','520000000000','5203','52','遵义市','','遵义市','','2','贵州省','遵义市','','贵州省遵义市',null,null,27.5362500,106.8292200),\n(613116,'520301000000','520300000000','520301','5203','市辖区','','','市辖区','3','贵州省','遵义市','市辖区','贵州省遵义市市辖区',null,null,27.5362500,106.8292200),\n(613117,'520302000000','520300000000','520302','5203','红花岗区','','','红花岗区','3','贵州省','遵义市','红花岗区','贵州省遵义市红花岗区',null,null,27.6448100,106.8938000),\n(613322,'520303000000','520300000000','520303','5203','汇川区','','','汇川区','3','贵州省','遵义市','汇川区','贵州省遵义市汇川区',null,null,27.7497900,106.9325200),\n(613472,'520304000000','520300000000','520304','5203','播州区','','','播州区','3','贵州省','遵义市','播州区','贵州省遵义市播州区',null,null,27.5362500,106.8292200),\n(613673,'520322000000','520300000000','520322','5203','桐梓县','','','桐梓县','3','贵州省','遵义市','桐梓县','贵州省遵义市桐梓县',null,null,28.1332100,106.8250200),\n(613924,'520323000000','520300000000','520323','5203','绥阳县','','','绥阳县','3','贵州省','遵义市','绥阳县','贵州省遵义市绥阳县',null,null,27.9470500,107.1907000),\n(614059,'520324000000','520300000000','520324','5203','正安县','','','正安县','3','贵州省','遵义市','正安县','贵州省遵义市正安县',null,null,28.5501100,107.4440200),\n(614231,'520325000000','520300000000','520325','5203','道真仡佬族苗族自治县','','','道真仡佬族苗族自治县','3','贵州省','遵义市','道真仡佬族苗族自治县','贵州省遵义市道真仡佬族苗族自治县',null,null,28.8626400,107.6131600),\n(614329,'520326000000','520300000000','520326','5203','务川仡佬族苗族自治县','','','务川仡佬族苗族自治县','3','贵州省','遵义市','务川仡佬族苗族自治县','贵州省遵义市务川仡佬族苗族自治县',null,null,28.5629500,107.8988800),\n(614467,'520327000000','520300000000','520327','5203','凤冈县','','','凤冈县','3','贵州省','遵义市','凤冈县','贵州省遵义市凤冈县',null,null,27.9546500,107.7168900),\n(614568,'520328000000','520300000000','520328','5203','湄潭县','','','湄潭县','3','贵州省','遵义市','湄潭县','贵州省遵义市湄潭县',null,null,27.7488900,107.4655100),\n(614717,'520329000000','520300000000','520329','5203','余庆县','','','余庆县','3','贵州省','遵义市','余庆县','贵州省遵义市余庆县',null,null,27.2253600,107.8882500),\n(614798,'520330000000','520300000000','520330','5203','习水县','','','习水县','3','贵州省','遵义市','习水县','贵州省遵义市习水县',null,null,28.3274000,106.2038500),\n(615073,'520381000000','520300000000','520381','5203','赤水市','','','赤水市','3','贵州省','遵义市','赤水市','贵州省遵义市赤水市',null,null,28.5905500,105.6974400),\n(615215,'520382000000','520300000000','520382','5203','仁怀市','','','仁怀市','3','贵州省','遵义市','仁怀市','贵州省遵义市仁怀市',null,null,27.7923400,106.4015600),\n(615410,'520400000000','520000000000','5204','52','安顺市','','安顺市','','2','贵州省','安顺市','','贵州省安顺市',null,null,26.4057400,106.2553000),\n(615411,'520401000000','520400000000','520401','5204','市辖区','','','市辖区','3','贵州省','安顺市','市辖区','贵州省安顺市市辖区',null,null,26.4057400,106.2553000),\n(615412,'520402000000','520400000000','520402','5204','西秀区','','','西秀区','3','贵州省','安顺市','西秀区','贵州省安顺市西秀区',null,null,26.2453200,105.9653300),\n(615790,'520403000000','520400000000','520403','5204','平坝区','','','平坝区','3','贵州省','安顺市','平坝区','贵州省安顺市平坝区',null,null,26.4057400,106.2553000),\n(615949,'520422000000','520400000000','520422','5204','普定县','','','普定县','3','贵州省','安顺市','普定县','贵州省安顺市普定县',null,null,26.3014400,105.7429100),\n(616134,'520423000000','520400000000','520423','5204','镇宁布依族苗族自治县','','','镇宁布依族苗族自治县','3','贵州省','安顺市','镇宁布依族苗族自治县','贵州省安顺市镇宁布依族苗族自治县',null,null,26.0571600,105.7704800),\n(616360,'520424000000','520400000000','520424','5204','关岭布依族苗族自治县','','','关岭布依族苗族自治县','3','贵州省','安顺市','关岭布依族苗族自治县','贵州省安顺市关岭布依族苗族自治县',null,null,25.9435700,105.6193300),\n(616531,'520425000000','520400000000','520425','5204','紫云苗族布依族自治县','','','紫云苗族布依族自治县','3','贵州省','安顺市','紫云苗族布依族自治县','贵州省安顺市紫云苗族布依族自治县',null,null,25.7511700,106.0840400),\n(616712,'520500000000','520000000000','5205','52','毕节市','','毕节市','','2','贵州省','毕节市','','贵州省毕节市',null,null,27.2984700,105.3050400),\n(616713,'520501000000','520500000000','520501','5205','市辖区','','','市辖区','3','贵州省','毕节市','市辖区','贵州省毕节市市辖区',null,null,27.2984700,105.3050400),\n(616714,'520502000000','520500000000','520502','5205','七星关区','','','七星关区','3','贵州省','毕节市','七星关区','贵州省毕节市七星关区',null,null,27.2984700,105.3050400),\n(617318,'520521000000','520500000000','520521','5205','大方县','','','大方县','3','贵州省','毕节市','大方县','贵州省毕节市大方县',null,null,27.1416100,105.6130000),\n(617737,'520522000000','520500000000','520522','5205','黔西县','','','黔西县','3','贵州省','毕节市','黔西县','贵州省毕节市黔西县',null,null,27.0086600,106.0323000),\n(618153,'520523000000','520500000000','520523','5205','金沙县','','','金沙县','3','贵州省','毕节市','金沙县','贵州省毕节市金沙县',null,null,27.4592200,106.2201400),\n(618418,'520524000000','520500000000','520524','5205','织金县','','','织金县','3','贵州省','毕节市','织金县','贵州省毕节市织金县',null,null,26.6630100,105.7748800),\n(619025,'520525000000','520500000000','520525','5205','纳雍县','','','纳雍县','3','贵州省','毕节市','纳雍县','贵州省毕节市纳雍县',null,null,26.7777000,105.3826900),\n(619479,'520526000000','520500000000','520526','5205','威宁彝族回族苗族自治县','','','威宁彝族回族苗族自治县','3','贵州省','毕节市','威宁彝族回族苗族自治县','贵州省毕节市威宁彝族回族苗族自治县',null,null,26.8564100,104.2787200),\n(620148,'520527000000','520500000000','520527','5205','赫章县','','','赫章县','3','贵州省','毕节市','赫章县','贵州省毕节市赫章县',null,null,27.1232800,104.7274000),\n(620643,'520600000000','520000000000','5206','52','铜仁市','','铜仁市','','2','贵州省','铜仁市','','贵州省铜仁市',null,null,27.6906600,109.1809900),\n(620644,'520601000000','520600000000','520601','5206','市辖区','','','市辖区','3','贵州省','铜仁市','市辖区','贵州省铜仁市市辖区',null,null,27.6906600,109.1809900),\n(620645,'520602000000','520600000000','520602','5206','碧江区','','','碧江区','3','贵州省','铜仁市','碧江区','贵州省铜仁市碧江区',null,null,27.6906600,109.1809900),\n(620749,'520603000000','520600000000','520603','5206','万山区','','','万山区','3','贵州省','铜仁市','万山区','贵州省铜仁市万山区',null,null,27.5179600,109.2136900),\n(620855,'520621000000','520600000000','520621','5206','江口县','','','江口县','3','贵州省','铜仁市','江口县','贵州省铜仁市江口县',null,null,27.6995600,108.8396700),\n(621022,'520622000000','520600000000','520622','5206','玉屏侗族自治县','','','玉屏侗族自治县','3','贵州省','铜仁市','玉屏侗族自治县','贵州省铜仁市玉屏侗族自治县',null,null,27.2363700,108.9121200),\n(621123,'520623000000','520600000000','520623','5206','石阡县','','','石阡县','3','贵州省','铜仁市','石阡县','贵州省铜仁市石阡县',null,null,27.5133900,108.2233800),\n(621453,'520624000000','520600000000','520624','5206','思南县','','','思南县','3','贵州省','铜仁市','思南县','贵州省铜仁市思南县',null,null,27.9388600,108.2528000),\n(622008,'520625000000','520600000000','520625','5206','印江土家族苗族自治县','','','印江土家族苗族自治县','3','贵州省','铜仁市','印江土家族苗族自治县','贵州省铜仁市印江土家族苗族自治县',null,null,27.9941000,108.4095800),\n(622400,'520626000000','520600000000','520626','5206','德江县','','','德江县','3','贵州省','铜仁市','德江县','贵州省铜仁市德江县',null,null,28.2640800,108.1198700),\n(622766,'520627000000','520600000000','520627','5206','沿河土家族自治县','','','沿河土家族自治县','3','贵州省','铜仁市','沿河土家族自治县','贵州省铜仁市沿河土家族自治县',null,null,28.5639700,108.5030100),\n(623238,'520628000000','520600000000','520628','5206','松桃苗族自治县','','','松桃苗族自治县','3','贵州省','铜仁市','松桃苗族自治县','贵州省铜仁市松桃苗族自治县',null,null,28.1541400,109.2031600),\n(623791,'522300000000','520000000000','5223','52','黔西南布依族苗族自治州','','黔西南布依族苗族自治州','','2','贵州省','黔西南布依族苗族自治州','','贵州省黔西南布依族苗族自治州',null,null,25.0898800,104.9043700),\n(623792,'522301000000','522300000000','522301','5223','兴义市','','','兴义市','3','贵州省','黔西南布依族苗族自治州','兴义市','贵州省黔西南布依族苗族自治州兴义市',null,null,25.0919200,104.8955300),\n(624046,'522322000000','522300000000','522322','5223','兴仁县','','','兴仁县','3','贵州省','黔西南布依族苗族自治州','兴仁县','贵州省黔西南布依族苗族自治州兴仁县',null,null,25.4351100,105.1863900),\n(624228,'522323000000','522300000000','522323','5223','普安县','','','普安县','3','贵州省','黔西南布依族苗族自治州','普安县','贵州省黔西南布依族苗族自治州普安县',null,null,25.7842900,104.9532400),\n(624331,'522324000000','522300000000','522324','5223','晴隆县','','','晴隆县','3','贵州省','黔西南布依族苗族自治州','晴隆县','贵州省黔西南布依族苗族自治州晴隆县',null,null,25.8347400,105.2190400),\n(624442,'522325000000','522300000000','522325','5223','贞丰县','','','贞丰县','3','贵州省','黔西南布依族苗族自治州','贞丰县','贵州省黔西南布依族苗族自治州贞丰县',null,null,25.3855800,105.6504300),\n(624616,'522326000000','522300000000','522326','5223','望谟县','','','望谟县','3','贵州省','黔西南布依族苗族自治州','望谟县','贵州省黔西南布依族苗族自治州望谟县',null,null,25.1782400,106.0996200),\n(624798,'522327000000','522300000000','522327','5223','册亨县','','','册亨县','3','贵州省','黔西南布依族苗族自治州','册亨县','贵州省黔西南布依族苗族自治州册亨县',null,null,24.9836800,105.8117300),\n(624943,'522328000000','522300000000','522328','5223','安龙县','','','安龙县','3','贵州省','黔西南布依族苗族自治州','安龙县','贵州省黔西南布依族苗族自治州安龙县',null,null,25.0981100,105.4433300),\n(625145,'522600000000','520000000000','5226','52','黔东南苗族侗族自治州','','黔东南苗族侗族自治州','','2','贵州省','黔东南苗族侗族自治州','','贵州省黔东南苗族侗族自治州',null,null,26.5836400,107.9841600),\n(625146,'522601000000','522600000000','522601','5226','凯里市','','','凯里市','3','贵州省','黔东南苗族侗族自治州','凯里市','贵州省黔东南苗族侗族自治州凯里市',null,null,26.5675600,107.9804000),\n(625436,'522622000000','522600000000','522622','5226','黄平县','','','黄平县','3','贵州省','黔东南苗族侗族自治州','黄平县','贵州省黔东南苗族侗族自治州黄平县',null,null,26.9053300,107.9163800),\n(625702,'522623000000','522600000000','522623','5226','施秉县','','','施秉县','3','贵州省','黔东南苗族侗族自治州','施秉县','贵州省黔东南苗族侗族自治州施秉县',null,null,27.0332700,108.1241300),\n(625785,'522624000000','522600000000','522624','5226','三穗县','','','三穗县','3','贵州省','黔东南苗族侗族自治州','三穗县','贵州省黔东南苗族侗族自治州三穗县',null,null,26.9529100,108.6753300),\n(625959,'522625000000','522600000000','522625','5226','镇远县','','','镇远县','3','贵州省','黔东南苗族侗族自治州','镇远县','贵州省黔东南苗族侗族自治州镇远县',null,null,27.0491400,108.4296800),\n(626098,'522626000000','522600000000','522626','5226','岑巩县','','','岑巩县','3','贵州省','黔东南苗族侗族自治州','岑巩县','贵州省黔东南苗族侗族自治州岑巩县',null,null,27.1738500,108.8157000),\n(626250,'522627000000','522600000000','522627','5226','天柱县','','','天柱县','3','贵州省','黔东南苗族侗族自治州','天柱县','贵州省黔东南苗族侗族自治州天柱县',null,null,26.9094800,109.2077600),\n(626593,'522628000000','522600000000','522628','5226','锦屏县','','','锦屏县','3','贵州省','黔东南苗族侗族自治州','锦屏县','贵州省黔东南苗族侗族自治州锦屏县',null,null,26.6763100,109.2005100),\n(626801,'522629000000','522600000000','522629','5226','剑河县','','','剑河县','3','贵州省','黔东南苗族侗族自治州','剑河县','贵州省黔东南苗族侗族自治州剑河县',null,null,26.7286000,108.4413700),\n(627124,'522630000000','522600000000','522630','5226','台江县','','','台江县','3','贵州省','黔东南苗族侗族自治州','台江县','贵州省黔东南苗族侗族自治州台江县',null,null,26.6690300,108.3200900),\n(627294,'522631000000','522600000000','522631','5226','黎平县','','','黎平县','3','贵州省','黔东南苗族侗族自治州','黎平县','贵州省黔东南苗族侗族自治州黎平县',null,null,26.2292400,109.1371800),\n(627743,'522632000000','522600000000','522632','5226','榕江县','','','榕江县','3','贵州省','黔东南苗族侗族自治州','榕江县','贵州省黔东南苗族侗族自治州榕江县',null,null,25.9318900,108.5225100),\n(628033,'522633000000','522600000000','522633','5226','从江县','','','从江县','3','贵州省','黔东南苗族侗族自治州','从江县','贵州省黔东南苗族侗族自治州从江县',null,null,25.7541800,108.9053200),\n(628439,'522634000000','522600000000','522634','5226','雷山县','','','雷山县','3','贵州省','黔东南苗族侗族自治州','雷山县','贵州省黔东南苗族侗族自治州雷山县',null,null,26.3783400,108.0775800),\n(628611,'522635000000','522600000000','522635','5226','麻江县','','','麻江县','3','贵州省','黔东南苗族侗族自治州','麻江县','贵州省黔东南苗族侗族自治州麻江县',null,null,26.4911500,107.5893700),\n(628688,'522636000000','522600000000','522636','5226','丹寨县','','','丹寨县','3','贵州省','黔东南苗族侗族自治州','丹寨县','贵州省黔东南苗族侗族自治州丹寨县',null,null,26.1984100,107.7887100),\n(628861,'522700000000','520000000000','5227','52','黔南布依族苗族自治州','','黔南布依族苗族自治州','','2','贵州省','黔南布依族苗族自治州','','贵州省黔南布依族苗族自治州',null,null,26.2542700,107.5222600),\n(628862,'522701000000','522700000000','522701','5227','都匀市','','','都匀市','3','贵州省','黔南布依族苗族自治州','都匀市','贵州省黔南布依族苗族自治州都匀市',null,null,26.2597900,107.5186700),\n(629015,'522702000000','522700000000','522702','5227','福泉市','','','福泉市','3','贵州省','黔南布依族苗族自治州','福泉市','贵州省黔南布依族苗族自治州福泉市',null,null,26.6865100,107.5207000),\n(629100,'522722000000','522700000000','522722','5227','荔波县','','','荔波县','3','贵州省','黔南布依族苗族自治州','荔波县','贵州省黔南布依族苗族自治州荔波县',null,null,25.4112400,107.8873200),\n(629209,'522723000000','522700000000','522723','5227','贵定县','','','贵定县','3','贵州省','黔南布依族苗族自治州','贵定县','贵州省黔南布依族苗族自治州贵定县',null,null,26.5849800,107.2344700),\n(629329,'522725000000','522700000000','522725','5227','瓮安县','','','瓮安县','3','贵州省','黔南布依族苗族自治州','瓮安县','贵州省黔南布依族苗族自治州瓮安县',null,null,27.0779000,107.4710600),\n(629441,'522726000000','522700000000','522726','5227','独山县','','','独山县','3','贵州省','黔南布依族苗族自治州','独山县','贵州省黔南布依族苗族自治州独山县',null,null,25.8227900,107.5457800),\n(629514,'522727000000','522700000000','522727','5227','平塘县','','','平塘县','3','贵州省','黔南布依族苗族自治州','平塘县','贵州省黔南布依族苗族自治州平塘县',null,null,25.8224900,107.3228700),\n(629653,'522728000000','522700000000','522728','5227','罗甸县','','','罗甸县','3','贵州省','黔南布依族苗族自治州','罗甸县','贵州省黔南布依族苗族自治州罗甸县',null,null,25.4253600,106.7517100),\n(629846,'522729000000','522700000000','522729','5227','长顺县','','','长顺县','3','贵州省','黔南布依族苗族自治州','长顺县','贵州省黔南布依族苗族自治州长顺县',null,null,26.0221400,106.4524400),\n(629936,'522730000000','522700000000','522730','5227','龙里县','','','龙里县','3','贵州省','黔南布依族苗族自治州','龙里县','贵州省黔南布依族苗族自治州龙里县',null,null,26.4532500,106.9798100),\n(630021,'522731000000','522700000000','522731','5227','惠水县','','','惠水县','3','贵州省','黔南布依族苗族自治州','惠水县','贵州省黔南布依族苗族自治州惠水县',null,null,26.1329000,106.6567000),\n(630246,'522732000000','522700000000','522732','5227','三都水族自治县','','','三都水族自治县','3','贵州省','黔南布依族苗族自治州','三都水族自治县','贵州省黔南布依族苗族自治州三都水族自治县',null,null,25.9832600,107.8697100),\n(630496,'530000000000','0','53','0','云南省','云南省','','','1','云南省','','','云南省',null,null,null,null),\n(630497,'530100000000','530000000000','5301','53','昆明市','','昆明市','','2','云南省','昆明市','','云南省昆明市',null,null,24.8855400,102.8214700),\n(630498,'530101000000','530100000000','530101','5301','市辖区','','','市辖区','3','云南省','昆明市','市辖区','云南省昆明市市辖区',null,null,24.8855400,102.8214700),\n(630499,'530102000000','530100000000','530102','5301','五华区','','','五华区','3','云南省','昆明市','五华区','云南省昆明市五华区',null,null,25.0434700,102.7073700),\n(630610,'530103000000','530100000000','530103','5301','盘龙区','','','盘龙区','3','云南省','昆明市','盘龙区','云南省昆明市盘龙区',null,null,25.1162400,102.7520500),\n(630726,'530111000000','530100000000','530111','5301','官渡区','','','官渡区','3','云南省','昆明市','官渡区','云南省昆明市官渡区',null,null,25.0150300,102.7437000),\n(630857,'530112000000','530100000000','530112','5301','西山区','','','西山区','3','云南省','昆明市','西山区','云南省昆明市西山区',null,null,25.0384500,102.6648100),\n(630987,'530113000000','530100000000','530113','5301','东川区','','','东川区','3','云南省','昆明市','东川区','云南省昆明市东川区',null,null,26.0829400,103.1877300),\n(631161,'530114000000','530100000000','530114','5301','呈贡区','','','呈贡区','3','云南省','昆明市','呈贡区','云南省昆明市呈贡区',null,null,24.8855400,102.8214700),\n(631241,'530115000000','530100000000','530115','5301','晋宁区','','','晋宁区','3','云南省','昆明市','晋宁区','云南省昆明市晋宁区',null,null,24.6698200,102.5955900),\n(631387,'530124000000','530100000000','530124','5301','富民县','','','富民县','3','云南省','昆明市','富民县','云南省昆明市富民县',null,null,25.2219900,102.4976700),\n(631470,'530125000000','530100000000','530125','5301','宜良县','','','宜良县','3','云南省','昆明市','宜良县','云南省昆明市宜良县',null,null,24.9200500,103.1411900),\n(631619,'530126000000','530100000000','530126','5301','石林彝族自治县','','','石林彝族自治县','3','云南省','昆明市','石林彝族自治县','云南省昆明市石林彝族自治县',null,null,24.7708200,103.2889000),\n(631720,'530127000000','530100000000','530127','5301','嵩明县','','','嵩明县','3','云南省','昆明市','嵩明县','云南省昆明市嵩明县',null,null,25.3387200,103.0368700),\n(631804,'530128000000','530100000000','530128','5301','禄劝彝族苗族自治县','','','禄劝彝族苗族自治县','3','云南省','昆明市','禄劝彝族苗族自治县','云南省昆明市禄劝彝族苗族自治县',null,null,25.5512800,102.4714500),\n(632022,'530129000000','530100000000','530129','5301','寻甸回族彝族自治县','','','寻甸回族彝族自治县','3','云南省','昆明市','寻甸回族彝族自治县','云南省昆明市寻甸回族彝族自治县',null,null,25.5581800,103.2566800),\n(632215,'530181000000','530100000000','530181','5301','安宁市','','','安宁市','3','云南省','昆明市','安宁市','云南省昆明市安宁市',null,null,24.9195400,102.4780000),\n(632322,'530300000000','530000000000','5303','53','曲靖市','','曲靖市','','2','云南省','曲靖市','','云南省曲靖市',null,null,25.6016700,103.8218300),\n(632323,'530301000000','530300000000','530301','5303','市辖区','','','市辖区','3','云南省','曲靖市','市辖区','云南省曲靖市市辖区',null,null,25.6016700,103.8218300),\n(632324,'530302000000','530300000000','530302','5303','麒麟区','','','麒麟区','3','云南省','曲靖市','麒麟区','云南省曲靖市麒麟区',null,null,25.4951300,103.8048100),\n(632484,'530303000000','530300000000','530303','5303','沾益区','','','沾益区','3','云南省','曲靖市','沾益区','云南省曲靖市沾益区',null,null,25.6016700,103.8218300),\n(632626,'530321000000','530300000000','530321','5303','马龙县','','','马龙县','3','云南省','曲靖市','马龙县','云南省曲靖市马龙县',null,null,25.4280700,103.5783400),\n(632712,'530322000000','530300000000','530322','5303','陆良县','','','陆良县','3','云南省','曲靖市','陆良县','云南省曲靖市陆良县',null,null,25.0294100,103.6668300),\n(632874,'530323000000','530300000000','530323','5303','师宗县','','','师宗县','3','云南省','曲靖市','师宗县','云南省曲靖市师宗县',null,null,24.8285100,103.9899000),\n(632995,'530324000000','530300000000','530324','5303','罗平县','','','罗平县','3','云南省','曲靖市','罗平县','云南省曲靖市罗平县',null,null,24.8846800,104.3087000),\n(633163,'530325000000','530300000000','530325','5303','富源县','','','富源县','3','云南省','曲靖市','富源县','云南省曲靖市富源县',null,null,25.6742200,104.2548500),\n(633337,'530326000000','530300000000','530326','5303','会泽县','','','会泽县','3','云南省','曲靖市','会泽县','云南省曲靖市会泽县',null,null,26.4179100,103.2973700),\n(633739,'530381000000','530300000000','530381','5303','宣威市','','','宣威市','3','云南省','曲靖市','宣威市','云南省曲靖市宣威市',null,null,26.2198900,104.1044800),\n(634124,'530400000000','530000000000','5304','53','玉溪市','','玉溪市','','2','云南省','玉溪市','','云南省玉溪市',null,null,24.3542300,102.5452200),\n(634125,'530401000000','530400000000','530401','5304','市辖区','','','市辖区','3','云南省','玉溪市','市辖区','云南省玉溪市市辖区',null,null,24.3542300,102.5452200),\n(634126,'530402000000','530400000000','530402','5304','红塔区','','','红塔区','3','云南省','玉溪市','红塔区','云南省玉溪市红塔区',null,null,24.3542300,102.5452200),\n(634242,'530403000000','530400000000','530403','5304','江川区','','','江川区','3','云南省','玉溪市','江川区','云南省玉溪市江川区',null,null,24.2874400,102.7537600),\n(634324,'530422000000','530400000000','530422','5304','澄江县','','','澄江县','3','云南省','玉溪市','澄江县','云南省玉溪市澄江县',null,null,24.6737900,102.9081900),\n(634371,'530423000000','530400000000','530423','5304','通海县','','','通海县','3','云南省','玉溪市','通海县','云南省玉溪市通海县',null,null,24.1136700,102.7664700),\n(634457,'530424000000','530400000000','530424','5304','华宁县','','','华宁县','3','云南省','玉溪市','华宁县','云南省玉溪市华宁县',null,null,24.1934000,102.9284900),\n(634540,'530425000000','530400000000','530425','5304','易门县','','','易门县','3','云南省','玉溪市','易门县','云南省玉溪市易门县',null,null,24.6710800,102.1627300),\n(634606,'530426000000','530400000000','530426','5304','峨山彝族自治县','','','峨山彝族自治县','3','云南省','玉溪市','峨山彝族自治县','云南省玉溪市峨山彝族自治县',null,null,24.1690800,102.4057900),\n(634691,'530427000000','530400000000','530427','5304','新平彝族傣族自治县','','','新平彝族傣族自治县','3','云南省','玉溪市','新平彝族傣族自治县','云南省玉溪市新平彝族傣族自治县',null,null,24.0700000,101.9901400),\n(634827,'530428000000','530400000000','530428','5304','元江哈尼族彝族傣族自治县','','','元江哈尼族彝族傣族自治县','3','云南省','玉溪市','元江哈尼族彝族傣族自治县','云南省玉溪市元江哈尼族彝族傣族自治县',null,null,23.5966700,101.9980900),\n(634919,'530500000000','530000000000','5305','53','保山市','','保山市','','2','云南省','保山市','','云南省保山市',null,null,25.1210700,99.1657900),\n(634920,'530501000000','530500000000','530501','5305','市辖区','','','市辖区','3','云南省','保山市','市辖区','云南省保山市市辖区',null,null,25.1210700,99.1657900),\n(634921,'530502000000','530500000000','530502','5305','隆阳区','','','隆阳区','3','云南省','保山市','隆阳区','云南省保山市隆阳区',null,null,25.1210700,99.1657900),\n(635261,'530521000000','530500000000','530521','5305','施甸县','','','施甸县','3','云南省','保山市','施甸县','云南省保山市施甸县',null,null,24.7230800,99.1890200),\n(635415,'530523000000','530500000000','530523','5305','龙陵县','','','龙陵县','3','云南省','保山市','龙陵县','云南省保山市龙陵县',null,null,24.5868200,98.6892700),\n(635547,'530524000000','530500000000','530524','5305','昌宁县','','','昌宁县','3','云南省','保山市','昌宁县','云南省保山市昌宁县',null,null,24.8274500,99.6056700),\n(635685,'530581000000','530500000000','530581','5305','腾冲市','','','腾冲市','3','云南省','保山市','腾冲市','云南省保山市腾冲市',null,null,25.0205300,98.4909700),\n(635925,'530600000000','530000000000','5306','53','昭通市','','昭通市','','2','云南省','昭通市','','云南省昭通市',null,null,27.3202700,103.7059400),\n(635926,'530601000000','530600000000','530601','5306','市辖区','','','市辖区','3','云南省','昭通市','市辖区','云南省昭通市市辖区',null,null,27.3202700,103.7059400),\n(635927,'530602000000','530600000000','530602','5306','昭阳区','','','昭阳区','3','云南省','昭通市','昭阳区','云南省昭通市昭阳区',null,null,27.3202700,103.7059400),\n(636132,'530621000000','530600000000','530621','5306','鲁甸县','','','鲁甸县','3','云南省','昭通市','鲁甸县','云南省昭通市鲁甸县',null,null,27.1866400,103.5579200),\n(636242,'530622000000','530600000000','530622','5306','巧家县','','','巧家县','3','云南省','昭通市','巧家县','云南省昭通市巧家县',null,null,26.9086100,102.9300600),\n(636443,'530623000000','530600000000','530623','5306','盐津县','','','盐津县','3','云南省','昭通市','盐津县','云南省昭通市盐津县',null,null,28.1085900,104.2346700),\n(636548,'530624000000','530600000000','530624','5306','大关县','','','大关县','3','云南省','昭通市','大关县','云南省昭通市大关县',null,null,27.7480600,103.8911100),\n(636642,'530625000000','530600000000','530625','5306','永善县','','','永善县','3','云南省','昭通市','永善县','云南省昭通市永善县',null,null,28.2290900,103.6381700),\n(636800,'530626000000','530600000000','530626','5306','绥江县','','','绥江县','3','云南省','昭通市','绥江县','云南省昭通市绥江县',null,null,28.5984000,103.9584100),\n(636848,'530627000000','530600000000','530627','5306','镇雄县','','','镇雄县','3','云南省','昭通市','镇雄县','云南省昭通市镇雄县',null,null,27.4415000,104.8736000),\n(637133,'530628000000','530600000000','530628','5306','彝良县','','','彝良县','3','云南省','昭通市','彝良县','云南省昭通市彝良县',null,null,27.6255100,104.0480500),\n(637288,'530629000000','530600000000','530629','5306','威信县','','','威信县','3','云南省','昭通市','威信县','云南省昭通市威信县',null,null,27.8468500,105.0490600),\n(637386,'530630000000','530600000000','530630','5306','水富县','','','水富县','3','云南省','昭通市','水富县','云南省昭通市水富县',null,null,28.6300200,104.4156200),\n(637420,'530700000000','530000000000','5307','53','丽江市','','丽江市','','2','云南省','丽江市','','云南省丽江市',null,null,26.8772100,100.2254900),\n(637421,'530701000000','530700000000','530701','5307','市辖区','','','市辖区','3','云南省','丽江市','市辖区','云南省丽江市市辖区',null,null,26.8772100,100.2254900),\n(637422,'530702000000','530700000000','530702','5307','古城区','','','古城区','3','云南省','丽江市','古城区','云南省丽江市古城区',null,null,26.8772100,100.2254900),\n(637493,'530721000000','530700000000','530721','5307','玉龙纳西族自治县','','','玉龙纳西族自治县','3','云南省','丽江市','玉龙纳西族自治县','云南省丽江市玉龙纳西族自治县',null,null,26.8215200,100.2369500),\n(637614,'530722000000','530700000000','530722','5307','永胜县','','','永胜县','3','云南省','丽江市','永胜县','云南省丽江市永胜县',null,null,26.6843100,100.7508600),\n(637780,'530723000000','530700000000','530723','5307','华坪县','','','华坪县','3','云南省','丽江市','华坪县','云南省丽江市华坪县',null,null,26.6292100,101.2663000),\n(637850,'530724000000','530700000000','530724','5307','宁蒗彝族自治县','','','宁蒗彝族自治县','3','云南省','丽江市','宁蒗彝族自治县','云南省丽江市宁蒗彝族自治县',null,null,27.2819600,100.8519800),\n(637957,'530800000000','530000000000','5308','53','普洱市','','普洱市','','2','云南省','普洱市','','云南省普洱市',null,null,22.7868400,100.9769200),\n(637958,'530801000000','530800000000','530801','5308','市辖区','','','市辖区','3','云南省','普洱市','市辖区','云南省普洱市市辖区',null,null,22.7868400,100.9769200),\n(637959,'530802000000','530800000000','530802','5308','思茅区','','','思茅区','3','云南省','普洱市','思茅区','云南省普洱市思茅区',null,null,22.7868400,100.9769200),\n(638040,'530821000000','530800000000','530821','5308','宁洱哈尼族彝族自治县','','','宁洱哈尼族彝族自治县','3','云南省','普洱市','宁洱哈尼族彝族自治县','云南省普洱市宁洱哈尼族彝族自治县',null,null,23.0616700,101.0453900),\n(638139,'530822000000','530800000000','530822','5308','墨江哈尼族自治县','','','墨江哈尼族自治县','3','云南省','普洱市','墨江哈尼族自治县','云南省普洱市墨江哈尼族自治县',null,null,23.4318500,101.6922300),\n(638323,'530823000000','530800000000','530823','5308','景东彝族自治县','','','景东彝族自治县','3','云南省','普洱市','景东彝族自治县','云南省普洱市景东彝族自治县',null,null,24.4469700,100.8339000),\n(638507,'530824000000','530800000000','530824','5308','景谷傣族彝族自治县','','','景谷傣族彝族自治县','3','云南省','普洱市','景谷傣族彝族自治县','云南省普洱市景谷傣族彝族自治县',null,null,23.4970400,100.7029000),\n(638659,'530825000000','530800000000','530825','5308','镇沅彝族哈尼族拉祜族自治县','','','镇沅彝族哈尼族拉祜族自治县','3','云南省','普洱市','镇沅彝族哈尼族拉祜族自治县','云南省普洱市镇沅彝族哈尼族拉祜族自治县',null,null,24.0046100,101.1084300),\n(638780,'530826000000','530800000000','530826','5308','江城哈尼族彝族自治县','','','江城哈尼族彝族自治县','3','云南省','普洱市','江城哈尼族彝族自治县','云南省普洱市江城哈尼族彝族自治县',null,null,22.5851800,101.8623700),\n(638839,'530827000000','530800000000','530827','5308','孟连傣族拉祜族佤族自治县','','','孟连傣族拉祜族佤族自治县','3','云南省','普洱市','孟连傣族拉祜族佤族自治县','云南省普洱市孟连傣族拉祜族佤族自治县',null,null,22.3291100,99.5844100),\n(638888,'530828000000','530800000000','530828','5308','澜沧拉祜族自治县','','','澜沧拉祜族自治县','3','云南省','普洱市','澜沧拉祜族自治县','云南省普洱市澜沧拉祜族自治县',null,null,22.5557700,99.9320800),\n(639070,'530829000000','530800000000','530829','5308','西盟佤族自治县','','','西盟佤族自治县','3','云南省','普洱市','西盟佤族自治县','云南省普洱市西盟佤族自治县',null,null,22.6443500,99.5901800),\n(639117,'530900000000','530000000000','5309','53','临沧市','','临沧市','','2','云南省','临沧市','','云南省临沧市',null,null,23.8951600,100.0823300),\n(639118,'530901000000','530900000000','530901','5309','市辖区','','','市辖区','3','云南省','临沧市','市辖区','云南省临沧市市辖区',null,null,23.8951600,100.0823300),\n(639119,'530902000000','530900000000','530902','5309','临翔区','','','临翔区','3','云南省','临沧市','临翔区','云南省临沧市临翔区',null,null,23.8951600,100.0823300),\n(639232,'530921000000','530900000000','530921','5309','凤庆县','','','凤庆县','3','云南省','临沧市','凤庆县','云南省临沧市凤庆县',null,null,24.5803800,99.9284100),\n(639433,'530922000000','530900000000','530922','5309','云县','','','云县','3','云南省','临沧市','云县','云南省临沧市云县',null,null,24.4446000,100.1311100),\n(639644,'530923000000','530900000000','530923','5309','永德县','','','永德县','3','云南省','临沧市','永德县','云南省临沧市永德县',null,null,24.0182800,99.2592900),\n(639775,'530924000000','530900000000','530924','5309','镇康县','','','镇康县','3','云南省','临沧市','镇康县','云南省临沧市镇康县',null,null,23.7631000,98.8254300),\n(639857,'530925000000','530900000000','530925','5309','双江拉祜族佤族布朗族傣族自治县','','','双江拉祜族佤族布朗族傣族自治县','3','云南省','临沧市','双江拉祜族佤族布朗族傣族自治县','云南省临沧市双江拉祜族佤族布朗族傣族自治县',null,null,23.4736000,99.8276800),\n(639939,'530926000000','530900000000','530926','5309','耿马傣族佤族自治县','','','耿马傣族佤族自治县','3','云南省','临沧市','耿马傣族佤族自治县','云南省临沧市耿马傣族佤族自治县',null,null,23.5378600,99.3976700),\n(640044,'530927000000','530900000000','530927','5309','沧源佤族自治县','','','沧源佤族自治县','3','云南省','临沧市','沧源佤族自治县','云南省临沧市沧源佤族自治县',null,null,23.1468100,99.2458300),\n(640152,'532300000000','530000000000','5323','53','楚雄彝族自治州','','楚雄彝族自治州','','2','云南省','楚雄彝族自治州','','云南省楚雄彝族自治州',null,null,25.0449500,101.5276700),\n(640153,'532301000000','532300000000','532301','5323','楚雄市','','','楚雄市','3','云南省','楚雄彝族自治州','楚雄市','云南省楚雄彝族自治州楚雄市',null,null,25.0328800,101.5458200),\n(640323,'532322000000','532300000000','532322','5323','双柏县','','','双柏县','3','云南省','楚雄彝族自治州','双柏县','云南省楚雄彝族自治州双柏县',null,null,24.6888400,101.6420600),\n(640416,'532323000000','532300000000','532323','5323','牟定县','','','牟定县','3','云南省','楚雄彝族自治州','牟定县','云南省楚雄彝族自治州牟定县',null,null,25.3124100,101.5469700),\n(640513,'532324000000','532300000000','532324','5323','南华县','','','南华县','3','云南省','楚雄彝族自治州','南华县','云南省楚雄彝族自治州南华县',null,null,25.1922900,101.2735400),\n(640652,'532325000000','532300000000','532325','5323','姚安县','','','姚安县','3','云南省','楚雄彝族自治州','姚安县','云南省楚雄彝族自治州姚安县',null,null,25.5042300,101.2415800),\n(640739,'532326000000','532300000000','532326','5323','大姚县','','','大姚县','3','云南省','楚雄彝族自治州','大姚县','云南省楚雄彝族自治州大姚县',null,null,25.7217900,101.3244000),\n(640881,'532327000000','532300000000','532327','5323','永仁县','','','永仁县','3','云南省','楚雄彝族自治州','永仁县','云南省楚雄彝族自治州永仁县',null,null,26.0561500,101.6698200),\n(640952,'532328000000','532300000000','532328','5323','元谋县','','','元谋县','3','云南省','楚雄彝族自治州','元谋县','云南省楚雄彝族自治州元谋县',null,null,25.7043600,101.8744900),\n(641041,'532329000000','532300000000','532329','5323','武定县','','','武定县','3','云南省','楚雄彝族自治州','武定县','云南省楚雄彝族自治州武定县',null,null,25.5303800,102.4044200),\n(641186,'532331000000','532300000000','532331','5323','禄丰县','','','禄丰县','3','云南省','楚雄彝族自治州','禄丰县','云南省楚雄彝族自治州禄丰县',null,null,25.1499800,102.0790000),\n(641366,'532500000000','530000000000','5325','53','红河哈尼族彝族自治州','','红河哈尼族彝族自治州','','2','云南省','红河哈尼族彝族自治州','','云南省红河哈尼族彝族自治州',null,null,23.3642200,103.3756000),\n(641367,'532501000000','532500000000','532501','5325','个旧市','','','个旧市','3','云南省','红河哈尼族彝族自治州','个旧市','云南省红河哈尼族彝族自治州个旧市',null,null,23.3589900,103.1600400),\n(641494,'532502000000','532500000000','532502','5325','开远市','','','开远市','3','云南省','红河哈尼族彝族自治州','开远市','云南省红河哈尼族彝族自治州开远市',null,null,23.7143400,103.2667600),\n(641580,'532503000000','532500000000','532503','5325','蒙自市','','','蒙自市','3','云南省','红河哈尼族彝族自治州','蒙自市','云南省红河哈尼族彝族自治州蒙自市',null,null,23.3962200,103.3648100),\n(641693,'532504000000','532500000000','532504','5325','弥勒市','','','弥勒市','3','云南省','红河哈尼族彝族自治州','弥勒市','云南省红河哈尼族彝族自治州弥勒市',null,null,24.4105900,103.4149900),\n(641843,'532523000000','532500000000','532523','5325','屏边苗族自治县','','','屏边苗族自治县','3','云南省','红河哈尼族彝族自治州','屏边苗族自治县','云南省红河哈尼族彝族自治州屏边苗族自治县',null,null,22.9837200,103.6872100),\n(641931,'532524000000','532500000000','532524','5325','建水县','','','建水县','3','云南省','红河哈尼族彝族自治州','建水县','云南省红河哈尼族彝族自治州建水县',null,null,23.6349900,102.8269900),\n(642100,'532525000000','532500000000','532525','5325','石屏县','','','石屏县','3','云南省','红河哈尼族彝族自治州','石屏县','云南省红河哈尼族彝族自治州石屏县',null,null,23.7055600,102.4962100),\n(642225,'532527000000','532500000000','532527','5325','泸西县','','','泸西县','3','云南省','红河哈尼族彝族自治州','泸西县','云南省红河哈尼族彝族自治州泸西县',null,null,24.5321000,103.7662300),\n(642321,'532528000000','532500000000','532528','5325','元阳县','','','元阳县','3','云南省','红河哈尼族彝族自治州','元阳县','云南省红河哈尼族彝族自治州元阳县',null,null,23.2199900,102.8352800),\n(642474,'532529000000','532500000000','532529','5325','红河县','','','红河县','3','云南省','红河哈尼族彝族自治州','红河县','云南省红河哈尼族彝族自治州红河县',null,null,23.3690700,102.4207900),\n(642579,'532530000000','532500000000','532530','5325','金平苗族瑶族傣族自治县','','','金平苗族瑶族傣族自治县','3','云南省','红河哈尼族彝族自治州','金平苗族瑶族傣族自治县','云南省红河哈尼族彝族自治州金平苗族瑶族傣族自治县',null,null,22.7796600,103.2264800),\n(642691,'532531000000','532500000000','532531','5325','绿春县','','','绿春县','3','云南省','红河哈尼族彝族自治州','绿春县','云南省红河哈尼族彝族自治州绿春县',null,null,22.9934600,102.3929300),\n(642793,'532532000000','532500000000','532532','5325','河口瑶族自治县','','','河口瑶族自治县','3','云南省','红河哈尼族彝族自治州','河口瑶族自治县','云南省红河哈尼族彝族自治州河口瑶族自治县',null,null,22.5293100,103.9393600),\n(642834,'532600000000','530000000000','5326','53','文山壮族苗族自治州','','文山壮族苗族自治州','','2','云南省','文山壮族苗族自治州','','云南省文山壮族苗族自治州',null,null,23.3984900,104.2150400),\n(642835,'532601000000','532600000000','532601','5326','文山市','','','文山市','3','云南省','文山壮族苗族自治州','文山市','云南省文山壮族苗族自治州文山市',null,null,23.3867800,104.2330000),\n(642996,'532622000000','532600000000','532622','5326','砚山县','','','砚山县','3','云南省','文山壮族苗族自治州','砚山县','云南省文山壮族苗族自治州砚山县',null,null,23.6058600,104.3370900),\n(643116,'532623000000','532600000000','532623','5326','西畴县','','','西畴县','3','云南省','文山壮族苗族自治州','西畴县','云南省文山壮族苗族自治州西畴县',null,null,23.4371200,104.6722000),\n(643198,'532624000000','532600000000','532624','5326','麻栗坡县','','','麻栗坡县','3','云南省','文山壮族苗族自治州','麻栗坡县','云南省文山壮族苗族自治州麻栗坡县',null,null,23.1252500,104.7025200),\n(643312,'532625000000','532600000000','532625','5326','马关县','','','马关县','3','云南省','文山壮族苗族自治州','马关县','云南省文山壮族苗族自治州马关县',null,null,23.0129800,104.3938700),\n(643458,'532626000000','532600000000','532626','5326','丘北县','','','丘北县','3','云南省','文山壮族苗族自治州','丘北县','云南省文山壮族苗族自治州丘北县',null,null,24.0418600,104.1958100),\n(643572,'532627000000','532600000000','532627','5326','广南县','','','广南县','3','云南省','文山壮族苗族自治州','广南县','云南省文山壮族苗族自治州广南县',null,null,24.0464500,105.0551600),\n(643765,'532628000000','532600000000','532628','5326','富宁县','','','富宁县','3','云南省','文山壮族苗族自治州','富宁县','云南省文山壮族苗族自治州富宁县',null,null,23.6253900,105.6305300),\n(643924,'532800000000','530000000000','5328','53','西双版纳傣族自治州','','西双版纳傣族自治州','','2','云南省','西双版纳傣族自治州','','云南省西双版纳傣族自治州',null,null,22.0074900,100.7973900),\n(643925,'532801000000','532800000000','532801','5328','景洪市','','','景洪市','3','云南省','西双版纳傣族自治州','景洪市','云南省西双版纳傣族自治州景洪市',null,null,22.0000800,100.7716300),\n(644056,'532822000000','532800000000','532822','5328','勐海县','','','勐海县','3','云南省','西双版纳傣族自治州','勐海县','云南省西双版纳傣族自治州勐海县',null,null,21.9575300,100.4522300),\n(644161,'532823000000','532800000000','532823','5328','勐腊县','','','勐腊县','3','云南省','西双版纳傣族自治州','勐腊县','云南省西双版纳傣族自治州勐腊县',null,null,21.4594100,101.5646100),\n(644239,'532900000000','530000000000','5329','53','大理白族自治州','','大理白族自治州','','2','云南省','大理白族自治州','','云南省大理白族自治州',null,null,25.6064800,100.2676400),\n(644240,'532901000000','532900000000','532901','5329','大理市','','','大理市','3','云南省','大理白族自治州','大理市','云南省大理白族自治州大理市',null,null,25.5915800,100.2297600),\n(644396,'532922000000','532900000000','532922','5329','漾濞彝族自治县','','','漾濞彝族自治县','3','云南省','大理白族自治州','漾濞彝族自治县','云南省大理白族自治州漾濞彝族自治县',null,null,25.6699200,99.9581400),\n(644472,'532923000000','532900000000','532923','5329','祥云县','','','祥云县','3','云南省','大理白族自治州','祥云县','云南省大理白族自治州祥云县',null,null,25.4838100,100.5505900),\n(644622,'532924000000','532900000000','532924','5329','宾川县','','','宾川县','3','云南省','大理白族自治州','宾川县','云南省大理白族自治州宾川县',null,null,25.8270000,100.5726500),\n(644723,'532925000000','532900000000','532925','5329','弥渡县','','','弥渡县','3','云南省','大理白族自治州','弥渡县','云南省大理白族自治州弥渡县',null,null,25.3436500,100.4913100),\n(644821,'532926000000','532900000000','532926','5329','南涧彝族自治县','','','南涧彝族自治县','3','云南省','大理白族自治州','南涧彝族自治县','云南省大理白族自治州南涧彝族自治县',null,null,25.0428200,100.5097400),\n(644911,'532927000000','532900000000','532927','5329','巍山彝族回族自治县','','','巍山彝族回族自治县','3','云南省','大理白族自治州','巍山彝族回族自治县','云南省大理白族自治州巍山彝族回族自治县',null,null,25.2271400,100.3071100),\n(645005,'532928000000','532900000000','532928','5329','永平县','','','永平县','3','云南省','大理白族自治州','永平县','云南省大理白族自治州永平县',null,null,25.4645400,99.5409800),\n(645088,'532929000000','532900000000','532929','5329','云龙县','','','云龙县','3','云南省','大理白族自治州','云龙县','云南省大理白族自治州云龙县',null,null,25.8857300,99.3709600),\n(645186,'532930000000','532900000000','532930','5329','洱源县','','','洱源县','3','云南省','大理白族自治州','洱源县','云南省大理白族自治州洱源县',null,null,26.1111300,99.9508800),\n(645286,'532931000000','532900000000','532931','5329','剑川县','','','剑川县','3','云南省','大理白族自治州','剑川县','云南省大理白族自治州剑川县',null,null,26.5369200,99.9055000),\n(645388,'532932000000','532900000000','532932','5329','鹤庆县','','','鹤庆县','3','云南省','大理白族自治州','鹤庆县','云南省大理白族自治州鹤庆县',null,null,26.5601300,100.1764400),\n(645515,'533100000000','530000000000','5331','53','德宏傣族景颇族自治州','','德宏傣族景颇族自治州','','2','云南省','德宏傣族景颇族自治州','','云南省德宏傣族景颇族自治州',null,null,24.4323200,98.5848600),\n(645516,'533102000000','533100000000','533102','5331','瑞丽市','','','瑞丽市','3','云南省','德宏傣族景颇族自治州','瑞丽市','云南省德宏傣族景颇族自治州瑞丽市',null,null,24.0127800,97.8518900),\n(645563,'533103000000','533100000000','533103','5331','芒市','','','芒市','3','云南省','德宏傣族景颇族自治州','芒市','云南省德宏傣族景颇族自治州芒市',null,null,24.4337900,98.5881500),\n(645674,'533122000000','533100000000','533122','5331','梁河县','','','梁河县','3','云南省','德宏傣族景颇族自治州','梁河县','云南省德宏傣族景颇族自治州梁河县',null,null,24.8043500,98.2967000),\n(645750,'533123000000','533100000000','533123','5331','盈江县','','','盈江县','3','云南省','德宏傣族景颇族自治州','盈江县','云南省德宏傣族景颇族自治州盈江县',null,null,24.7051900,97.9318400),\n(645869,'533124000000','533100000000','533124','5331','陇川县','','','陇川县','3','云南省','德宏傣族景颇族自治州','陇川县','云南省德宏傣族景颇族自治州陇川县',null,null,24.1830500,97.7920300),\n(645952,'533300000000','530000000000','5333','53','怒江傈僳族自治州','','怒江傈僳族自治州','','2','云南省','怒江傈僳族自治州','','云南省怒江傈僳族自治州',null,null,25.8176300,98.8567000),\n(645953,'533301000000','533300000000','533301','5333','泸水市','','','泸水市','3','云南省','怒江傈僳族自治州','泸水市','云南省怒江傈僳族自治州泸水市',null,null,25.8230600,98.8580400),\n(646040,'533323000000','533300000000','533323','5333','福贡县','','','福贡县','3','云南省','怒江傈僳族自治州','福贡县','云南省怒江傈僳族自治州福贡县',null,null,26.9018500,98.8690500),\n(646107,'533324000000','533300000000','533324','5333','贡山独龙族怒族自治县','','','贡山独龙族怒族自治县','3','云南省','怒江傈僳族自治州','贡山独龙族怒族自治县','云南省怒江傈僳族自治州贡山独龙族怒族自治县',null,null,27.7410400,98.6657900),\n(646141,'533325000000','533300000000','533325','5333','兰坪白族普米族自治县','','','兰坪白族普米族自治县','3','云南省','怒江傈僳族自治州','兰坪白族普米族自治县','云南省怒江傈僳族自治州兰坪白族普米族自治县',null,null,26.4535300,99.4167100),\n(646258,'533400000000','530000000000','5334','53','迪庆藏族自治州','','迪庆藏族自治州','','2','云南省','迪庆藏族自治州','','云南省迪庆藏族自治州',null,null,27.8190800,99.7030500),\n(646259,'533401000000','533400000000','533401','5334','香格里拉市','','','香格里拉市','3','云南省','迪庆藏族自治州','香格里拉市','云南省迪庆藏族自治州香格里拉市',null,null,27.8303100,99.7009000),\n(646335,'533422000000','533400000000','533422','5334','德钦县','','','德钦县','3','云南省','迪庆藏族自治州','德钦县','云南省迪庆藏族自治州德钦县',null,null,28.4635700,98.9169900),\n(646390,'533423000000','533400000000','533423','5334','维西傈僳族自治县','','','维西傈僳族自治县','3','云南省','迪庆藏族自治州','维西傈僳族自治县','云南省迪庆藏族自治州维西傈僳族自治县',null,null,27.1773900,99.2870500),\n(646483,'540000000000','0','54','0','西藏自治区','西藏自治区','','','1','西藏自治区','','','西藏自治区',null,null,null,null),\n(646484,'540100000000','540000000000','5401','54','拉萨市','','拉萨市','','2','西藏自治区','拉萨市','','西藏自治区拉萨市',null,null,29.6526200,91.1377500),\n(646485,'540101000000','540100000000','540101','5401','市辖区','','','市辖区','3','西藏自治区','拉萨市','市辖区','西藏自治区拉萨市市辖区',null,null,29.6526200,91.1377500),\n(646486,'540102000000','540100000000','540102','5401','城关区','','','城关区','3','西藏自治区','拉萨市','城关区','西藏自治区拉萨市城关区',null,null,29.6526200,91.1377500),\n(646550,'540103000000','540100000000','540103','5401','堆龙德庆区','','','堆龙德庆区','3','西藏自治区','拉萨市','堆龙德庆区','西藏自治区拉萨市堆龙德庆区',null,null,29.6460200,91.0033800),\n(646592,'540121000000','540100000000','540121','5401','林周县','','','林周县','3','西藏自治区','拉萨市','林周县','西藏自治区拉萨市林周县',null,null,29.8946900,91.2619000),\n(646648,'540122000000','540100000000','540122','5401','当雄县','','','当雄县','3','西藏自治区','拉萨市','当雄县','西藏自治区拉萨市当雄县',null,null,30.4719200,91.1013000),\n(646685,'540123000000','540100000000','540123','5401','尼木县','','','尼木县','3','西藏自治区','拉萨市','尼木县','西藏自治区拉萨市尼木县',null,null,29.4318400,90.1646400),\n(646726,'540124000000','540100000000','540124','5401','曲水县','','','曲水县','3','西藏自治区','拉萨市','曲水县','西藏自治区拉萨市曲水县',null,null,29.3530000,90.7436700),\n(646752,'540126000000','540100000000','540126','5401','达孜县','','','达孜县','3','西藏自治区','拉萨市','达孜县','西藏自治区拉萨市达孜县',null,null,29.6693300,91.3497900),\n(646779,'540127000000','540100000000','540127','5401','墨竹工卡县','','','墨竹工卡县','3','西藏自治区','拉萨市','墨竹工卡县','西藏自治区拉萨市墨竹工卡县',null,null,29.8337500,91.7306500),\n(646828,'540171000000','540100000000','540171','5401','格尔木藏青工业园区','','','格尔木藏青工业园区','3','西藏自治区','拉萨市','格尔木藏青工业园区','西藏自治区拉萨市格尔木藏青工业园区',null,null,29.6526200,91.1377500),\n(646831,'540172000000','540100000000','540172','5401','拉萨经济技术开发区','','','拉萨经济技术开发区','3','西藏自治区','拉萨市','拉萨经济技术开发区','西藏自治区拉萨市拉萨经济技术开发区',null,null,29.6446570,91.0234380),\n(646834,'540173000000','540100000000','540173','5401','西藏文化旅游创意园区','','','西藏文化旅游创意园区','3','西藏自治区','拉萨市','西藏文化旅游创意园区','西藏自治区拉萨市西藏文化旅游创意园区',null,null,29.6151960,91.1415710),\n(646837,'540174000000','540100000000','540174','5401','达孜工业园区','','','达孜工业园区','3','西藏自治区','拉萨市','达孜工业园区','西藏自治区拉萨市达孜工业园区',null,null,29.6673950,91.3331380),\n(646840,'540200000000','540000000000','5402','54','日喀则市','','日喀则市','','2','西藏自治区','日喀则市','','西藏自治区日喀则市',null,null,29.2696900,88.8869700),\n(646841,'540202000000','540200000000','540202','5402','桑珠孜区','','','桑珠孜区','3','西藏自治区','日喀则市','桑珠孜区','西藏自治区日喀则市桑珠孜区',null,null,29.2696900,88.8869700),\n(647030,'540221000000','540200000000','540221','5402','南木林县','','','南木林县','3','西藏自治区','日喀则市','南木林县','西藏自治区日喀则市南木林县',null,null,29.6822400,89.0993600),\n(647194,'540222000000','540200000000','540222','5402','江孜县','','','江孜县','3','西藏自治区','日喀则市','江孜县','西藏自治区日喀则市江孜县',null,null,28.9115200,89.6055800),\n(647369,'540223000000','540200000000','540223','5402','定日县','','','定日县','3','西藏自治区','日喀则市','定日县','西藏自治区日喀则市定日县',null,null,28.6587400,87.1260700),\n(647558,'540224000000','540200000000','540224','5402','萨迦县','','','萨迦县','3','西藏自治区','日喀则市','萨迦县','西藏自治区日喀则市萨迦县',null,null,28.8991900,88.0217200),\n(647677,'540225000000','540200000000','540225','5402','拉孜县','','','拉孜县','3','西藏自治区','日喀则市','拉孜县','西藏自治区日喀则市拉孜县',null,null,29.0816400,87.6371800),\n(647787,'540226000000','540200000000','540226','5402','昂仁县','','','昂仁县','3','西藏自治区','日喀则市','昂仁县','西藏自治区日喀则市昂仁县',null,null,29.2948200,87.2361700),\n(647990,'540227000000','540200000000','540227','5402','谢通门县','','','谢通门县','3','西藏自治区','日喀则市','谢通门县','西藏自治区日喀则市谢通门县',null,null,29.4323400,88.2616600),\n(648105,'540228000000','540200000000','540228','5402','白朗县','','','白朗县','3','西藏自治区','日喀则市','白朗县','西藏自治区日喀则市白朗县',null,null,29.1076500,89.2618200),\n(648228,'540229000000','540200000000','540229','5402','仁布县','','','仁布县','3','西藏自治区','日喀则市','仁布县','西藏自治区日喀则市仁布县',null,null,29.2308900,89.8420000),\n(648311,'540230000000','540200000000','540230','5402','康马县','','','康马县','3','西藏自治区','日喀则市','康马县','西藏自治区日喀则市康马县',null,null,28.5556700,89.6816900),\n(648368,'540231000000','540200000000','540231','5402','定结县','','','定结县','3','西藏自治区','日喀则市','定结县','西藏自治区日喀则市定结县',null,null,28.3640800,87.7660600),\n(648449,'540232000000','540200000000','540232','5402','仲巴县','','','仲巴县','3','西藏自治区','日喀则市','仲巴县','西藏自治区日喀则市仲巴县',null,null,29.7241900,84.0245400),\n(648521,'540233000000','540200000000','540233','5402','亚东县','','','亚东县','3','西藏自治区','日喀则市','亚东县','西藏自治区日喀则市亚东县',null,null,27.4859200,88.9070800),\n(648554,'540234000000','540200000000','540234','5402','吉隆县','','','吉隆县','3','西藏自治区','日喀则市','吉隆县','西藏自治区日喀则市吉隆县',null,null,28.8525400,85.2973700),\n(648602,'540235000000','540200000000','540235','5402','聂拉木县','','','聂拉木县','3','西藏自治区','日喀则市','聂拉木县','西藏自治区日喀则市聂拉木县',null,null,28.1549900,85.9823200),\n(648654,'540236000000','540200000000','540236','5402','萨嘎县','','','萨嘎县','3','西藏自治区','日喀则市','萨嘎县','西藏自治区日喀则市萨嘎县',null,null,29.3294300,85.2342100),\n(648701,'540237000000','540200000000','540237','5402','岗巴县','','','岗巴县','3','西藏自治区','日喀则市','岗巴县','西藏自治区日喀则市岗巴县',null,null,28.2746000,88.5201500),\n(648736,'540300000000','540000000000','5403','54','昌都市','','昌都市','','2','西藏自治区','昌都市','','西藏自治区昌都市',null,null,31.1383100,97.1803900),\n(648737,'540302000000','540300000000','540302','5403','卡若区','','','卡若区','3','西藏自治区','昌都市','卡若区','西藏自治区昌都市卡若区',null,null,31.1383100,97.1803900),\n(648920,'540321000000','540300000000','540321','5403','江达县','','','江达县','3','西藏自治区','昌都市','江达县','西藏自治区昌都市江达县',null,null,31.4996800,98.2182200),\n(649029,'540322000000','540300000000','540322','5403','贡觉县','','','贡觉县','3','西藏自治区','昌都市','贡觉县','西藏自治区昌都市贡觉县',null,null,30.8601600,98.2708000),\n(649191,'540323000000','540300000000','540323','5403','类乌齐县','','','类乌齐县','3','西藏自治区','昌都市','类乌齐县','西藏自治区昌都市类乌齐县',null,null,31.2115500,96.6002000),\n(649284,'540324000000','540300000000','540324','5403','丁青县','','','丁青县','3','西藏自治区','昌都市','丁青县','西藏自治区昌都市丁青县',null,null,31.4125000,95.5957200),\n(649362,'540325000000','540300000000','540325','5403','察雅县','','','察雅县','3','西藏自治区','昌都市','察雅县','西藏自治区昌都市察雅县',null,null,30.6536300,97.5687700),\n(649514,'540326000000','540300000000','540326','5403','八宿县','','','八宿县','3','西藏自治区','昌都市','八宿县','西藏自治区昌都市八宿县',null,null,30.0532000,96.9178500),\n(649639,'540327000000','540300000000','540327','5403','左贡县','','','左贡县','3','西藏自治区','昌都市','左贡县','西藏自治区昌都市左贡县',null,null,29.6709100,97.8408500),\n(649778,'540328000000','540300000000','540328','5403','芒康县','','','芒康县','3','西藏自治区','昌都市','芒康县','西藏自治区昌都市芒康县',null,null,29.6800800,98.5931200),\n(649856,'540329000000','540300000000','540329','5403','洛隆县','','','洛隆县','3','西藏自治区','昌都市','洛隆县','西藏自治区昌都市洛隆县',null,null,30.7418100,95.8248200),\n(649934,'540330000000','540300000000','540330','5403','边坝县','','','边坝县','3','西藏自治区','昌都市','边坝县','西藏自治区昌都市边坝县',null,null,30.9334500,94.7079000),\n(650028,'540400000000','540000000000','5404','54','林芝市','','林芝市','','2','西藏自治区','林芝市','','西藏自治区林芝市',null,null,29.6365400,94.3611900),\n(650029,'540402000000','540400000000','540402','5404','巴宜区','','','巴宜区','3','西藏自治区','林芝市','巴宜区','西藏自治区林芝市巴宜区',null,null,29.6365400,94.3611900),\n(650110,'540421000000','540400000000','540421','5404','工布江达县','','','工布江达县','3','西藏自治区','林芝市','工布江达县','西藏自治区林芝市工布江达县',null,null,29.8853100,93.2461100),\n(650200,'540422000000','540400000000','540422','5404','米林县','','','米林县','3','西藏自治区','林芝市','米林县','西藏自治区林芝市米林县',null,null,29.2160700,94.2131500),\n(650276,'540423000000','540400000000','540423','5404','墨脱县','','','墨脱县','3','西藏自治区','林芝市','墨脱县','西藏自治区林芝市墨脱县',null,null,29.3252100,95.3330400),\n(650331,'540424000000','540400000000','540424','5404','波密县','','','波密县','3','西藏自治区','林芝市','波密县','西藏自治区林芝市波密县',null,null,29.8590300,95.7676100),\n(650427,'540425000000','540400000000','540425','5404','察隅县','','','察隅县','3','西藏自治区','林芝市','察隅县','西藏自治区林芝市察隅县',null,null,28.6615400,97.4668700),\n(650531,'540426000000','540400000000','540426','5404','朗县','','','朗县','3','西藏自治区','林芝市','朗县','西藏自治区林芝市朗县',null,null,29.0460700,93.0748200),\n(650590,'540500000000','540000000000','5405','54','山南市','','山南市','','2','西藏自治区','山南市','','西藏自治区山南市',null,null,29.2248400,91.7614100),\n(650591,'540501000000','540500000000','540501','5405','市辖区','','','市辖区','3','西藏自治区','山南市','市辖区','西藏自治区山南市市辖区',null,null,29.2248400,91.7614100),\n(650592,'540502000000','540500000000','540502','5405','乃东区','','','乃东区','3','西藏自治区','山南市','乃东区','西藏自治区山南市乃东区',null,null,29.2248400,91.7614100),\n(650647,'540521000000','540500000000','540521','5405','扎囊县','','','扎囊县','3','西藏自治区','山南市','扎囊县','西藏自治区山南市扎囊县',null,null,29.2450000,91.3373500),\n(650715,'540522000000','540500000000','540522','5405','贡嘎县','','','贡嘎县','3','西藏自治区','山南市','贡嘎县','西藏自治区山南市贡嘎县',null,null,29.2894700,90.9842100),\n(650767,'540523000000','540500000000','540523','5405','桑日县','','','桑日县','3','西藏自治区','山南市','桑日县','西藏自治区山南市桑日县',null,null,29.2590600,92.0157900),\n(650814,'540524000000','540500000000','540524','5405','琼结县','','','琼结县','3','西藏自治区','山南市','琼结县','西藏自治区山南市琼结县',null,null,29.0246400,91.6838500),\n(650839,'540525000000','540500000000','540525','5405','曲松县','','','曲松县','3','西藏自治区','山南市','曲松县','西藏自治区山南市曲松县',null,null,29.0627700,92.2022200),\n(650866,'540526000000','540500000000','540526','5405','措美县','','','措美县','3','西藏自治区','山南市','措美县','西藏自治区山南市措美县',null,null,28.4379300,91.4336100),\n(650887,'540527000000','540500000000','540527','5405','洛扎县','','','洛扎县','3','西藏自治区','山南市','洛扎县','西藏自治区山南市洛扎县',null,null,28.3856900,90.8599800),\n(650922,'540528000000','540500000000','540528','5405','加查县','','','加查县','3','西藏自治区','山南市','加查县','西藏自治区山南市加查县',null,null,29.1402300,92.5938700),\n(651007,'540529000000','540500000000','540529','5405','隆子县','','','隆子县','3','西藏自治区','山南市','隆子县','西藏自治区山南市隆子县',null,null,28.4068100,92.4617700),\n(651099,'540530000000','540500000000','540530','5405','错那县','','','错那县','3','西藏自治区','山南市','错那县','西藏自治区山南市错那县',null,null,27.9909900,91.9571000),\n(651134,'540531000000','540500000000','540531','5405','浪卡子县','','','浪卡子县','3','西藏自治区','山南市','浪卡子县','西藏自治区山南市浪卡子县',null,null,28.9681800,90.3980900),\n(651243,'542400000000','540000000000','5424','54','那曲地区','','那曲地区','','2','西藏自治区','那曲地区','','西藏自治区那曲地区',null,null,31.4761400,92.0513600),\n(651244,'542421000000','542400000000','542421','5424','那曲县','','','那曲县','3','西藏自治区','那曲地区','那曲县','西藏自治区那曲地区那曲县',null,null,31.4698800,92.0535500),\n(651398,'542422000000','542400000000','542422','5424','嘉黎县','','','嘉黎县','3','西藏自治区','那曲地区','嘉黎县','西藏自治区那曲地区嘉黎县',null,null,30.6408700,93.2323600),\n(651531,'542423000000','542400000000','542423','5424','比如县','','','比如县','3','西藏自治区','那曲地区','比如县','西藏自治区那曲地区比如县',null,null,31.4778500,93.6813000),\n(651717,'542424000000','542400000000','542424','5424','聂荣县','','','聂荣县','3','西藏自治区','那曲地区','聂荣县','西藏自治区那曲地区聂荣县',null,null,32.1078400,92.3032700),\n(651870,'542425000000','542400000000','542425','5424','安多县','','','安多县','3','西藏自治区','那曲地区','安多县','西藏自治区那曲地区安多县',null,null,32.2650000,91.6825800),\n(651958,'542426000000','542400000000','542426','5424','申扎县','','','申扎县','3','西藏自治区','那曲地区','申扎县','西藏自治区那曲地区申扎县',null,null,30.9304300,88.7098200),\n(652029,'542427000000','542400000000','542427','5424','索县','','','索县','3','西藏自治区','那曲地区','索县','西藏自治区那曲地区索县',null,null,31.8867300,93.7855600),\n(652164,'542428000000','542400000000','542428','5424','班戈县','','','班戈县','3','西藏自治区','那曲地区','班戈县','西藏自治区那曲地区班戈县',null,null,31.3919900,90.0098700),\n(652261,'542429000000','542400000000','542429','5424','巴青县','','','巴青县','3','西藏自治区','那曲地区','巴青县','西藏自治区那曲地区巴青县',null,null,31.9184000,94.0534500),\n(652428,'542430000000','542400000000','542430','5424','尼玛县','','','尼玛县','3','西藏自治区','那曲地区','尼玛县','西藏自治区那曲地区尼玛县',null,null,31.7844800,87.2369100),\n(652520,'542431000000','542400000000','542431','5424','双湖县','','','双湖县','3','西藏自治区','那曲地区','双湖县','西藏自治区那曲地区双湖县',null,null,33.1876300,88.8369100),\n(652559,'542500000000','540000000000','5425','54','阿里地区','','阿里地区','','2','西藏自治区','阿里地区','','西藏自治区阿里地区',null,null,30.4005100,81.1454000),\n(652560,'542521000000','542500000000','542521','5425','普兰县','','','普兰县','3','西藏自治区','阿里地区','普兰县','西藏自治区阿里地区普兰县',null,null,30.2932600,81.1773900),\n(652574,'542522000000','542500000000','542522','5425','札达县','','','札达县','3','西藏自治区','阿里地区','札达县','西藏自治区阿里地区札达县',null,null,31.4786500,79.8032100),\n(652598,'542523000000','542500000000','542523','5425','噶尔县','','','噶尔县','3','西藏自治区','阿里地区','噶尔县','西藏自治区阿里地区噶尔县',null,null,32.5002800,80.0959000),\n(652618,'542524000000','542500000000','542524','5425','日土县','','','日土县','3','西藏自治区','阿里地区','日土县','西藏自治区阿里地区日土县',null,null,33.3874700,79.7131700),\n(652637,'542525000000','542500000000','542525','5425','革吉县','','','革吉县','3','西藏自治区','阿里地区','革吉县','西藏自治区阿里地区革吉县',null,null,32.3964500,81.1510600),\n(652662,'542526000000','542500000000','542526','5425','改则县','','','改则县','3','西藏自治区','阿里地区','改则县','西藏自治区阿里地区改则县',null,null,32.3045500,84.0630500),\n(652718,'542527000000','542500000000','542527','5425','措勤县','','','措勤县','3','西藏自治区','阿里地区','措勤县','西藏自治区阿里地区措勤县',null,null,31.0164000,85.1525300),\n(652745,'610000000000','0','61','0','陕西省','陕西省','','','1','陕西省','','','陕西省',null,null,null,null),\n(652746,'610100000000','610000000000','6101','61','西安市','','西安市','','2','陕西省','西安市','','陕西省西安市',null,null,34.2305300,108.9342500),\n(652747,'610101000000','610100000000','610101','6101','市辖区','','','市辖区','3','陕西省','西安市','市辖区','陕西省西安市市辖区',null,null,34.2305300,108.9342500),\n(652748,'610102000000','610100000000','610102','6101','新城区','','','新城区','3','陕西省','西安市','新城区','陕西省西安市新城区',null,null,34.2666500,108.9607400),\n(652859,'610103000000','610100000000','610103','6101','碑林区','','','碑林区','3','陕西省','西安市','碑林区','陕西省西安市碑林区',null,null,34.2305300,108.9342500),\n(652966,'610104000000','610100000000','610104','6101','莲湖区','','','莲湖区','3','陕西省','西安市','莲湖区','陕西省西安市莲湖区',null,null,34.2670300,108.9402000),\n(653107,'610111000000','610100000000','610111','6101','灞桥区','','','灞桥区','3','陕西省','西安市','灞桥区','陕西省西安市灞桥区',null,null,34.2727000,109.0645800),\n(653377,'610112000000','610100000000','610112','6101','未央区','','','未央区','3','陕西省','西安市','未央区','陕西省西安市未央区',null,null,34.2931800,108.9471200),\n(653652,'610113000000','610100000000','610113','6101','雁塔区','','','雁塔区','3','陕西省','西安市','雁塔区','陕西省西安市雁塔区',null,null,34.2225900,108.9487800),\n(653879,'610114000000','610100000000','610114','6101','阎良区','','','阎良区','3','陕西省','西安市','阎良区','陕西省西安市阎良区',null,null,34.6622500,109.2262000),\n(653986,'610115000000','610100000000','610115','6101','临潼区','','','临潼区','3','陕西省','西安市','临潼区','陕西省西安市临潼区',null,null,34.3667000,109.2142100),\n(654278,'610116000000','610100000000','610116','6101','长安区','','','长安区','3','陕西省','西安市','长安区','陕西省西安市长安区',null,null,34.1577500,108.9068800),\n(654810,'610117000000','610100000000','610117','6101','高陵区','','','高陵区','3','陕西省','西安市','高陵区','陕西省西安市高陵区',null,null,34.5348700,109.0882200),\n(654921,'610118000000','610100000000','610118','6101','鄠邑区','','','鄠邑区','3','陕西省','西安市','鄠邑区','陕西省西安市鄠邑区',null,null,34.1084700,108.6049400),\n(655217,'610122000000','610100000000','610122','6101','蓝田县','','','蓝田县','3','陕西省','西安市','蓝田县','陕西省西安市蓝田县',null,null,34.1513200,109.3234500),\n(655584,'610124000000','610100000000','610124','6101','周至县','','','周至县','3','陕西省','西安市','周至县','陕西省西安市周至县',null,null,34.1634000,108.2221300),\n(655885,'610200000000','610000000000','6102','61','铜川市','','铜川市','','2','陕西省','铜川市','','陕西省铜川市',null,null,35.0691400,109.0759300),\n(655886,'610201000000','610200000000','610201','6102','市辖区','','','市辖区','3','陕西省','铜川市','市辖区','陕西省铜川市市辖区',null,null,35.0691400,109.0759300),\n(655887,'610202000000','610200000000','610202','6102','王益区','','','王益区','3','陕西省','铜川市','王益区','陕西省铜川市王益区',null,null,35.0691400,109.0759300),\n(655941,'610203000000','610200000000','610203','6102','印台区','','','印台区','3','陕西省','铜川市','印台区','陕西省铜川市印台区',null,null,35.1147300,109.0998600),\n(656047,'610204000000','610200000000','610204','6102','耀州区','','','耀州区','3','陕西省','铜川市','耀州区','陕西省铜川市耀州区',null,null,34.9097800,108.9801100),\n(656229,'610222000000','610200000000','610222','6102','宜君县','','','宜君县','3','陕西省','铜川市','宜君县','陕西省铜川市宜君县',null,null,35.3987700,109.1168900),\n(656357,'610300000000','610000000000','6103','61','宝鸡市','','宝鸡市','','2','陕西省','宝鸡市','','陕西省宝鸡市',null,null,34.3545400,107.3874500),\n(656358,'610301000000','610300000000','610301','6103','市辖区','','','市辖区','3','陕西省','宝鸡市','市辖区','陕西省宝鸡市市辖区',null,null,34.3545400,107.3874500),\n(656359,'610302000000','610300000000','610302','6103','渭滨区','','','渭滨区','3','陕西省','宝鸡市','渭滨区','陕西省宝鸡市渭滨区',null,null,34.3551300,107.1552600),\n(656535,'610303000000','610300000000','610303','6103','金台区','','','金台区','3','陕西省','宝鸡市','金台区','陕西省宝鸡市金台区',null,null,34.3902900,107.1312600),\n(656701,'610304000000','610300000000','610304','6103','陈仓区','','','陈仓区','3','陕西省','宝鸡市','陈仓区','陕西省宝鸡市陈仓区',null,null,34.3545400,107.3874500),\n(657066,'610322000000','610300000000','610322','6103','凤翔县','','','凤翔县','3','陕西省','宝鸡市','凤翔县','陕西省宝鸡市凤翔县',null,null,34.5211400,107.4007600),\n(657316,'610323000000','610300000000','610323','6103','岐山县','','','岐山县','3','陕西省','宝鸡市','岐山县','陕西省宝鸡市岐山县',null,null,34.4434600,107.6210100),\n(657485,'610324000000','610300000000','610324','6103','扶风县','','','扶风县','3','陕西省','宝鸡市','扶风县','陕西省宝鸡市扶风县',null,null,34.3752700,107.9002200),\n(657660,'610326000000','610300000000','610326','6103','眉县','','','眉县','3','陕西省','宝鸡市','眉县','陕西省宝鸡市眉县',null,null,34.2741000,107.7499200),\n(657803,'610327000000','610300000000','610327','6103','陇县','','','陇县','3','陕西省','宝鸡市','陇县','陕西省宝鸡市陇县',null,null,34.8930500,106.8643000),\n(657975,'610328000000','610300000000','610328','6103','千阳县','','','千阳县','3','陕西省','宝鸡市','千阳县','陕西省宝鸡市千阳县',null,null,34.6426000,107.1323700),\n(658082,'610329000000','610300000000','610329','6103','麟游县','','','麟游县','3','陕西省','宝鸡市','麟游县','陕西省宝鸡市麟游县',null,null,34.6779300,107.7933900),\n(658159,'610330000000','610300000000','610330','6103','凤县','','','凤县','3','陕西省','宝鸡市','凤县','陕西省宝鸡市凤县',null,null,33.9122700,106.5220300),\n(658243,'610331000000','610300000000','610331','6103','太白县','','','太白县','3','陕西省','宝鸡市','太白县','陕西省宝鸡市太白县',null,null,34.0582500,107.3191000),\n(658319,'610400000000','610000000000','6104','61','咸阳市','','咸阳市','','2','陕西省','咸阳市','','陕西省咸阳市',null,null,34.3290800,108.7064100),\n(658320,'610401000000','610400000000','610401','6104','市辖区','','','市辖区','3','陕西省','咸阳市','市辖区','陕西省咸阳市市辖区',null,null,34.3290800,108.7064100),\n(658321,'610402000000','610400000000','610402','6104','秦都区','','','秦都区','3','陕西省','咸阳市','秦都区','陕西省咸阳市秦都区',null,null,34.3290800,108.7064100),\n(658518,'610403000000','610400000000','610403','6104','杨陵区','','','杨陵区','3','陕西省','咸阳市','杨陵区','陕西省咸阳市杨陵区',null,null,34.2722100,108.0845500),\n(658602,'610404000000','610400000000','610404','6104','渭城区','','','渭城区','3','陕西省','咸阳市','渭城区','陕西省咸阳市渭城区',null,null,34.3612600,108.7375100),\n(658781,'610422000000','610400000000','610422','6104','三原县','','','三原县','3','陕西省','咸阳市','三原县','陕西省咸阳市三原县',null,null,34.6170400,108.9404000),\n(658973,'610423000000','610400000000','610423','6104','泾阳县','','','泾阳县','3','陕西省','咸阳市','泾阳县','陕西省咸阳市泾阳县',null,null,34.5270900,108.8426200),\n(659210,'610424000000','610400000000','610424','6104','乾县','','','乾县','3','陕西省','咸阳市','乾县','陕西省咸阳市乾县',null,null,34.5276100,108.2394000),\n(659408,'610425000000','610400000000','610425','6104','礼泉县','','','礼泉县','3','陕西省','咸阳市','礼泉县','陕西省咸阳市礼泉县',null,null,34.4816500,108.4249600),\n(659652,'610426000000','610400000000','610426','6104','永寿县','','','永寿县','3','陕西省','咸阳市','永寿县','陕西省咸阳市永寿县',null,null,34.6919200,108.1421600),\n(659824,'610427000000','610400000000','610427','6104','彬县','','','彬县','3','陕西省','咸阳市','彬县','陕西省咸阳市彬县',null,null,35.0356500,108.0810800),\n(660001,'610428000000','610400000000','610428','6104','长武县','','','长武县','3','陕西省','咸阳市','长武县','陕西省咸阳市长武县',null,null,35.2057100,107.7986600),\n(660143,'610429000000','610400000000','610429','6104','旬邑县','','','旬邑县','3','陕西省','咸阳市','旬邑县','陕西省咸阳市旬邑县',null,null,35.1118400,108.3337100),\n(660279,'610430000000','610400000000','610430','6104','淳化县','','','淳化县','3','陕西省','咸阳市','淳化县','陕西省咸阳市淳化县',null,null,34.7987300,108.5805900),\n(660494,'610431000000','610400000000','610431','6104','武功县','','','武功县','3','陕西省','咸阳市','武功县','陕西省咸阳市武功县',null,null,34.2603600,108.2001800),\n(660699,'610481000000','610400000000','610481','6104','兴平市','','','兴平市','3','陕西省','咸阳市','兴平市','陕西省咸阳市兴平市',null,null,34.2993200,108.4904000),\n(660913,'610500000000','610000000000','6105','61','渭南市','','渭南市','','2','陕西省','渭南市','','陕西省渭南市',null,null,34.5125900,109.7719000),\n(660914,'610501000000','610500000000','610501','6105','市辖区','','','市辖区','3','陕西省','渭南市','市辖区','陕西省渭南市市辖区',null,null,34.5125900,109.7719000),\n(660915,'610502000000','610500000000','610502','6105','临渭区','','','临渭区','3','陕西省','渭南市','临渭区','陕西省渭南市临渭区',null,null,34.4982300,109.4921700),\n(661337,'610503000000','610500000000','610503','6105','华州区','','','华州区','3','陕西省','渭南市','华州区','陕西省渭南市华州区',null,null,34.5125900,109.7719000),\n(661498,'610522000000','610500000000','610522','6105','潼关县','','','潼关县','3','陕西省','渭南市','潼关县','陕西省渭南市潼关县',null,null,34.5443800,110.2465600),\n(661532,'610523000000','610500000000','610523','6105','大荔县','','','大荔县','3','陕西省','渭南市','大荔县','陕西省渭南市大荔县',null,null,34.7956600,109.9421700),\n(661873,'610524000000','610500000000','610524','6105','合阳县','','','合阳县','3','陕西省','渭南市','合阳县','陕西省渭南市合阳县',null,null,35.2375200,110.1492800),\n(662107,'610525000000','610500000000','610525','6105','澄城县','','','澄城县','3','陕西省','渭南市','澄城县','陕西省渭南市澄城县',null,null,35.1902400,109.9322600),\n(662293,'610526000000','610500000000','610526','6105','蒲城县','','','蒲城县','3','陕西省','渭南市','蒲城县','陕西省渭南市蒲城县',null,null,34.9551700,109.5864600),\n(662600,'610527000000','610500000000','610527','6105','白水县','','','白水县','3','陕西省','渭南市','白水县','陕西省渭南市白水县',null,null,35.1771000,109.5910200),\n(662744,'610528000000','610500000000','610528','6105','富平县','','','富平县','3','陕西省','渭南市','富平县','陕西省渭南市富平县',null,null,34.7511400,109.1802500),\n(663041,'610581000000','610500000000','610581','6105','韩城市','','','韩城市','3','陕西省','渭南市','韩城市','陕西省渭南市韩城市',null,null,35.4766900,110.4424300),\n(663255,'610582000000','610500000000','610582','6105','华阴市','','','华阴市','3','陕西省','渭南市','华阴市','陕西省渭南市华阴市',null,null,34.5660200,110.0920700),\n(663397,'610600000000','610000000000','6106','61','延安市','','延安市','','2','陕西省','延安市','','陕西省延安市',null,null,36.8637300,109.3289700),\n(663398,'610601000000','610600000000','610601','6106','市辖区','','','市辖区','3','陕西省','延安市','市辖区','陕西省延安市市辖区',null,null,36.8637300,109.3289700),\n(663399,'610602000000','610600000000','610602','6106','宝塔区','','','宝塔区','3','陕西省','延安市','宝塔区','陕西省延安市宝塔区',null,null,36.5914100,109.4930300),\n(663785,'610603000000','610600000000','610603','6106','安塞区','','','安塞区','3','陕西省','延安市','安塞区','陕西省延安市安塞区',null,null,36.8637300,109.3289700),\n(663931,'610621000000','610600000000','610621','6106','延长县','','','延长县','3','陕西省','延安市','延长县','陕西省延安市延长县',null,null,36.5793000,110.0124200),\n(664105,'610622000000','610600000000','610622','6106','延川县','','','延川县','3','陕西省','延安市','延川县','陕西省延安市延川县',null,null,36.8781300,110.1937500),\n(664291,'610623000000','610600000000','610623','6106','子长县','','','子长县','3','陕西省','延安市','子长县','陕西省延安市子长县',null,null,37.1425800,109.6753800),\n(664497,'610625000000','610600000000','610625','6106','志丹县','','','志丹县','3','陕西省','延安市','志丹县','陕西省延安市志丹县',null,null,36.8223500,108.7684500),\n(664620,'610626000000','610600000000','610626','6106','吴起县','','','吴起县','3','陕西省','延安市','吴起县','陕西省延安市吴起县',null,null,36.9272800,108.1758700),\n(664724,'610627000000','610600000000','610627','6106','甘泉县','','','甘泉县','3','陕西省','延安市','甘泉县','陕西省延安市甘泉县',null,null,36.2767300,109.3513000),\n(664802,'610628000000','610600000000','610628','6106','富县','','','富县','3','陕西省','延安市','富县','陕西省延安市富县',null,null,35.9877900,109.3797600),\n(664947,'610629000000','610600000000','610629','6106','洛川县','','','洛川县','3','陕西省','延安市','洛川县','陕西省延安市洛川县',null,null,35.7619000,109.4323800),\n(665330,'610630000000','610600000000','610630','6106','宜川县','','','宜川县','3','陕西省','延安市','宜川县','陕西省延安市宜川县',null,null,36.0502600,110.1689900),\n(665455,'610631000000','610600000000','610631','6106','黄龙县','','','黄龙县','3','陕西省','延安市','黄龙县','陕西省延安市黄龙县',null,null,35.5843200,109.8401800),\n(665513,'610632000000','610600000000','610632','6106','黄陵县','','','黄陵县','3','陕西省','延安市','黄陵县','陕西省延安市黄陵县',null,null,35.5793700,109.2629100),\n(665723,'610700000000','610000000000','6107','61','汉中市','','汉中市','','2','陕西省','汉中市','','陕西省汉中市',null,null,33.0678400,107.0319400),\n(665724,'610701000000','610700000000','610701','6107','市辖区','','','市辖区','3','陕西省','汉中市','市辖区','陕西省汉中市市辖区',null,null,33.0678400,107.0319400),\n(665725,'610702000000','610700000000','610702','6107','汉台区','','','汉台区','3','陕西省','汉中市','汉台区','陕西省汉中市汉台区',null,null,33.0678400,107.0319400),\n(665990,'610703000000','610700000000','610703','6107','南郑区','','','南郑区','3','陕西省','汉中市','南郑区','陕西省汉中市南郑区',null,null,32.9993200,106.9362400),\n(666325,'610722000000','610700000000','610722','6107','城固县','','','城固县','3','陕西省','汉中市','城固县','陕西省汉中市城固县',null,null,33.1566500,107.3337200),\n(666616,'610723000000','610700000000','610723','6107','洋县','','','洋县','3','陕西省','汉中市','洋县','陕西省汉中市洋县',null,null,33.2227500,107.5456500),\n(666920,'610724000000','610700000000','610724','6107','西乡县','','','西乡县','3','陕西省','汉中市','西乡县','陕西省汉中市西乡县',null,null,32.9830600,107.7666900),\n(667153,'610725000000','610700000000','610725','6107','勉县','','','勉县','3','陕西省','汉中市','勉县','陕西省汉中市勉县',null,null,33.1536200,106.6731400),\n(667370,'610726000000','610700000000','610726','6107','宁强县','','','宁强县','3','陕西省','汉中市','宁强县','陕西省汉中市宁强县',null,null,32.8296200,106.2572000),\n(667602,'610727000000','610700000000','610727','6107','略阳县','','','略阳县','3','陕西省','汉中市','略阳县','陕西省汉中市略阳县',null,null,33.3273300,106.1566000),\n(667785,'610728000000','610700000000','610728','6107','镇巴县','','','镇巴县','3','陕西省','汉中市','镇巴县','陕西省汉中市镇巴县',null,null,32.5366600,107.8950200),\n(667989,'610729000000','610700000000','610729','6107','留坝县','','','留坝县','3','陕西省','汉中市','留坝县','陕西省汉中市留坝县',null,null,33.6175800,106.9207600),\n(668074,'610730000000','610700000000','610730','6107','佛坪县','','','佛坪县','3','陕西省','汉中市','佛坪县','陕西省汉中市佛坪县',null,null,33.5244900,107.9905000),\n(668127,'610800000000','610000000000','6108','61','榆林市','','榆林市','','2','陕西省','榆林市','','陕西省榆林市',null,null,37.9587100,109.2931500),\n(668128,'610801000000','610800000000','610801','6108','市辖区','','','市辖区','3','陕西省','榆林市','市辖区','陕西省榆林市市辖区',null,null,37.9587100,109.2931500),\n(668129,'610802000000','610800000000','610802','6108','榆阳区','','','榆阳区','3','陕西省','榆林市','榆阳区','陕西省榆林市榆阳区',null,null,38.2765800,109.7212600),\n(668557,'610803000000','610800000000','610803','6108','横山区','','','横山区','3','陕西省','榆林市','横山区','陕西省榆林市横山区',null,null,37.9587100,109.2931500),\n(668939,'610822000000','610800000000','610822','6108','府谷县','','','府谷县','3','陕西省','榆林市','府谷县','陕西省榆林市府谷县',null,null,39.0280600,111.0676400),\n(669171,'610824000000','610800000000','610824','6108','靖边县','','','靖边县','3','陕西省','榆林市','靖边县','陕西省榆林市靖边县',null,null,37.5993100,108.7956800),\n(669416,'610825000000','610800000000','610825','6108','定边县','','','定边县','3','陕西省','榆林市','定边县','陕西省榆林市定边县',null,null,37.5945400,107.6012800),\n(669669,'610826000000','610800000000','610826','6108','绥德县','','','绥德县','3','陕西省','榆林市','绥德县','陕西省榆林市绥德县',null,null,37.5027800,110.2631700),\n(670032,'610827000000','610800000000','610827','6108','米脂县','','','米脂县','3','陕西省','榆林市','米脂县','陕西省榆林市米脂县',null,null,37.7548400,110.1839400),\n(670253,'610828000000','610800000000','610828','6108','佳县','','','佳县','3','陕西省','榆林市','佳县','陕西省榆林市佳县',null,null,38.0195900,110.4913600),\n(670605,'610829000000','610800000000','610829','6108','吴堡县','','','吴堡县','3','陕西省','榆林市','吴堡县','陕西省榆林市吴堡县',null,null,37.4522400,110.7396700),\n(670719,'610830000000','610800000000','610830','6108','清涧县','','','清涧县','3','陕西省','榆林市','清涧县','陕西省榆林市清涧县',null,null,37.0889000,110.1211400),\n(671084,'610831000000','610800000000','610831','6108','子洲县','','','子洲县','3','陕西省','榆林市','子洲县','陕西省榆林市子洲县',null,null,37.6107500,110.0352600),\n(671659,'610881000000','610800000000','610881','6108','神木市','','','神木市','3','陕西省','榆林市','神木市','陕西省榆林市神木市',null,null,38.8423900,110.4989600),\n(672039,'610900000000','610000000000','6109','61','安康市','','安康市','','2','陕西省','安康市','','陕西省安康市',null,null,32.6955000,109.0269700),\n(672040,'610901000000','610900000000','610901','6109','市辖区','','','市辖区','3','陕西省','安康市','市辖区','陕西省安康市市辖区',null,null,32.6955000,109.0269700),\n(672041,'610902000000','610900000000','610902','6109','汉滨区','','','汉滨区','3','陕西省','安康市','汉滨区','陕西省安康市汉滨区',null,null,32.6955000,109.0269700),\n(672594,'610921000000','610900000000','610921','6109','汉阴县','','','汉阴县','3','陕西省','安康市','汉阴县','陕西省安康市汉阴县',null,null,32.8931400,108.5086600),\n(672754,'610922000000','610900000000','610922','6109','石泉县','','','石泉县','3','陕西省','安康市','石泉县','陕西省安康市石泉县',null,null,33.0382900,108.2484300),\n(672927,'610923000000','610900000000','610923','6109','宁陕县','','','宁陕县','3','陕西省','安康市','宁陕县','陕西省安康市宁陕县',null,null,33.3104900,108.3142800),\n(673019,'610924000000','610900000000','610924','6109','紫阳县','','','紫阳县','3','陕西省','安康市','紫阳县','陕西省安康市紫阳县',null,null,32.5202500,108.5341900),\n(673234,'610925000000','610900000000','610925','6109','岚皋县','','','岚皋县','3','陕西省','安康市','岚皋县','陕西省安康市岚皋县',null,null,32.3071500,108.9022200),\n(673383,'610926000000','610900000000','610926','6109','平利县','','','平利县','3','陕西省','安康市','平利县','陕西省安康市平利县',null,null,32.3890300,109.3618000),\n(673538,'610927000000','610900000000','610927','6109','镇坪县','','','镇坪县','3','陕西省','安康市','镇坪县','陕西省安康市镇坪县',null,null,31.8837600,109.5267700),\n(673608,'610928000000','610900000000','610928','6109','旬阳县','','','旬阳县','3','陕西省','安康市','旬阳县','陕西省安康市旬阳县',null,null,32.8341700,109.3652000),\n(673935,'610929000000','610900000000','610929','6109','白河县','','','白河县','3','陕西省','安康市','白河县','陕西省安康市白河县',null,null,32.8090600,110.1126100),\n(674068,'611000000000','610000000000','6110','61','商洛市','','商洛市','','2','陕西省','商洛市','','陕西省商洛市',null,null,33.8627300,109.9410700),\n(674069,'611001000000','611000000000','611001','6110','市辖区','','','市辖区','3','陕西省','商洛市','市辖区','陕西省商洛市市辖区',null,null,33.8627300,109.9410700),\n(674070,'611002000000','611000000000','611002','6110','商州区','','','商州区','3','陕西省','商洛市','商州区','陕西省商洛市商州区',null,null,33.8627300,109.9410700),\n(674391,'611021000000','611000000000','611021','6110','洛南县','','','洛南县','3','陕西省','商洛市','洛南县','陕西省商洛市洛南县',null,null,34.0908100,110.1483300),\n(674652,'611022000000','611000000000','611022','6110','丹凤县','','','丹凤县','3','陕西省','商洛市','丹凤县','陕西省商洛市丹凤县',null,null,33.6958500,110.3272100),\n(674820,'611023000000','611000000000','611023','6110','商南县','','','商南县','3','陕西省','商洛市','商南县','陕西省商洛市商南县',null,null,33.5311200,110.8815800),\n(674955,'611024000000','611000000000','611024','6110','山阳县','','','山阳县','3','陕西省','商洛市','山阳县','陕西省商洛市山阳县',null,null,33.5321800,109.8819300),\n(675213,'611025000000','611000000000','611025','6110','镇安县','','','镇安县','3','陕西省','商洛市','镇安县','陕西省商洛市镇安县',null,null,33.4233700,109.1525800),\n(675389,'611026000000','611000000000','611026','6110','柞水县','','','柞水县','3','陕西省','商洛市','柞水县','陕西省商洛市柞水县',null,null,33.6860700,109.1142000),\n(675480,'620000000000','0','62','0','甘肃省','甘肃省','','','1','甘肃省','','','甘肃省',null,null,null,null),\n(675481,'620100000000','620000000000','6201','62','兰州市','','兰州市','','2','甘肃省','兰州市','','甘肃省兰州市',null,null,36.1039600,103.7187800),\n(675482,'620101000000','620100000000','620101','6201','市辖区','','','市辖区','3','甘肃省','兰州市','市辖区','甘肃省兰州市市辖区',null,null,36.1039600,103.7187800),\n(675483,'620102000000','620100000000','620102','6201','城关区','','','城关区','3','甘肃省','兰州市','城关区','甘肃省兰州市城关区',null,null,36.0570900,103.8253800),\n(675685,'620103000000','620100000000','620103','6201','七里河区','','','七里河区','3','甘肃省','兰州市','七里河区','甘肃省兰州市七里河区',null,null,36.0659200,103.7857600),\n(675838,'620104000000','620100000000','620104','6201','西固区','','','西固区','3','甘肃省','兰州市','西固区','甘肃省兰州市西固区',null,null,36.0884200,103.6281000),\n(675963,'620105000000','620100000000','620105','6201','安宁区','','','安宁区','3','甘肃省','兰州市','安宁区','甘肃省兰州市安宁区',null,null,36.1039600,103.7187800),\n(676032,'620111000000','620100000000','620111','6201','红古区','','','红古区','3','甘肃省','兰州市','红古区','甘肃省兰州市红古区',null,null,36.3457800,102.8593600),\n(676097,'620121000000','620100000000','620121','6201','永登县','','','永登县','3','甘肃省','兰州市','永登县','甘肃省兰州市永登县',null,null,36.7364000,103.2605100),\n(676324,'620122000000','620100000000','620122','6201','皋兰县','','','皋兰县','3','甘肃省','兰州市','皋兰县','甘肃省兰州市皋兰县',null,null,36.3321600,103.9475100),\n(676393,'620123000000','620100000000','620123','6201','榆中县','','','榆中县','3','甘肃省','兰州市','榆中县','甘肃省兰州市榆中县',null,null,35.8432700,104.1126100),\n(676689,'620171000000','620100000000','620171','6201','兰州新区','','','兰州新区','3','甘肃省','兰州市','兰州新区','甘肃省兰州市兰州新区',null,null,36.0235100,103.7262420),\n(676749,'620200000000','620000000000','6202','62','嘉峪关市','','嘉峪关市','','2','甘肃省','嘉峪关市','','甘肃省嘉峪关市',null,null,39.7720100,98.2901100),\n(676750,'620201000000','620200000000','620201','6202','市辖区','','','市辖区','3','甘肃省','嘉峪关市','市辖区','甘肃省嘉峪关市市辖区',null,null,39.7720100,98.2901100),\n(676804,'620300000000','620000000000','6203','62','金昌市','','金昌市','','2','甘肃省','金昌市','','甘肃省金昌市',null,null,38.5201400,102.1940900),\n(676805,'620301000000','620300000000','620301','6203','市辖区','','','市辖区','3','甘肃省','金昌市','市辖区','甘肃省金昌市市辖区',null,null,38.5201400,102.1940900),\n(676806,'620302000000','620300000000','620302','6203','金川区','','','金川区','3','甘肃省','金昌市','金川区','甘肃省金昌市金川区',null,null,38.5201400,102.1940900),\n(676858,'620321000000','620300000000','620321','6203','永昌县','','','永昌县','3','甘肃省','金昌市','永昌县','甘肃省金昌市永昌县',null,null,38.2470400,101.9730000),\n(676996,'620400000000','620000000000','6204','62','白银市','','白银市','','2','甘肃省','白银市','','甘肃省白银市',null,null,36.5345400,104.1724000),\n(676997,'620401000000','620400000000','620401','6204','市辖区','','','市辖区','3','甘肃省','白银市','市辖区','甘肃省白银市市辖区',null,null,36.5345400,104.1724000),\n(676998,'620402000000','620400000000','620402','6204','白银区','','','白银区','3','甘肃省','白银市','白银区','甘肃省白银市白银区',null,null,36.5345400,104.1724000),\n(677093,'620403000000','620400000000','620403','6204','平川区','','','平川区','3','甘肃省','白银市','平川区','甘肃省白银市平川区',null,null,36.7277400,104.8250300),\n(677196,'620421000000','620400000000','620421','6204','靖远县','','','靖远县','3','甘肃省','白银市','靖远县','甘肃省白银市靖远县',null,null,36.5652900,104.6870000),\n(677401,'620422000000','620400000000','620422','6204','会宁县','','','会宁县','3','甘肃省','白银市','会宁县','甘肃省白银市会宁县',null,null,35.6929100,105.0533400),\n(677734,'620423000000','620400000000','620423','6204','景泰县','','','景泰县','3','甘肃省','白银市','景泰县','甘肃省白银市景泰县',null,null,37.1813700,104.0631200),\n(677890,'620500000000','620000000000','6205','62','天水市','','天水市','','2','甘肃省','天水市','','甘肃省天水市',null,null,34.5702400,105.8896500),\n(677891,'620501000000','620500000000','620501','6205','市辖区','','','市辖区','3','甘肃省','天水市','市辖区','甘肃省天水市市辖区',null,null,34.5702400,105.8896500),\n(677892,'620502000000','620500000000','620502','6205','秦州区','','','秦州区','3','甘肃省','天水市','秦州区','甘肃省天水市秦州区',null,null,34.5808800,105.7241700),\n(678383,'620503000000','620500000000','620503','6205','麦积区','','','麦积区','3','甘肃省','天水市','麦积区','甘肃省天水市麦积区',null,null,34.5702400,105.8896500),\n(678830,'620521000000','620500000000','620521','6205','清水县','','','清水县','3','甘肃省','天水市','清水县','甘肃省天水市清水县',null,null,34.7498100,106.1373700),\n(679115,'620522000000','620500000000','620522','6205','秦安县','','','秦安县','3','甘肃省','天水市','秦安县','甘肃省天水市秦安县',null,null,34.8591800,105.6756600),\n(679569,'620523000000','620500000000','620523','6205','甘谷县','','','甘谷县','3','甘肃省','天水市','甘谷县','甘肃省天水市甘谷县',null,null,34.7320000,105.3356400),\n(680000,'620524000000','620500000000','620524','6205','武山县','','','武山县','3','甘肃省','天水市','武山县','甘肃省天水市武山县',null,null,34.7213400,104.8908900),\n(680370,'620525000000','620500000000','620525','6205','张家川回族自治县','','','张家川回族自治县','3','甘肃省','天水市','张家川回族自治县','甘肃省天水市张家川回族自治县',null,null,34.9884300,106.2057700),\n(680647,'620600000000','620000000000','6206','62','武威市','','武威市','','2','甘肃省','武威市','','甘肃省武威市',null,null,37.9281800,102.6419800),\n(680648,'620601000000','620600000000','620601','6206','市辖区','','','市辖区','3','甘肃省','武威市','市辖区','甘肃省武威市市辖区',null,null,37.9281800,102.6419800),\n(680649,'620602000000','620600000000','620602','6206','凉州区','','','凉州区','3','甘肃省','武威市','凉州区','甘肃省武威市凉州区',null,null,37.9281800,102.6419800),\n(681239,'620621000000','620600000000','620621','6206','民勤县','','','民勤县','3','甘肃省','武威市','民勤县','甘肃省武威市民勤县',null,null,38.6243400,103.0936600),\n(681551,'620622000000','620600000000','620622','6206','古浪县','','','古浪县','3','甘肃省','武威市','古浪县','甘肃省武威市古浪县',null,null,37.4701300,102.8976500),\n(681843,'620623000000','620600000000','620623','6206','天祝藏族自治县','','','天祝藏族自治县','3','甘肃省','武威市','天祝藏族自治县','甘肃省武威市天祝藏族自治县',null,null,36.9718400,103.1417800),\n(682067,'620700000000','620000000000','6207','62','张掖市','','张掖市','','2','甘肃省','张掖市','','甘肃省张掖市',null,null,38.9296700,100.4780100),\n(682068,'620701000000','620700000000','620701','6207','市辖区','','','市辖区','3','甘肃省','张掖市','市辖区','甘肃省张掖市市辖区',null,null,38.9296700,100.4780100),\n(682069,'620702000000','620700000000','620702','6207','甘州区','','','甘州区','3','甘肃省','张掖市','甘州区','甘肃省张掖市甘州区',null,null,38.9296700,100.4780100),\n(682364,'620721000000','620700000000','620721','6207','肃南裕固族自治县','','','肃南裕固族自治县','3','甘肃省','张掖市','肃南裕固族自治县','甘肃省张掖市肃南裕固族自治县',null,null,38.8369000,99.6155800),\n(682482,'620722000000','620700000000','620722','6207','民乐县','','','民乐县','3','甘肃省','张掖市','民乐县','甘肃省张掖市民乐县',null,null,38.4306400,100.8131700),\n(682673,'620723000000','620700000000','620723','6207','临泽县','','','临泽县','3','甘肃省','张掖市','临泽县','甘肃省张掖市临泽县',null,null,39.1525700,100.1644900),\n(682769,'620724000000','620700000000','620724','6207','高台县','','','高台县','3','甘肃省','张掖市','高台县','甘肃省张掖市高台县',null,null,39.3777200,99.8194300),\n(682926,'620725000000','620700000000','620725','6207','山丹县','','','山丹县','3','甘肃省','张掖市','山丹县','甘肃省张掖市山丹县',null,null,38.7844900,101.0886100),\n(683059,'620800000000','620000000000','6208','62','平凉市','','平凉市','','2','甘肃省','平凉市','','甘肃省平凉市',null,null,35.5425800,106.6747700),\n(683060,'620801000000','620800000000','620801','6208','市辖区','','','市辖区','3','甘肃省','平凉市','市辖区','甘肃省平凉市市辖区',null,null,35.5425800,106.6747700),\n(683061,'620802000000','620800000000','620802','6208','崆峒区','','','崆峒区','3','甘肃省','平凉市','崆峒区','甘肃省平凉市崆峒区',null,null,35.5425800,106.6747700),\n(683352,'620821000000','620800000000','620821','6208','泾川县','','','泾川县','3','甘肃省','平凉市','泾川县','甘肃省平凉市泾川县',null,null,35.3326200,107.3677500),\n(683593,'620822000000','620800000000','620822','6208','灵台县','','','灵台县','3','甘肃省','平凉市','灵台县','甘肃省平凉市灵台县',null,null,35.0654100,107.6212600),\n(683799,'620823000000','620800000000','620823','6208','崇信县','','','崇信县','3','甘肃省','平凉市','崇信县','甘肃省平凉市崇信县',null,null,35.3022900,107.0353600),\n(683896,'620824000000','620800000000','620824','6208','华亭县','','','华亭县','3','甘肃省','平凉市','华亭县','甘肃省平凉市华亭县',null,null,35.2175600,106.6535200),\n(684036,'620825000000','620800000000','620825','6208','庄浪县','','','庄浪县','3','甘肃省','平凉市','庄浪县','甘肃省平凉市庄浪县',null,null,35.2023900,106.0366600),\n(684354,'620826000000','620800000000','620826','6208','静宁县','','','静宁县','3','甘肃省','平凉市','静宁县','甘肃省平凉市静宁县',null,null,35.5222300,105.7324500),\n(684720,'620871000000','620800000000','620871','6208','平凉工业园区','','','平凉工业园区','3','甘肃省','平凉市','平凉工业园区','甘肃省平凉市平凉工业园区',null,null,35.5131030,106.7563710),\n(684723,'620900000000','620000000000','6209','62','酒泉市','','酒泉市','','2','甘肃省','酒泉市','','甘肃省酒泉市',null,null,39.7450200,98.5080100),\n(684724,'620901000000','620900000000','620901','6209','市辖区','','','市辖区','3','甘肃省','酒泉市','市辖区','甘肃省酒泉市市辖区',null,null,39.7450200,98.5080100),\n(684725,'620902000000','620900000000','620902','6209','肃州区','','','肃州区','3','甘肃省','酒泉市','肃州区','甘肃省酒泉市肃州区',null,null,39.7450200,98.5080100),\n(684897,'620921000000','620900000000','620921','6209','金塔县','','','金塔县','3','甘肃省','酒泉市','金塔县','甘肃省酒泉市金塔县',null,null,39.9859300,98.9027100),\n(685010,'620922000000','620900000000','620922','6209','瓜州县','','','瓜州县','3','甘肃省','酒泉市','瓜州县','甘肃省酒泉市瓜州县',null,null,40.5202300,95.7823800),\n(685115,'620923000000','620900000000','620923','6209','肃北蒙古族自治县','','','肃北蒙古族自治县','3','甘肃省','酒泉市','肃北蒙古族自治县','甘肃省酒泉市肃北蒙古族自治县',null,null,39.5124400,94.8768400),\n(685148,'620924000000','620900000000','620924','6209','阿克塞哈萨克族自治县','','','阿克塞哈萨克族自治县','3','甘肃省','酒泉市','阿克塞哈萨克族自治县','甘肃省酒泉市阿克塞哈萨克族自治县',null,null,39.6337200,94.3402300),\n(685167,'620981000000','620900000000','620981','6209','玉门市','','','玉门市','3','甘肃省','酒泉市','玉门市','甘肃省酒泉市玉门市',null,null,40.2917600,97.0454200),\n(685269,'620982000000','620900000000','620982','6209','敦煌市','','','敦煌市','3','甘肃省','酒泉市','敦煌市','甘肃省酒泉市敦煌市',null,null,40.1421900,94.6619700),\n(685348,'621000000000','620000000000','6210','62','庆阳市','','庆阳市','','2','甘肃省','庆阳市','','甘肃省庆阳市',null,null,35.7306200,107.6511400),\n(685349,'621001000000','621000000000','621001','6210','市辖区','','','市辖区','3','甘肃省','庆阳市','市辖区','甘肃省庆阳市市辖区',null,null,35.7306200,107.6511400),\n(685350,'621002000000','621000000000','621002','6210','西峰区','','','西峰区','3','甘肃省','庆阳市','西峰区','甘肃省庆阳市西峰区',null,null,35.7306200,107.6511400),\n(685476,'621021000000','621000000000','621021','6210','庆城县','','','庆城县','3','甘肃省','庆阳市','庆城县','甘肃省庆阳市庆城县',null,null,36.0152600,107.8824800),\n(685665,'621022000000','621000000000','621022','6210','环县','','','环县','3','甘肃省','庆阳市','环县','甘肃省庆阳市环县',null,null,36.5685000,107.3083900),\n(685948,'621023000000','621000000000','621023','6210','华池县','','','华池县','3','甘肃省','庆阳市','华池县','甘肃省庆阳市华池县',null,null,36.4613000,107.9901600),\n(686093,'621024000000','621000000000','621024','6210','合水县','','','合水县','3','甘肃省','庆阳市','合水县','甘肃省庆阳市合水县',null,null,35.8192700,108.0195300),\n(686199,'621025000000','621000000000','621025','6210','正宁县','','','正宁县','3','甘肃省','庆阳市','正宁县','甘肃省庆阳市正宁县',null,null,35.4917000,108.3601000),\n(686318,'621026000000','621000000000','621026','6210','宁县','','','宁县','3','甘肃省','庆阳市','宁县','甘肃省庆阳市宁县',null,null,35.5022300,107.9282400),\n(686615,'621027000000','621000000000','621027','6210','镇原县','','','镇原县','3','甘肃省','庆阳市','镇原县','甘肃省庆阳市镇原县',null,null,35.6772800,107.2006000),\n(686856,'621100000000','620000000000','6211','62','定西市','','定西市','','2','甘肃省','定西市','','甘肃省定西市',null,null,35.5793400,104.6109300),\n(686857,'621101000000','621100000000','621101','6211','市辖区','','','市辖区','3','甘肃省','定西市','市辖区','甘肃省定西市市辖区',null,null,35.5793400,104.6109300),\n(686858,'621102000000','621100000000','621102','6211','安定区','','','安定区','3','甘肃省','定西市','安定区','甘肃省定西市安定区',null,null,35.5793400,104.6109300),\n(687208,'621121000000','621100000000','621121','6211','通渭县','','','通渭县','3','甘肃省','定西市','通渭县','甘肃省定西市通渭县',null,null,35.2108700,105.2421900),\n(687569,'621122000000','621100000000','621122','6211','陇西县','','','陇西县','3','甘肃省','定西市','陇西县','甘肃省定西市陇西县',null,null,35.0039100,104.6348000),\n(687813,'621123000000','621100000000','621123','6211','渭源县','','','渭源县','3','甘肃省','定西市','渭源县','甘肃省定西市渭源县',null,null,35.1362600,104.2150200),\n(688050,'621124000000','621100000000','621124','6211','临洮县','','','临洮县','3','甘肃省','定西市','临洮县','甘肃省定西市临洮县',null,null,35.3950900,103.8595400),\n(688404,'621125000000','621100000000','621125','6211','漳县','','','漳县','3','甘肃省','定西市','漳县','甘肃省定西市漳县',null,null,34.8485300,104.4717000),\n(688559,'621126000000','621100000000','621126','6211','岷县','','','岷县','3','甘肃省','定西市','岷县','甘肃省定西市岷县',null,null,34.4381100,104.0369700),\n(688950,'621200000000','620000000000','6212','62','陇南市','','陇南市','','2','甘肃省','陇南市','','甘肃省陇南市',null,null,33.3918900,104.9266700),\n(688951,'621201000000','621200000000','621201','6212','市辖区','','','市辖区','3','甘肃省','陇南市','市辖区','甘肃省陇南市市辖区',null,null,33.3918900,104.9266700),\n(688952,'621202000000','621200000000','621202','6212','武都区','','','武都区','3','甘肃省','陇南市','武都区','甘肃省陇南市武都区',null,null,33.3918900,104.9266700),\n(689702,'621221000000','621200000000','621221','6212','成县','','','成县','3','甘肃省','陇南市','成县','甘肃省陇南市成县',null,null,33.7506200,105.7422200),\n(689979,'621222000000','621200000000','621222','6212','文县','','','文县','3','甘肃省','陇南市','文县','甘肃省陇南市文县',null,null,32.9439600,104.6834300),\n(690312,'621223000000','621200000000','621223','6212','宕昌县','','','宕昌县','3','甘肃省','陇南市','宕昌县','甘肃省陇南市宕昌县',null,null,34.0473500,104.3935400),\n(690678,'621224000000','621200000000','621224','6212','康县','','','康县','3','甘肃省','陇南市','康县','甘肃省陇南市康县',null,null,33.3293700,105.6085500),\n(691059,'621225000000','621200000000','621225','6212','西和县','','','西和县','3','甘肃省','陇南市','西和县','甘肃省陇南市西和县',null,null,34.0108500,105.3014300),\n(691474,'621226000000','621200000000','621226','6212','礼县','','','礼县','3','甘肃省','陇南市','礼县','甘肃省陇南市礼县',null,null,34.1890700,105.1784400),\n(692083,'621227000000','621200000000','621227','6212','徽县','','','徽县','3','甘肃省','陇南市','徽县','甘肃省陇南市徽县',null,null,33.7688400,106.0878500),\n(692334,'621228000000','621200000000','621228','6212','两当县','','','两当县','3','甘肃省','陇南市','两当县','甘肃省陇南市两当县',null,null,33.9090000,106.3049400),\n(692469,'622900000000','620000000000','6229','62','临夏回族自治州','','临夏回族自治州','','2','甘肃省','临夏回族自治州','','甘肃省临夏回族自治州',null,null,35.6012200,103.2109100),\n(692470,'622901000000','622900000000','622901','6229','临夏市','','','临夏市','3','甘肃省','临夏回族自治州','临夏市','甘肃省临夏回族自治州临夏市',null,null,35.6045000,103.2431700),\n(692555,'622921000000','622900000000','622921','6229','临夏县','','','临夏县','3','甘肃省','临夏回族自治州','临夏县','甘肃省临夏回族自治州临夏县',null,null,35.6045000,103.2431700),\n(692804,'622922000000','622900000000','622922','6229','康乐县','','','康乐县','3','甘肃省','临夏回族自治州','康乐县','甘肃省临夏回族自治州康乐县',null,null,35.3697300,103.7089400),\n(692973,'622923000000','622900000000','622923','6229','永靖县','','','永靖县','3','甘肃省','临夏回族自治州','永靖县','甘肃省临夏回族自治州永靖县',null,null,35.9417300,103.3158700),\n(693142,'622924000000','622900000000','622924','6229','广河县','','','广河县','3','甘肃省','临夏回族自治州','广河县','甘肃省临夏回族自治州广河县',null,null,35.4810000,103.5693500),\n(693255,'622925000000','622900000000','622925','6229','和政县','','','和政县','3','甘肃省','临夏回族自治州','和政县','甘肃省临夏回族自治州和政县',null,null,35.4253500,103.3514300),\n(693395,'622926000000','622900000000','622926','6229','东乡族自治县','','','东乡族自治县','3','甘肃省','临夏回族自治州','东乡族自治县','甘肃省临夏回族自治州东乡族自治县',null,null,35.6637600,103.3893300),\n(693650,'622927000000','622900000000','622927','6229','积石山保安族东乡族撒拉族自治县','','','积石山保安族东乡族撒拉族自治县','3','甘肃省','临夏回族自治州','积石山保安族东乡族撒拉族自治县','甘肃省临夏回族自治州积石山保安族东乡族撒拉族自治县',null,null,35.7176800,102.8758100),\n(693819,'623000000000','620000000000','6230','62','甘南藏族自治州','','甘南藏族自治州','','2','甘肃省','甘南藏族自治州','','甘肃省甘南藏族自治州',null,null,34.9832700,102.9110200),\n(693820,'623001000000','623000000000','623001','6230','合作市','','','合作市','3','甘肃省','甘南藏族自治州','合作市','甘肃省甘南藏族自治州合作市',null,null,35.0002700,102.9101200),\n(693881,'623021000000','623000000000','623021','6230','临潭县','','','临潭县','3','甘肃省','甘南藏族自治州','临潭县','甘肃省甘南藏族自治州临潭县',null,null,34.6927500,103.3536200),\n(694042,'623022000000','623000000000','623022','6230','卓尼县','','','卓尼县','3','甘肃省','甘南藏族自治州','卓尼县','甘肃省甘南藏族自治州卓尼县',null,null,34.5892200,103.5071000),\n(694164,'623023000000','623000000000','623023','6230','舟曲县','','','舟曲县','3','甘肃省','甘南藏族自治州','舟曲县','甘肃省甘南藏族自治州舟曲县',null,null,33.7849100,104.3715500),\n(694399,'623024000000','623000000000','623024','6230','迭部县','','','迭部县','3','甘肃省','甘南藏族自治州','迭部县','甘肃省甘南藏族自治州迭部县',null,null,34.0558700,103.2217500),\n(694467,'623025000000','623000000000','623025','6230','玛曲县','','','玛曲县','3','甘肃省','甘南藏族自治州','玛曲县','甘肃省甘南藏族自治州玛曲县',null,null,33.9977000,102.0722600),\n(694520,'623026000000','623000000000','623026','6230','碌曲县','','','碌曲县','3','甘肃省','甘南藏族自治州','碌曲县','甘肃省甘南藏族自治州碌曲县',null,null,34.5910300,102.4869900),\n(694559,'623027000000','623000000000','623027','6230','夏河县','','','夏河县','3','甘肃省','甘南藏族自治州','夏河县','甘肃省甘南藏族自治州夏河县',null,null,35.2023300,102.5215800),\n(694648,'630000000000','0','63','0','青海省','青海省','','','1','青海省','','','青海省',null,null,null,null),\n(694649,'630100000000','630000000000','6301','63','西宁市','','西宁市','','2','青海省','西宁市','','青海省西宁市',null,null,36.6502000,101.7662800),\n(694650,'630101000000','630100000000','630101','6301','市辖区','','','市辖区','3','青海省','西宁市','市辖区','青海省西宁市市辖区',null,null,36.6502000,101.7662800),\n(694651,'630102000000','630100000000','630102','6301','城东区','','','城东区','3','青海省','西宁市','城东区','青海省西宁市城东区',null,null,36.5997600,101.8031900),\n(694718,'630103000000','630100000000','630103','6301','城中区','','','城中区','3','青海省','西宁市','城中区','青海省西宁市城中区',null,null,36.5866000,101.7701300),\n(694789,'630104000000','630100000000','630104','6301','城西区','','','城西区','3','青海省','西宁市','城西区','青海省西宁市城西区',null,null,36.6283000,101.7658500),\n(694837,'630105000000','630100000000','630105','6301','城北区','','','城北区','3','青海省','西宁市','城北区','青海省西宁市城北区',null,null,36.6502000,101.7662800),\n(694911,'630121000000','630100000000','630121','6301','大通回族土族自治县','','','大通回族土族自治县','3','青海省','西宁市','大通回族土族自治县','青海省西宁市大通回族土族自治县',null,null,36.9269400,101.6854500),\n(695243,'630122000000','630100000000','630122','6301','湟中县','','','湟中县','3','青海省','西宁市','湟中县','青海省西宁市湟中县',null,null,36.5008700,101.5716400),\n(695668,'630123000000','630100000000','630123','6301','湟源县','','','湟源县','3','青海省','西宁市','湟源县','青海省西宁市湟源县',null,null,36.6824600,101.2564800),\n(695832,'630200000000','630000000000','6302','63','海东市','','海东市','','2','青海省','海东市','','青海省海东市',null,null,36.4820900,102.4017300),\n(695833,'630202000000','630200000000','630202','6302','乐都区','','','乐都区','3','青海省','海东市','乐都区','青海省海东市乐都区',null,null,36.4820900,102.4017300),\n(696221,'630203000000','630200000000','630203','6302','平安区','','','平安区','3','青海省','海东市','平安区','青海省海东市平安区',null,null,36.5002900,102.1084800),\n(696350,'630222000000','630200000000','630222','6302','民和回族土族自治县','','','民和回族土族自治县','3','青海省','海东市','民和回族土族自治县','青海省海东市民和回族土族自治县',null,null,36.3202600,102.8308700),\n(696702,'630223000000','630200000000','630223','6302','互助土族自治县','','','互助土族自治县','3','青海省','海东市','互助土族自治县','青海省海东市互助土族自治县',null,null,36.8441200,101.9584200),\n(697033,'630224000000','630200000000','630224','6302','化隆回族自治县','','','化隆回族自治县','3','青海省','海东市','化隆回族自治县','青海省海东市化隆回族自治县',null,null,36.0949300,102.2640400),\n(697424,'630225000000','630200000000','630225','6302','循化撒拉族自治县','','','循化撒拉族自治县','3','青海省','海东市','循化撒拉族自治县','青海省海东市循化撒拉族自治县',null,null,35.8508000,102.4891000),\n(697594,'632200000000','630000000000','6322','63','海北藏族自治州','','海北藏族自治州','','2','青海省','海北藏族自治州','','青海省海北藏族自治州',null,null,36.9545400,100.9009600),\n(697595,'632221000000','632200000000','632221','6322','门源回族自治县','','','门源回族自治县','3','青海省','海北藏族自治州','门源回族自治县','青海省海北藏族自治州门源回族自治县',null,null,37.3882800,101.6117000),\n(697740,'632222000000','632200000000','632222','6322','祁连县','','','祁连县','3','青海省','海北藏族自治州','祁连县','青海省海北藏族自治州祁连县',null,null,38.1770900,100.2530500),\n(697798,'632223000000','632200000000','632223','6322','海晏县','','','海晏县','3','青海省','海北藏族自治州','海晏县','青海省海北藏族自治州海晏县',null,null,36.8970000,100.9950400),\n(697841,'632224000000','632200000000','632224','6322','刚察县','','','刚察县','3','青海省','海北藏族自治州','刚察县','青海省海北藏族自治州刚察县',null,null,37.3216200,100.1468200),\n(697897,'632300000000','630000000000','6323','63','黄南藏族自治州','','黄南藏族自治州','','2','青海省','黄南藏族自治州','','青海省黄南藏族自治州',null,null,35.5199100,102.0150700),\n(697898,'632321000000','632300000000','632321','6323','同仁县','','','同仁县','3','青海省','黄南藏族自治州','同仁县','青海省黄南藏族自治州同仁县',null,null,35.5163000,102.0195400),\n(697992,'632322000000','632300000000','632322','6323','尖扎县','','','尖扎县','3','青海省','黄南藏族自治州','尖扎县','青海省黄南藏族自治州尖扎县',null,null,35.9381700,102.0310200),\n(698096,'632323000000','632300000000','632323','6323','泽库县','','','泽库县','3','青海省','黄南藏族自治州','泽库县','青海省黄南藏族自治州泽库县',null,null,35.0360500,101.4659400),\n(698179,'632324000000','632300000000','632324','6323','河南蒙古族自治县','','','河南蒙古族自治县','3','青海省','黄南藏族自治州','河南蒙古族自治县','青海省黄南藏族自治州河南蒙古族自治县',null,null,34.7342100,101.6164900),\n(698230,'632500000000','630000000000','6325','63','海南藏族自治州','','海南藏族自治州','','2','青海省','海南藏族自治州','','青海省海南藏族自治州',null,null,36.2866300,100.6203700),\n(698231,'632521000000','632500000000','632521','6325','共和县','','','共和县','3','青海省','海南藏族自治州','共和县','青海省海南藏族自治州共和县',null,null,36.2830000,100.6201200),\n(698367,'632522000000','632500000000','632522','6325','同德县','','','同德县','3','青海省','海南藏族自治州','同德县','青海省海南藏族自治州同德县',null,null,35.2538600,100.5787600),\n(698465,'632523000000','632500000000','632523','6325','贵德县','','','贵德县','3','青海省','海南藏族自治州','贵德县','青海省海南藏族自治州贵德县',null,null,36.0400400,101.4336000),\n(698605,'632524000000','632500000000','632524','6325','兴海县','','','兴海县','3','青海省','海南藏族自治州','兴海县','青海省海南藏族自治州兴海县',null,null,35.5886800,99.9881800),\n(698680,'632525000000','632500000000','632525','6325','贵南县','','','贵南县','3','青海省','海南藏族自治州','贵南县','青海省海南藏族自治州贵南县',null,null,35.5876500,100.7478400),\n(698779,'632600000000','630000000000','6326','63','果洛藏族自治州','','果洛藏族自治州','','2','青海省','果洛藏族自治州','','青海省果洛藏族自治州',null,null,34.4714100,100.2447500),\n(698780,'632621000000','632600000000','632621','6326','玛沁县','','','玛沁县','3','青海省','果洛藏族自治州','玛沁县','青海省果洛藏族自治州玛沁县',null,null,34.4773300,100.2395600),\n(698831,'632622000000','632600000000','632622','6326','班玛县','','','班玛县','3','青海省','果洛藏族自治州','班玛县','青海省果洛藏族自治州班玛县',null,null,32.9326900,100.7374000),\n(698874,'632623000000','632600000000','632623','6326','甘德县','','','甘德县','3','青海省','果洛藏族自治州','甘德县','青海省果洛藏族自治州甘德县',null,null,33.9692100,99.9007500),\n(698920,'632624000000','632600000000','632624','6326','达日县','','','达日县','3','青海省','果洛藏族自治州','达日县','青海省果洛藏族自治州达日县',null,null,33.7492400,99.6515300),\n(698966,'632625000000','632600000000','632625','6326','久治县','','','久治县','3','青海省','果洛藏族自治州','久治县','青海省果洛藏族自治州久治县',null,null,33.4292800,101.4828900),\n(698999,'632626000000','632600000000','632626','6326','玛多县','','','玛多县','3','青海省','果洛藏族自治州','玛多县','青海省果洛藏族自治州玛多县',null,null,34.9150800,98.2093400),\n(699037,'632700000000','630000000000','6327','63','玉树藏族自治州','','玉树藏族自治州','','2','青海省','玉树藏族自治州','','青海省玉树藏族自治州',null,null,33.0052800,97.0065000),\n(699038,'632701000000','632700000000','632701','6327','玉树市','','','玉树市','3','青海省','玉树藏族自治州','玉树市','青海省玉树藏族自治州玉树市',null,null,32.9933600,97.0086200),\n(699131,'632722000000','632700000000','632722','6327','杂多县','','','杂多县','3','青海省','玉树藏族自治州','杂多县','青海省玉树藏族自治州杂多县',null,null,32.8929500,95.3010200),\n(699181,'632723000000','632700000000','632723','6327','称多县','','','称多县','3','青海省','玉树藏族自治州','称多县','青海省玉树藏族自治州称多县',null,null,33.3682300,97.1086500),\n(699254,'632724000000','632700000000','632724','6327','治多县','','','治多县','3','青海省','玉树藏族自治州','治多县','青海省玉树藏族自治州治多县',null,null,33.8520300,95.6133500),\n(699287,'632725000000','632700000000','632725','6327','囊谦县','','','囊谦县','3','青海省','玉树藏族自治州','囊谦县','青海省玉树藏族自治州囊谦县',null,null,32.2029500,96.4806300),\n(699375,'632726000000','632700000000','632726','6327','曲麻莱县','','','曲麻莱县','3','青海省','玉树藏族自治州','曲麻莱县','青海省玉树藏族自治州曲麻莱县',null,null,34.1263900,95.7972200),\n(699405,'632800000000','630000000000','6328','63','海西蒙古族藏族自治州','','海西蒙古族藏族自治州','','2','青海省','海西蒙古族藏族自治州','','青海省海西蒙古族藏族自治州',null,null,37.3771000,97.3712200),\n(699406,'632801000000','632800000000','632801','6328','格尔木市','','','格尔木市','3','青海省','海西蒙古族藏族自治州','格尔木市','青海省海西蒙古族藏族自治州格尔木市',null,null,36.4024000,94.9033000),\n(699492,'632802000000','632800000000','632802','6328','德令哈市','','','德令哈市','3','青海省','海西蒙古族藏族自治州','德令哈市','青海省海西蒙古族藏族自治州德令哈市',null,null,37.3694700,97.3608700),\n(699569,'632821000000','632800000000','632821','6328','乌兰县','','','乌兰县','3','青海省','海西蒙古族藏族自治州','乌兰县','青海省海西蒙古族藏族自治州乌兰县',null,null,36.9297600,98.4800300),\n(699620,'632822000000','632800000000','632822','6328','都兰县','','','都兰县','3','青海省','海西蒙古族藏族自治州','都兰县','青海省海西蒙古族藏族自治州都兰县',null,null,36.3038600,98.0953100),\n(699745,'632823000000','632800000000','632823','6328','天峻县','','','天峻县','3','青海省','海西蒙古族藏族自治州','天峻县','青海省海西蒙古族藏族自治州天峻县',null,null,37.3009600,99.0229300),\n(699820,'632857000000','632800000000','632857','6328','大柴旦行政委员会','','','大柴旦行政委员会','3','青海省','海西蒙古族藏族自治州','大柴旦行政委员会','青海省海西蒙古族藏族自治州大柴旦行政委员会',null,null,37.8528590,95.3657840),\n(699828,'632858000000','632800000000','632858','6328','冷湖行政委员会','','','冷湖行政委员会','3','青海省','海西蒙古族藏族自治州','冷湖行政委员会','青海省海西蒙古族藏族自治州冷湖行政委员会',null,null,37.3771000,97.3712200),\n(699831,'632859000000','632800000000','632859','6328','茫崖行政委员会','','','茫崖行政委员会','3','青海省','海西蒙古族藏族自治州','茫崖行政委员会','青海省海西蒙古族藏族自治州茫崖行政委员会',null,null,38.2476310,90.8561710),\n(699845,'640000000000','0','64','0','宁夏回族自治区','宁夏回族自治区','','','1','宁夏回族自治区','','','宁夏回族自治区',null,null,null,null),\n(699846,'640100000000','640000000000','6401','64','银川市','','银川市','','2','宁夏回族自治区','银川市','','宁夏回族自治区银川市',null,null,38.4731400,106.2428400),\n(699847,'640101000000','640100000000','640101','6401','市辖区','','','市辖区','3','宁夏回族自治区','银川市','市辖区','宁夏回族自治区银川市市辖区',null,null,38.4731400,106.2428400),\n(699848,'640104000000','640100000000','640104','6401','兴庆区','','','兴庆区','3','宁夏回族自治区','银川市','兴庆区','宁夏回族自治区银川市兴庆区',null,null,38.4737100,106.2884700),\n(699998,'640105000000','640100000000','640105','6401','西夏区','','','西夏区','3','宁夏回族自治区','银川市','西夏区','宁夏回族自治区银川市西夏区',null,null,38.4958900,106.1565200),\n(700086,'640106000000','640100000000','640106','6401','金凤区','','','金凤区','3','宁夏回族自治区','银川市','金凤区','宁夏回族自治区银川市金凤区',null,null,38.4731400,106.2428400),\n(700161,'640121000000','640100000000','640121','6401','永宁县','','','永宁县','3','宁夏回族自治区','银川市','永宁县','宁夏回族自治区银川市永宁县',null,null,38.2774900,106.2531800),\n(700261,'640122000000','640100000000','640122','6401','贺兰县','','','贺兰县','3','宁夏回族自治区','银川市','贺兰县','宁夏回族自治区银川市贺兰县',null,null,38.5544300,106.3498500),\n(700353,'640181000000','640100000000','640181','6401','灵武市','','','灵武市','3','宁夏回族自治区','银川市','灵武市','宁夏回族自治区银川市灵武市',null,null,38.1026900,106.3400500),\n(700469,'640200000000','640000000000','6402','64','石嘴山市','','石嘴山市','','2','宁夏回族自治区','石嘴山市','','宁夏回族自治区石嘴山市',null,null,39.0189500,106.3680300),\n(700470,'640201000000','640200000000','640201','6402','市辖区','','','市辖区','3','宁夏回族自治区','石嘴山市','市辖区','宁夏回族自治区石嘴山市市辖区',null,null,39.0189500,106.3680300),\n(700471,'640202000000','640200000000','640202','6402','大武口区','','','大武口区','3','宁夏回族自治区','石嘴山市','大武口区','宁夏回族自治区石嘴山市大武口区',null,null,39.0189500,106.3680300),\n(700545,'640205000000','640200000000','640205','6402','惠农区','','','惠农区','3','宁夏回族自治区','石嘴山市','惠农区','宁夏回族自治区石嘴山市惠农区',null,null,39.2390900,106.7813200),\n(700644,'640221000000','640200000000','640221','6402','平罗县','','','平罗县','3','宁夏回族自治区','石嘴山市','平罗县','宁夏回族自治区石嘴山市平罗县',null,null,38.9133500,106.5230400),\n(700838,'640300000000','640000000000','6403','64','吴忠市','','吴忠市','','2','宁夏回族自治区','吴忠市','','宁夏回族自治区吴忠市',null,null,37.4253300,106.0624300),\n(700839,'640301000000','640300000000','640301','6403','市辖区','','','市辖区','3','宁夏回族自治区','吴忠市','市辖区','宁夏回族自治区吴忠市市辖区',null,null,37.4253300,106.0624300),\n(700840,'640302000000','640300000000','640302','6403','利通区','','','利通区','3','宁夏回族自治区','吴忠市','利通区','宁夏回族自治区吴忠市利通区',null,null,37.9847200,106.2125100),\n(701013,'640303000000','640300000000','640303','6403','红寺堡区','','','红寺堡区','3','宁夏回族自治区','吴忠市','红寺堡区','宁夏回族自治区吴忠市红寺堡区',null,null,37.4253300,106.0624300),\n(701092,'640323000000','640300000000','640323','6403','盐池县','','','盐池县','3','宁夏回族自治区','吴忠市','盐池县','宁夏回族自治区吴忠市盐池县',null,null,37.7829400,107.4078900),\n(701220,'640324000000','640300000000','640324','6403','同心县','','','同心县','3','宁夏回族自治区','吴忠市','同心县','宁夏回族自治区吴忠市同心县',null,null,36.9806400,105.9144800),\n(701390,'640381000000','640300000000','640381','6403','青铜峡市','','','青铜峡市','3','宁夏回族自治区','吴忠市','青铜峡市','宁夏回族自治区吴忠市青铜峡市',null,null,38.0212100,106.0787500),\n(701516,'640400000000','640000000000','6404','64','固原市','','固原市','','2','宁夏回族自治区','固原市','','宁夏回族自治区固原市',null,null,36.0034100,106.2877900),\n(701517,'640401000000','640400000000','640401','6404','市辖区','','','市辖区','3','宁夏回族自治区','固原市','市辖区','宁夏回族自治区固原市市辖区',null,null,36.0034100,106.2877900),\n(701518,'640402000000','640400000000','640402','6404','原州区','','','原州区','3','宁夏回族自治区','固原市','原州区','宁夏回族自治区固原市原州区',null,null,36.0034100,106.2877900),\n(701724,'640422000000','640400000000','640422','6404','西吉县','','','西吉县','3','宁夏回族自治区','固原市','西吉县','宁夏回族自治区固原市西吉县',null,null,35.9638500,105.7291100),\n(702048,'640423000000','640400000000','640423','6404','隆德县','','','隆德县','3','宁夏回族自治区','固原市','隆德县','宁夏回族自治区固原市隆德县',null,null,35.6181200,106.1233200),\n(702185,'640424000000','640400000000','640424','6404','泾源县','','','泾源县','3','宁夏回族自治区','固原市','泾源县','宁夏回族自治区固原市泾源县',null,null,35.4982300,106.3306700),\n(702305,'640425000000','640400000000','640425','6404','彭阳县','','','彭阳县','3','宁夏回族自治区','固原市','彭阳县','宁夏回族自治区固原市彭阳县',null,null,35.8496000,106.6380800),\n(702478,'640500000000','640000000000','6405','64','中卫市','','中卫市','','2','宁夏回族自治区','中卫市','','宁夏回族自治区中卫市',null,null,37.5170000,105.1736200),\n(702479,'640501000000','640500000000','640501','6405','市辖区','','','市辖区','3','宁夏回族自治区','中卫市','市辖区','宁夏回族自治区中卫市市辖区',null,null,37.5170000,105.1736200),\n(702480,'640502000000','640500000000','640502','6405','沙坡头区','','','沙坡头区','3','宁夏回族自治区','中卫市','沙坡头区','宁夏回族自治区中卫市沙坡头区',null,null,37.5170000,105.1736200),\n(702678,'640521000000','640500000000','640521','6405','中宁县','','','中宁县','3','宁夏回族自治区','中卫市','中宁县','宁夏回族自治区中卫市中宁县',null,null,37.4915700,105.6851800),\n(702839,'640522000000','640500000000','640522','6405','海原县','','','海原县','3','宁夏回族自治区','中卫市','海原县','宁夏回族自治区中卫市海原县',null,null,36.5652400,105.6435900),\n(703040,'650000000000','0','65','0','新疆维吾尔自治区','新疆维吾尔自治区','','','1','新疆维吾尔自治区','','','新疆维吾尔自治区',null,null,null,null),\n(703041,'650100000000','650000000000','6501','65','乌鲁木齐市','','乌鲁木齐市','','2','新疆维吾尔自治区','乌鲁木齐市','','新疆维吾尔自治区乌鲁木齐市',null,null,43.3637800,88.3110400),\n(703042,'650101000000','650100000000','650101','6501','市辖区','','','市辖区','3','新疆维吾尔自治区','乌鲁木齐市','市辖区','新疆维吾尔自治区乌鲁木齐市市辖区',null,null,43.3637800,88.3110400),\n(703043,'650102000000','650100000000','650102','6501','天山区','','','天山区','3','新疆维吾尔自治区','乌鲁木齐市','天山区','新疆维吾尔自治区乌鲁木齐市天山区',null,null,43.7954700,87.6335600),\n(703260,'650103000000','650100000000','650103','6501','沙依巴克区','','','沙依巴克区','3','新疆维吾尔自治区','乌鲁木齐市','沙依巴克区','新疆维吾尔自治区乌鲁木齐市沙依巴克区',null,null,43.8009500,87.5981100),\n(703490,'650104000000','650100000000','650104','6501','新市区','','','新市区','3','新疆维吾尔自治区','乌鲁木齐市','新市区','新疆维吾尔自治区乌鲁木齐市新市区',null,null,43.8436700,87.5740000),\n(703660,'650105000000','650100000000','650105','6501','水磨沟区','','','水磨沟区','3','新疆维吾尔自治区','乌鲁木齐市','水磨沟区','新疆维吾尔自治区乌鲁木齐市水磨沟区',null,null,43.8324400,87.6424800),\n(703835,'650106000000','650100000000','650106','6501','头屯河区','','','头屯河区','3','新疆维吾尔自治区','乌鲁木齐市','头屯河区','新疆维吾尔自治区乌鲁木齐市头屯河区',null,null,43.8771100,87.4281200),\n(703919,'650107000000','650100000000','650107','6501','达坂城区','','','达坂城区','3','新疆维吾尔自治区','乌鲁木齐市','达坂城区','新疆维吾尔自治区乌鲁木齐市达坂城区',null,null,43.3637800,88.3110400),\n(703969,'650109000000','650100000000','650109','6501','米东区','','','米东区','3','新疆维吾尔自治区','乌鲁木齐市','米东区','新疆维吾尔自治区乌鲁木齐市米东区',null,null,43.9736500,87.6559100),\n(704141,'650121000000','650100000000','650121','6501','乌鲁木齐县','','','乌鲁木齐县','3','新疆维吾尔自治区','乌鲁木齐市','乌鲁木齐县','新疆维吾尔自治区乌鲁木齐市乌鲁木齐县',null,null,43.4712900,87.4093100),\n(704189,'650171000000','650100000000','650171','6501','乌鲁木齐经济技术开发区','','','乌鲁木齐经济技术开发区','3','新疆维吾尔自治区','乌鲁木齐市','乌鲁木齐经济技术开发区','新疆维吾尔自治区乌鲁木齐市乌鲁木齐经济技术开发区',null,null,43.8630710,87.5165790),\n(704240,'650172000000','650100000000','650172','6501','乌鲁木齐高新技术产业开发区','','','乌鲁木齐高新技术产业开发区','3','新疆维吾尔自治区','乌鲁木齐市','乌鲁木齐高新技术产业开发区','新疆维吾尔自治区乌鲁木齐市乌鲁木齐高新技术产业开发区',null,null,43.8648300,87.5828700),\n(704265,'650200000000','650000000000','6502','65','克拉玛依市','','克拉玛依市','','2','新疆维吾尔自治区','克拉玛依市','','新疆维吾尔自治区克拉玛依市',null,null,45.6873400,85.1320800),\n(704266,'650201000000','650200000000','650201','6502','市辖区','','','市辖区','3','新疆维吾尔自治区','克拉玛依市','市辖区','新疆维吾尔自治区克拉玛依市市辖区',null,null,45.6873400,85.1320800),\n(704267,'650202000000','650200000000','650202','6502','独山子区','','','独山子区','3','新疆维吾尔自治区','克拉玛依市','独山子区','新疆维吾尔自治区克拉玛依市独山子区',null,null,44.3287000,84.8867500),\n(704289,'650203000000','650200000000','650203','6502','克拉玛依区','','','克拉玛依区','3','新疆维吾尔自治区','克拉玛依市','克拉玛依区','新疆维吾尔自治区克拉玛依市克拉玛依区',null,null,45.6024300,84.8678200),\n(704411,'650204000000','650200000000','650204','6502','白碱滩区','','','白碱滩区','3','新疆维吾尔自治区','克拉玛依市','白碱滩区','新疆维吾尔自治区克拉玛依市白碱滩区',null,null,45.6873400,85.1320800),\n(704433,'650205000000','650200000000','650205','6502','乌尔禾区','','','乌尔禾区','3','新疆维吾尔自治区','克拉玛依市','乌尔禾区','新疆维吾尔自治区克拉玛依市乌尔禾区',null,null,46.0890800,85.6937700),\n(704452,'650400000000','650000000000','6504','65','吐鲁番市','','吐鲁番市','','2','新疆维吾尔自治区','吐鲁番市','','新疆维吾尔自治区吐鲁番市',null,null,42.9424400,89.1859600),\n(704453,'650402000000','650400000000','650402','6504','高昌区','','','高昌区','3','新疆维吾尔自治区','吐鲁番市','高昌区','新疆维吾尔自治区吐鲁番市高昌区',null,null,42.9424400,89.1859600),\n(704577,'650421000000','650400000000','650421','6504','鄯善县','','','鄯善县','3','新疆维吾尔自治区','吐鲁番市','鄯善县','新疆维吾尔自治区吐鲁番市鄯善县',null,null,42.9424400,89.1859600),\n(704694,'650422000000','650400000000','650422','6504','托克逊县','','','托克逊县','3','新疆维吾尔自治区','吐鲁番市','托克逊县','新疆维吾尔自治区吐鲁番市托克逊县',null,null,42.9424400,89.1859600),\n(704764,'650500000000','650000000000','6505','65','哈密市','','哈密市','','2','新疆维吾尔自治区','哈密市','','新疆维吾尔自治区哈密市',null,null,42.8269900,93.5146500),\n(704765,'650502000000','650500000000','650502','6505','伊州区','','','伊州区','3','新疆维吾尔自治区','哈密市','伊州区','新疆维吾尔自治区哈密市伊州区',null,null,42.8269900,93.5146500),\n(705029,'650521000000','650500000000','650521','6505','巴里坤哈萨克自治县','','','巴里坤哈萨克自治县','3','新疆维吾尔自治区','哈密市','巴里坤哈萨克自治县','新疆维吾尔自治区哈密市巴里坤哈萨克自治县',null,null,43.5987300,93.0165400),\n(705126,'650522000000','650500000000','650522','6505','伊吾县','','','伊吾县','3','新疆维吾尔自治区','哈密市','伊吾县','新疆维吾尔自治区哈密市伊吾县',null,null,43.2545100,94.6974100),\n(705179,'652300000000','650000000000','6523','65','昌吉回族自治州','','昌吉回族自治州','','2','新疆维吾尔自治区','昌吉回族自治州','','新疆维吾尔自治区昌吉回族自治州',null,null,44.0111700,87.3082200),\n(705180,'652301000000','652300000000','652301','6523','昌吉市','','','昌吉市','3','新疆维吾尔自治区','昌吉回族自治州','昌吉市','新疆维吾尔自治区昌吉回族自治州昌吉市',null,null,44.0143700,87.2674900),\n(705375,'652302000000','652300000000','652302','6523','阜康市','','','阜康市','3','新疆维吾尔自治区','昌吉回族自治州','阜康市','新疆维吾尔自治区昌吉回族自治州阜康市',null,null,44.1570600,87.9873800),\n(705498,'652323000000','652300000000','652323','6523','呼图壁县','','','呼图壁县','3','新疆维吾尔自治区','昌吉回族自治州','呼图壁县','新疆维吾尔自治区昌吉回族自治州呼图壁县',null,null,44.1916000,86.8988700),\n(705651,'652324000000','652300000000','652324','6523','玛纳斯县','','','玛纳斯县','3','新疆维吾尔自治区','昌吉回族自治州','玛纳斯县','新疆维吾尔自治区昌吉回族自治州玛纳斯县',null,null,44.3041300,86.2142100),\n(705927,'652325000000','652300000000','652325','6523','奇台县','','','奇台县','3','新疆维吾尔自治区','昌吉回族自治州','奇台县','新疆维吾尔自治区昌吉回族自治州奇台县',null,null,44.0219700,89.5939900),\n(706075,'652327000000','652300000000','652327','6523','吉木萨尔县','','','吉木萨尔县','3','新疆维吾尔自治区','昌吉回族自治州','吉木萨尔县','新疆维吾尔自治区昌吉回族自治州吉木萨尔县',null,null,44.0006100,89.1807600),\n(706174,'652328000000','652300000000','652328','6523','木垒哈萨克自治县','','','木垒哈萨克自治县','3','新疆维吾尔自治区','昌吉回族自治州','木垒哈萨克自治县','新疆维吾尔自治区昌吉回族自治州木垒哈萨克自治县',null,null,43.8346400,90.2859800),\n(706259,'652700000000','650000000000','6527','65','博尔塔拉蒙古自治州','','博尔塔拉蒙古自治州','','2','新疆维吾尔自治区','博尔塔拉蒙古自治州','','新疆维吾尔自治区博尔塔拉蒙古自治州',null,null,44.9059700,82.0666500),\n(706260,'652701000000','652700000000','652701','6527','博乐市','','','博乐市','3','新疆维吾尔自治区','博尔塔拉蒙古自治州','博乐市','新疆维吾尔自治区博尔塔拉蒙古自治州博乐市',null,null,44.8538700,82.0511200),\n(706555,'652702000000','652700000000','652702','6527','阿拉山口市','','','阿拉山口市','3','新疆维吾尔自治区','博尔塔拉蒙古自治州','阿拉山口市','新疆维吾尔自治区博尔塔拉蒙古自治州阿拉山口市',null,null,45.1732800,82.5544700),\n(706560,'652722000000','652700000000','652722','6527','精河县','','','精河县','3','新疆维吾尔自治区','博尔塔拉蒙古自治州','精河县','新疆维吾尔自治区博尔塔拉蒙古自治州精河县',null,null,44.6005500,82.8941700),\n(706707,'652723000000','652700000000','652723','6527','温泉县','','','温泉县','3','新疆维吾尔自治区','博尔塔拉蒙古自治州','温泉县','新疆维吾尔自治区博尔塔拉蒙古自治州温泉县',null,null,44.9688200,81.0247800),\n(706834,'652800000000','650000000000','6528','65','巴音郭楞蒙古自治州','','巴音郭楞蒙古自治州','','2','新疆维吾尔自治区','巴音郭楞蒙古自治州','','新疆维吾尔自治区巴音郭楞蒙古自治州',null,null,41.7640400,86.1451700),\n(706835,'652801000000','652800000000','652801','6528','库尔勒市','','','库尔勒市','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','库尔勒市','新疆维吾尔自治区巴音郭楞蒙古自治州库尔勒市',null,null,41.7264300,86.1736900),\n(707087,'652822000000','652800000000','652822','6528','轮台县','','','轮台县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','轮台县','新疆维吾尔自治区巴音郭楞蒙古自治州轮台县',null,null,41.7776300,84.2519100),\n(707177,'652823000000','652800000000','652823','6528','尉犁县','','','尉犁县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','尉犁县','新疆维吾尔自治区巴音郭楞蒙古自治州尉犁县',null,null,41.3439200,86.2607500),\n(707303,'652824000000','652800000000','652824','6528','若羌县','','','若羌县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','若羌县','新疆维吾尔自治区巴音郭楞蒙古自治州若羌县',null,null,39.0237400,88.1672800),\n(707365,'652825000000','652800000000','652825','6528','且末县','','','且末县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','且末县','新疆维吾尔自治区巴音郭楞蒙古自治州且末县',null,null,38.1453800,85.5297700),\n(707458,'652826000000','652800000000','652826','6528','焉耆回族自治县','','','焉耆回族自治县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','焉耆回族自治县','新疆维吾尔自治区巴音郭楞蒙古自治州焉耆回族自治县',null,null,42.0591000,86.5742500),\n(707557,'652827000000','652800000000','652827','6528','和静县','','','和静县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','和静县','新疆维吾尔自治区巴音郭楞蒙古自治州和静县',null,null,42.3226600,86.3830700),\n(707737,'652828000000','652800000000','652828','6528','和硕县','','','和硕县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','和硕县','新疆维吾尔自治区巴音郭楞蒙古自治州和硕县',null,null,42.2681700,86.8639700),\n(707805,'652829000000','652800000000','652829','6528','博湖县','','','博湖县','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','博湖县','新疆维吾尔自治区巴音郭楞蒙古自治州博湖县',null,null,41.9800900,86.6325400),\n(707861,'652871000000','652800000000','652871','6528','库尔勒经济技术开发区','','','库尔勒经济技术开发区','3','新疆维吾尔自治区','巴音郭楞蒙古自治州','库尔勒经济技术开发区','新疆维吾尔自治区巴音郭楞蒙古自治州库尔勒经济技术开发区',null,null,41.7264300,86.1736900),\n(707865,'652900000000','650000000000','6529','65','阿克苏地区','','阿克苏地区','','2','新疆维吾尔自治区','阿克苏地区','','新疆维吾尔自治区阿克苏地区',null,null,41.1684200,80.2600800),\n(707866,'652901000000','652900000000','652901','6529','阿克苏市','','','阿克苏市','3','新疆维吾尔自治区','阿克苏地区','阿克苏市','新疆维吾尔自治区阿克苏地区阿克苏市',null,null,41.1676300,80.2633800),\n(708104,'652922000000','652900000000','652922','6529','温宿县','','','温宿县','3','新疆维吾尔自治区','阿克苏地区','温宿县','新疆维吾尔自治区阿克苏地区温宿县',null,null,41.2770600,80.2391400),\n(708331,'652923000000','652900000000','652923','6529','库车县','','','库车县','3','新疆维吾尔自治区','阿克苏地区','库车县','新疆维吾尔自治区阿克苏地区库车县',null,null,41.7174100,82.9621200),\n(708620,'652924000000','652900000000','652924','6529','沙雅县','','','沙雅县','3','新疆维吾尔自治区','阿克苏地区','沙雅县','新疆维吾尔自治区阿克苏地区沙雅县',null,null,41.2216000,82.7820900),\n(708825,'652925000000','652900000000','652925','6529','新和县','','','新和县','3','新疆维吾尔自治区','阿克苏地区','新和县','新疆维吾尔自治区阿克苏地区新和县',null,null,41.5483300,82.6091200),\n(708977,'652926000000','652900000000','652926','6529','拜城县','','','拜城县','3','新疆维吾尔自治区','阿克苏地区','拜城县','新疆维吾尔自治区阿克苏地区拜城县',null,null,41.7968500,81.8734700),\n(709190,'652927000000','652900000000','652927','6529','乌什县','','','乌什县','3','新疆维吾尔自治区','阿克苏地区','乌什县','新疆维吾尔自治区阿克苏地区乌什县',null,null,41.2147200,79.2245700),\n(709335,'652928000000','652900000000','652928','6529','阿瓦提县','','','阿瓦提县','3','新疆维吾尔自治区','阿克苏地区','阿瓦提县','新疆维吾尔自治区阿克苏地区阿瓦提县',null,null,40.6445100,80.3730600),\n(709521,'652929000000','652900000000','652929','6529','柯坪县','','','柯坪县','3','新疆维吾尔自治区','阿克苏地区','柯坪县','新疆维吾尔自治区阿克苏地区柯坪县',null,null,40.5082600,79.0468100),\n(709570,'653000000000','650000000000','6530','65','克孜勒苏柯尔克孜自治州','','克孜勒苏柯尔克孜自治州','','2','新疆维吾尔自治区','克孜勒苏柯尔克孜自治州','','新疆维吾尔自治区克孜勒苏柯尔克孜自治州',null,null,39.7153000,76.1666100),\n(709571,'653001000000','653000000000','653001','6530','阿图什市','','','阿图什市','3','新疆维吾尔自治区','克孜勒苏柯尔克孜自治州','阿图什市','新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿图什市',null,null,39.7161000,76.1683900),\n(709704,'653022000000','653000000000','653022','6530','阿克陶县','','','阿克陶县','3','新疆维吾尔自治区','克孜勒苏柯尔克孜自治州','阿克陶县','新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿克陶县',null,null,39.1478600,75.9474000),\n(709878,'653023000000','653000000000','653023','6530','阿合奇县','','','阿合奇县','3','新疆维吾尔自治区','克孜勒苏柯尔克孜自治州','阿合奇县','新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿合奇县',null,null,40.9370400,78.4462600),\n(709916,'653024000000','653000000000','653024','6530','乌恰县','','','乌恰县','3','新疆维吾尔自治区','克孜勒苏柯尔克孜自治州','乌恰县','新疆维吾尔自治区克孜勒苏柯尔克孜自治州乌恰县',null,null,39.7190900,75.2584100),\n(709977,'653100000000','650000000000','6531','65','喀什地区','','喀什地区','','2','新疆维吾尔自治区','喀什地区','','新疆维吾尔自治区喀什地区',null,null,39.4704200,75.9897600),\n(709978,'653101000000','653100000000','653101','6531','喀什市','','','喀什市','3','新疆维吾尔自治区','喀什地区','喀什市','新疆维吾尔自治区喀什地区喀什市',null,null,39.4677200,75.9938100),\n(710233,'653121000000','653100000000','653121','6531','疏附县','','','疏附县','3','新疆维吾尔自治区','喀什地区','疏附县','新疆维吾尔自治区喀什地区疏附县',null,null,39.3751600,75.8629600),\n(710399,'653122000000','653100000000','653122','6531','疏勒县','','','疏勒县','3','新疆维吾尔自治区','喀什地区','疏勒县','新疆维吾尔自治区喀什地区疏勒县',null,null,39.4013400,76.0479700),\n(710660,'653123000000','653100000000','653123','6531','英吉沙县','','','英吉沙县','3','新疆维吾尔自治区','喀什地区','英吉沙县','新疆维吾尔自治区喀什地区英吉沙县',null,null,38.9295600,76.1756100),\n(710857,'653124000000','653100000000','653124','6531','泽普县','','','泽普县','3','新疆维吾尔自治区','喀什地区','泽普县','新疆维吾尔自治区喀什地区泽普县',null,null,38.1917400,77.2709500),\n(711033,'653125000000','653100000000','653125','6531','莎车县','','','莎车县','3','新疆维吾尔自治区','喀什地区','莎车县','新疆维吾尔自治区喀什地区莎车县',null,null,38.4143200,77.2462900),\n(711647,'653126000000','653100000000','653126','6531','叶城县','','','叶城县','3','新疆维吾尔自治区','喀什地区','叶城县','新疆维吾尔自治区喀什地区叶城县',null,null,37.8829900,77.4136700),\n(712064,'653127000000','653100000000','653127','6531','麦盖提县','','','麦盖提县','3','新疆维吾尔自治区','喀什地区','麦盖提县','新疆维吾尔自治区喀什地区麦盖提县',null,null,38.9049300,77.6527300),\n(712285,'653128000000','653100000000','653128','6531','岳普湖县','','','岳普湖县','3','新疆维吾尔自治区','喀什地区','岳普湖县','新疆维吾尔自治区喀什地区岳普湖县',null,null,39.2333000,76.7779600),\n(712413,'653129000000','653100000000','653129','6531','伽师县','','','伽师县','3','新疆维吾尔自治区','喀什地区','伽师县','新疆维吾尔自治区喀什地区伽师县',null,null,39.4880600,76.7237900),\n(712772,'653130000000','653100000000','653130','6531','巴楚县','','','巴楚县','3','新疆维吾尔自治区','喀什地区','巴楚县','新疆维吾尔自治区喀什地区巴楚县',null,null,39.7851900,78.5490600),\n(713034,'653131000000','653100000000','653131','6531','塔什库尔干塔吉克自治县','','','塔什库尔干塔吉克自治县','3','新疆维吾尔自治区','喀什地区','塔什库尔干塔吉克自治县','新疆维吾尔自治区喀什地区塔什库尔干塔吉克自治县',null,null,37.7729700,75.2247000),\n(713097,'653200000000','650000000000','6532','65','和田地区','','和田地区','','2','新疆维吾尔自治区','和田地区','','新疆维吾尔自治区和田地区',null,null,37.1143100,79.9224700),\n(713098,'653201000000','653200000000','653201','6532','和田市','','','和田市','3','新疆维吾尔自治区','和田地区','和田市','新疆维吾尔自治区和田地区和田市',null,null,37.1117800,79.9132100),\n(713359,'653221000000','653200000000','653221','6532','和田县','','','和田县','3','新疆维吾尔自治区','和田地区','和田县','新疆维吾尔自治区和田地区和田县',null,null,37.1117800,79.9132100),\n(713631,'653222000000','653200000000','653222','6532','墨玉县','','','墨玉县','3','新疆维吾尔自治区','和田地区','墨玉县','新疆维吾尔自治区和田地区墨玉县',null,null,37.2772000,79.7289500),\n(714095,'653223000000','653200000000','653223','6532','皮山县','','','皮山县','3','新疆维吾尔自治区','和田地区','皮山县','新疆维吾尔自治区和田地区皮山县',null,null,37.6213900,78.2830000),\n(714355,'653224000000','653200000000','653224','6532','洛浦县','','','洛浦县','3','新疆维吾尔自治区','和田地区','洛浦县','新疆维吾尔自治区和田地区洛浦县',null,null,37.0737000,80.1888900),\n(714615,'653225000000','653200000000','653225','6532','策勒县','','','策勒县','3','新疆维吾尔自治区','和田地区','策勒县','新疆维吾尔自治区和田地区策勒县',null,null,36.9984600,80.8100500),\n(714768,'653226000000','653200000000','653226','6532','于田县','','','于田县','3','新疆维吾尔自治区','和田地区','于田县','新疆维吾尔自治区和田地区于田县',null,null,36.8572800,81.6771200),\n(715018,'653227000000','653200000000','653227','6532','民丰县','','','民丰县','3','新疆维吾尔自治区','和田地区','民丰县','新疆维吾尔自治区和田地区民丰县',null,null,37.0641900,82.6959500),\n(715070,'654000000000','650000000000','6540','65','伊犁哈萨克自治州','','伊犁哈萨克自治州','','2','新疆维吾尔自治区','伊犁哈萨克自治州','','新疆维吾尔自治区伊犁哈萨克自治州',null,null,43.9168900,81.3241600),\n(715071,'654002000000','654000000000','654002','6540','伊宁市','','','伊宁市','3','新疆维吾尔自治区','伊犁哈萨克自治州','伊宁市','新疆维吾尔自治区伊犁哈萨克自治州伊宁市',null,null,43.9095000,81.2772500),\n(715260,'654003000000','654000000000','654003','6540','奎屯市','','','奎屯市','3','新疆维吾尔自治区','伊犁哈萨克自治州','奎屯市','新疆维吾尔自治区伊犁哈萨克自治州奎屯市',null,null,44.4268900,84.9016700),\n(715339,'654004000000','654000000000','654004','6540','霍尔果斯市','','','霍尔果斯市','3','新疆维吾尔自治区','伊犁哈萨克自治州','霍尔果斯市','新疆维吾尔自治区伊犁哈萨克自治州霍尔果斯市',null,null,44.1986500,80.4131700),\n(715402,'654021000000','654000000000','654021','6540','伊宁县','','','伊宁县','3','新疆维吾尔自治区','伊犁哈萨克自治州','伊宁县','新疆维吾尔自治区伊犁哈萨克自治州伊宁县',null,null,43.9095000,81.2772500),\n(715592,'654022000000','654000000000','654022','6540','察布查尔锡伯自治县','','','察布查尔锡伯自治县','3','新疆维吾尔自治区','伊犁哈萨克自治州','察布查尔锡伯自治县','新疆维吾尔自治区伊犁哈萨克自治州察布查尔锡伯自治县',null,null,43.8407200,81.1512800),\n(715727,'654023000000','654000000000','654023','6540','霍城县','','','霍城县','3','新疆维吾尔自治区','伊犁哈萨克自治州','霍城县','新疆维吾尔自治区伊犁哈萨克自治州霍城县',null,null,44.0559900,80.8789900),\n(715896,'654024000000','654000000000','654024','6540','巩留县','','','巩留县','3','新疆维吾尔自治区','伊犁哈萨克自治州','巩留县','新疆维吾尔自治区伊犁哈萨克自治州巩留县',null,null,43.4825700,82.2317500),\n(716018,'654025000000','654000000000','654025','6540','新源县','','','新源县','3','新疆维吾尔自治区','伊犁哈萨克自治州','新源县','新疆维吾尔自治区伊犁哈萨克自治州新源县',null,null,43.4298800,83.2615700),\n(716156,'654026000000','654000000000','654026','6540','昭苏县','','','昭苏县','3','新疆维吾尔自治区','伊犁哈萨克自治州','昭苏县','新疆维吾尔自治区伊犁哈萨克自治州昭苏县',null,null,43.1572400,81.1310200),\n(716301,'654027000000','654000000000','654027','6540','特克斯县','','','特克斯县','3','新疆维吾尔自治区','伊犁哈萨克自治州','特克斯县','新疆维吾尔自治区伊犁哈萨克自治州特克斯县',null,null,43.2179900,81.8360300),\n(716393,'654028000000','654000000000','654028','6540','尼勒克县','','','尼勒克县','3','新疆维吾尔自治区','伊犁哈萨克自治州','尼勒克县','新疆维吾尔自治区伊犁哈萨克自治州尼勒克县',null,null,43.7990400,82.5119000),\n(716506,'654200000000','650000000000','6542','65','塔城地区','','塔城地区','','2','新疆维吾尔自治区','塔城地区','','新疆维吾尔自治区塔城地区',null,null,46.7453200,82.9804600),\n(716507,'654201000000','654200000000','654201','6542','塔城市','','','塔城市','3','新疆维吾尔自治区','塔城地区','塔城市','新疆维吾尔自治区塔城地区塔城市',null,null,46.7514500,82.9870300),\n(716724,'654202000000','654200000000','654202','6542','乌苏市','','','乌苏市','3','新疆维吾尔自治区','塔城地区','乌苏市','新疆维吾尔自治区塔城地区乌苏市',null,null,44.4355600,84.6785100),\n(717120,'654221000000','654200000000','654221','6542','额敏县','','','额敏县','3','新疆维吾尔自治区','塔城地区','额敏县','新疆维吾尔自治区塔城地区额敏县',null,null,46.5245700,83.6282200),\n(717407,'654223000000','654200000000','654223','6542','沙湾县','','','沙湾县','3','新疆维吾尔自治区','塔城地区','沙湾县','新疆维吾尔自治区塔城地区沙湾县',null,null,44.3262800,85.6195900),\n(717905,'654224000000','654200000000','654224','6542','托里县','','','托里县','3','新疆维吾尔自治区','塔城地区','托里县','新疆维吾尔自治区塔城地区托里县',null,null,45.9367700,83.6062100),\n(718004,'654225000000','654200000000','654225','6542','裕民县','','','裕民县','3','新疆维吾尔自治区','塔城地区','裕民县','新疆维吾尔自治区塔城地区裕民县',null,null,46.2010900,82.9827700),\n(718081,'654226000000','654200000000','654226','6542','和布克赛尔蒙古自治县','','','和布克赛尔蒙古自治县','3','新疆维吾尔自治区','塔城地区','和布克赛尔蒙古自治县','新疆维吾尔自治区塔城地区和布克赛尔蒙古自治县',null,null,46.7930200,85.7285600),\n(718197,'654300000000','650000000000','6543','65','阿勒泰地区','','阿勒泰地区','','2','新疆维吾尔自治区','阿勒泰地区','','新疆维吾尔自治区阿勒泰地区',null,null,47.8456400,88.1402300),\n(718198,'654301000000','654300000000','654301','6543','阿勒泰市','','','阿勒泰市','3','新疆维吾尔自治区','阿勒泰地区','阿勒泰市','新疆维吾尔自治区阿勒泰地区阿勒泰市',null,null,47.8270000,88.1324300),\n(718382,'654321000000','654300000000','654321','6543','布尔津县','','','布尔津县','3','新疆维吾尔自治区','阿勒泰地区','布尔津县','新疆维吾尔自治区阿勒泰地区布尔津县',null,null,47.6998900,86.8631300),\n(718471,'654322000000','654300000000','654322','6543','富蕴县','','','富蕴县','3','新疆维吾尔自治区','阿勒泰地区','富蕴县','新疆维吾尔自治区阿勒泰地区富蕴县',null,null,46.9936200,89.5255300),\n(718571,'654323000000','654300000000','654323','6543','福海县','','','福海县','3','新疆维吾尔自治区','阿勒泰地区','福海县','新疆维吾尔自治区阿勒泰地区福海县',null,null,47.1120000,87.4867700),\n(718739,'654324000000','654300000000','654324','6543','哈巴河县','','','哈巴河县','3','新疆维吾尔自治区','阿勒泰地区','哈巴河县','新疆维吾尔自治区阿勒泰地区哈巴河县',null,null,48.0606900,86.4192000),\n(718881,'654325000000','654300000000','654325','6543','青河县','','','青河县','3','新疆维吾尔自治区','阿勒泰地区','青河县','新疆维吾尔自治区阿勒泰地区青河县',null,null,46.6791100,90.3755800),\n(718948,'654326000000','654300000000','654326','6543','吉木乃县','','','吉木乃县','3','新疆维吾尔自治区','阿勒泰地区','吉木乃县','新疆维吾尔自治区阿勒泰地区吉木乃县',null,null,47.4431000,85.8754000),\n(719010,'659000000000','650000000000','6590','65','自治区直辖县级行政区划','','自治区直辖县级行政区划','','2','新疆维吾尔自治区','自治区直辖县级行政区划','','新疆维吾尔自治区自治区直辖县级行政区划',null,null,null,null),\n(719011,'659001000000','659000000000','659001','6590','石河子市','','','石河子市','3','新疆维吾尔自治区','自治区直辖县级行政区划','石河子市','新疆维吾尔自治区自治区直辖县级行政区划石河子市',null,null,44.2920800,86.0505680),\n(719155,'659002000000','659000000000','659002','6590','阿拉尔市','','','阿拉尔市','3','新疆维吾尔自治区','自治区直辖县级行政区划','阿拉尔市','新疆维吾尔自治区自治区直辖县级行政区划阿拉尔市',null,null,40.5479800,81.2806700),\n(719485,'659003000000','659000000000','659003','6590','图木舒克市','','','图木舒克市','3','新疆维吾尔自治区','自治区直辖县级行政区划','图木舒克市','新疆维吾尔自治区自治区直辖县级行政区划图木舒克市',null,null,39.8596380,79.0874400),\n(719636,'659004000000','659000000000','659004','6590','五家渠市','','','五家渠市','3','新疆维吾尔自治区','自治区直辖县级行政区划','五家渠市','新疆维吾尔自治区自治区直辖县级行政区划五家渠市',null,null,44.1679900,87.5401700),\n(719687,'659006000000','659000000000','659006','6590','铁门关市','','','铁门关市','3','新疆维吾尔自治区','自治区直辖县级行政区划','铁门关市','新疆维吾尔自治区自治区直辖县级行政区划铁门关市',null,null,41.8686800,85.6758300);"
  },
  {
    "path": "SpringCloud-Demo-Doc/其他个人总结/openresty.conf",
    "content": "\n#user  nobody;\nworker_processes  1;\n\nerror_log  logs/error.log;\n#error_log  logs/error.log  notice;\n#error_log  logs/error.log  info;\n\n#pid        logs/nginx.pid;\n\n\nevents {\n    worker_connections  1024;\n}\n\n\nhttp {\n    include       mime.types;\n    default_type  application/octet-stream;\n\n    #log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n    #                  '$status $body_bytes_sent \"$http_referer\" '\n    #                  '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    #access_log  logs/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    #keepalive_timeout  0;\n    keepalive_timeout  65;\n\n    #gzip  on;\n\n    server {\n        listen       8000;\n        server_name  localhost;\n\n        #charset koi8-r;\n\n        #access_log  logs/host.access.log  main;\n\n        location / {\n            #root   html;\n            #index  index.html index.htm;\n            default_type text/html;\n\n            content_by_lua_block {\n\t            ngx.say(\"Hello Openresty!!\")\n\t        }\n        }\n\t\t\n\t\tlocation = /ex_redirect {\n            #root   html;\n            #index  index.html index.htm;\n            default_type text/html;\n\n            content_by_lua_block {\n\t            ngx.say(\"Hello Openresty!!\")\n\t        }\n        }\n\t\t\n\t\tlocation = /foo {\n\t\t\tcontent_by_lua_block {\n\t\t\t\treturn ngx.redirect('/ex_redirect')\n\t\t\t}\n\t\t}\n\t\t\n\t    location = /sum {\n            #内部调用\n\t        internal;\n\n\t        content_by_lua_block {\n\t\t        ngx.sleep(0.1)\n\t\t        local args = ngx.req.get_uri_args()\n\t\t        ngx.print(tonumber(args.a) + tonumber(args.b))\n\t        }\n        }\n\t\t\n\t    location = /subduction {\n\t        #内部调用\n\t        internal;\n\t\t\t\n\t        content_by_lua_block {\n\t            ngx.sleep(0.1)\n\t            local args = ngx.req.get_uri_args()\n\t            ngx.print(tonumber(args.a) - tonumber(args.b))\n\t        }\n\t    }\n\t\t\n\t    #并行\n\t    location = /app/test_parallels {\n\t        default_type text/html;\n\n\t        content_by_lua_block {\n\t\t        local start = ngx.now();\n\t\t        local res1, res2 = ngx.location.capture_multi({\n\t\t            {\"/sum\", {args={a=3, b=8}}},\n\t\t            {\"/subduction\", {args={a=3, b=8}}}\n\t\t        })\n\t\t        ngx.say(\"status:\", res1.status,\" response:\", res1.body)\n\t\t        ngx.say(\"status:\", res2.status,\" response:\", res2.body)\n\t\t        ngx.say(\"parallels time used:\",ngx.now() - start)\n\t        }\n\t    }\n\t\t\n\t    #串行\n\t    location = /app/test_queue {\n\t        default_type text/html;\n\n            content_by_lua_block {\n\t            local start = ngx.now()\n\t\t        local res1 = ngx.location.capture_multi( {\n\t\t            {\"/sum\", {args={a=3, b=8}}}\n\t\t        })\n\t            local res2 = ngx.location.capture_multi( {\n\t\t            {\"/subduction\", {args={a=3, b=8}}}\n\t\t        })\n\t\t        ngx.say(\"status:\", res1.status,\" response:\", res1.body)\n\t\t        ngx.say(\"status:\", res2.status,\" response:\", res2.body)\n\t\t        ngx.say(\"queue time used:\",ngx.now() - start)\n\t        }\n\t    }\n\n        #error_page  404              /404.html;\n\n        # redirect server error pages to the static page /50x.html\n        #\n        error_page   500 502 503 504  /50x.html;\n        location = /50x.html {\n            root   html;\n        }\n\n        # proxy the PHP scripts to Apache listening on 127.0.0.1:80\n        #\n        #location ~ \\.php$ {\n        #    proxy_pass   http://127.0.0.1;\n        #}\n\n        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000\n        #\n        #location ~ \\.php$ {\n        #    root           html;\n        #    fastcgi_pass   127.0.0.1:9000;\n        #    fastcgi_index  index.php;\n        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;\n        #    include        fastcgi_params;\n        #}\n\n        # deny access to .htaccess files, if Apache's document root\n        # concurs with nginx's one\n        #\n        #location ~ /\\.ht {\n        #    deny  all;\n        #}\n    }\n\n\n    # another virtual host using mix of IP-, name-, and port-based configuration\n    #\n    #server {\n    #    listen       8000;\n    #    listen       somename:8080;\n    #    server_name  somename  alias  another.alias;\n\n    #    location / {\n    #        root   html;\n    #        index  index.html index.htm;\n    #    }\n    #}\n\n\n    # HTTPS server\n    #\n    #server {\n    #    listen       443 ssl;\n    #    server_name  localhost;\n\n    #    ssl_certificate      cert.pem;\n    #    ssl_certificate_key  cert.key;\n\n    #    ssl_session_cache    shared:SSL:1m;\n    #    ssl_session_timeout  5m;\n\n    #    ssl_ciphers  HIGH:!aNULL:!MD5;\n    #    ssl_prefer_server_ciphers  on;\n\n    #    location / {\n    #        root   html;\n    #        index  index.html index.htm;\n    #    }\n    #}\n\n}\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/其他个人总结/stock.lua",
    "content": "local key = KEYS[1]\nlocal stock = KEYS[2]\nlocal lockTimeOut = ARGV[2]\n\n-- 检测库存配置\nlocal stockObj = redis.call(\"GET\",stock);\nif stockObj == nil then\n\treturn -1\nend\n\n--判断库存\nlocal stockNum = tonumber(stockObj)\nif nil == stockNum or stockNum <= 0 then\n\t--库存不足\n\treturn -1\nend\n\n-- 锁定成功，如果key不存在则添加 (SET if Not eXists)缩写\nif redis.call(\"SETNX\", key, 0) == 1 then\n    -- 设置过期时间\n    redis.call(\"EXPIRE\", key, lockTimeOut)\n    local stockNum = tonumber(redis.call(\"GET\",stock))\n    if nil ~= stockNum and stockNum > 0 then\n\t\t--库存减1\n\t\tlocal currentNum = redis.call(\"DECRBY\", stock , 1)\n\t\t-- 库存不存在，返回库存不足\n\t\tif currentNum == -1 then\n\t\t\t-- 释放锁\n\t\t\tredis.call(\"DEL\",key)\n\t\t\treturn -1\n\t\tend\n\t\t-- 获得库存 释放锁\n\t\tredis.call(\"DEL\",key)\n\telse\n\t\t-- 库存不足，释放锁\n\t\tredis.call(\"DEL\",key)\n\t\treturn -1\n    end\n    return 1\nelseif redis.call(\"TTL\", key) == -1 then\n    redis.call(\"EXPIRE\", key, lockTimeOut)\nend\n-- 已锁定\nreturn 0"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/auto_deploy.sh",
    "content": "#!/bin/bash\n\n## jenkins 自动部署脚本   jekins 项目 Post Steps设置 启动该脚本，配置如下：\n#  BUILD_ID=DONTKILLME\n#  bash /home/omni-services/remote-deploy/auto_deploy.sh\n\nSERVICE_NAME=content-management-service\nJARPATH=/root/.jenkins/workspace/$SERVICE_NAME-perf/target/$SERVICE_NAME.jar\necho \"service name:$SERVICE_NAME\"\nSERVICE_HOME=/home/omni-services/$SERVICE_NAME\nJARFILE=$SERVICE_HOME/$SERVICE_NAME.jar\nBOOTSTRAP_FILE=$SERVICE_HOME/bootstrap.sh\n\necho \"=====service name: $SERVICE_NAME\"\necho \"=====service home: $SERVICE_HOME\"\necho \"=====service resouce jar path: $JARPATH\"\necho \"=====service bootstrap file: $BOOTSTRAP_FILE\"\necho \"=====service jar: $JARFILE\"\n\n## 停止原来的服务\necho \"-----Stop service\"\nbash $BOOTSTRAP_FILE stop\n\n## 备份原来的Jar包\necho \"-----Bach source jar file: $JARFILE\"\nmv $JARFILE $SERVICE_HOME/$SERVICE_NAME-`date \"+%Y-%m-%d %H:%M:%S\"`.jar\n\n## 复制新包\necho \"-----Copy $JARPATH to $SERVICE_HOME\"\ncp $JARPATH $SERVICE_HOME\nCOPYRULST=$?\n\n## 复制OK，开始启动\nif [ $COPYRULST -eq 0 ]; \nthen\n    echo \"-----Copy success,wait start service.....\"\n    bash $BOOTSTRAP_FILE start\n    RETVAL=$?\n    if [ $RETVAL -eq 0 ];\n    then\n       echo \"-----$SERVICE_NAME started!\"\n    else\n       echo \"-----$SERVICE_NAME start failed!\"\n    fi\nelse\n    echo \"-----Not exist $SERVICE_NAME jar\"\n    exit 1\nfi\n\n\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/bootstrap.sh",
    "content": "#!/bin/bash\n## 加载配置，避免获取不到java_home \nsource /etc/profile\n\nSERVICE_NAME=message-producer\nSERVICE_HOME=/home/omni-services/$SERVICE_NAME\nPROG=$SERVICE_HOME/\nPIDFILE=$SERVICE_HOME/$SERVICE_NAME.pid\nJARFILE=$SERVICE_HOME/$SERVICE_NAME.jar\nLOG_FILE=$SERVICE_NAME.log\n\n#堆配置：服务模式(启动慢，一次编译，运行效率高)、最小内存512m、最大内存512m、年轻代大512m\nHEAP_OPTIONS=\"-server -Xms512m -Xmx512m -Xmn256m\"\n#栈配置：设置每个线程的栈大小，DK5.0以后每个线程栈大小为1M，依据实际情况设定。较少的值内存能生成更多的线程（受系统限制），较大的值可（如2M）能会再一定程度上降低性能。\n#STACKS_OPTIONS=-Xss128K\n## GC配置：gc详情、gc时间、gc日志文件位置、gc堆栈信息\nGC_OPTIONS=\"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$SERVICE_HOME/$SERVICE_NAME_gc.log -XX:+PrintHeapAtGC\"\n## gc收集器：Java提供串行收集器、并行收集器、并发收集器三种，串行收集器只适用于小数据量的情况，并行收集器主要以到达一定的吞吐量为目标\n# 并行垃圾收集器：配置仅对年轻代有效、并行线程数20(建议与处理器数目相等)\nGC_COLLECTOR_PARAL=\"-XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC\"\n## 老年代垃圾收集器：年老代垃圾收集方式为并行收集(1.6以后支持)\n# CMS垃圾收集器：初始标记->并发标记->并发预清理->重新标记->并发清理->并发重置(标记-清理 算法),CMS默认在老年代空间使用68%时候启动垃圾回收。可以通过-XX:CMSinitiatingOccupancyFraction=n来设置这个阀值。\n#GC_COLLECTOR_CMS=\"-XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=4\"\n## oom配置：OOM时导出堆到文件、导出OOM的路径\n#-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid ，即当程序OOM时，在D:/a.txt中将会生成线程的dump。\nOOM_OPTIONS=\"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$SERVICE_HOME/$SERVICE_NAME.dump\"\n## 类加载监控\n#CLASS_LOAD_MONITOR=\"-XX:+TraceClassLoading -XX:+PrintClassHistogram\"\n## 其他配置：新生的转老年代GC次数、禁止程序GC、set/get使用本地方法、加快编译、锁机制的性能改善\n#OTHER_OPTIONS=\"-XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking\"\n## jvm 参数配置\nJAVA_OPTS=\"$HEAP_OPTIONS $PERM_OPTIONS $GC_OPTIONS $GC_COLLECTOR_PARAL $OOM_OPTIONS\"\n\n\ncd $SERVICE_HOME\n\nstatus() {  \n    if [ -f $PIDFILE ]; then  \n        PID=$(cat $PIDFILE)  \n        if [ ! -x /proc/${PID} ]; then  \n            return 1  \n        else  \n            return 0  \n        fi  \n    else  \n        return 1  \n    fi  \n}  \n  \ncase \"$1\" in  \n    start)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            echo \"-----$PIDFILE exists, process is already running or crashed\"  \n            exit 1  \n        fi  \n        \n        ##检测 java环境\n        if [ ! -n $JAVA_HOME ]; then\n           echo \"-----Please check JAVA_HOME!\"\n           echo \"-----Exit\"\n           exit 1\n        else\n           echo \"-----Jave home: $JAVA_HOME\"\n           echo \"-----Starting $PROG ...\"\n           echo \"-----Java options: $JAVA_OPTS\"\n           nohup java $JAVA_OPTS -jar $JARFILE  > $LOG_FILE 2>&1 &\n\n           RETVAL=$?\n           if [ $RETVAL -eq 0 ]; then\n               echo \"-----$PROG is started\"\n               echo $! > $PIDFILE\n               exit 0\n           else\n               echo \"-----Stopping $PROG\"\n               rm -f $PIDFILE\n               exit 1\n           fi        \n        fi\n        ;;  \n    stop)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            echo \"-----Shutting down $PROG\"  \n            kill -9 `cat $PIDFILE`  \n            RETVAL=$?  \n            if [ $RETVAL -eq 0 ]; then\n                LS_DATE=`date +%Y%m%d`\n                BACK_LOG=$SERVICE_NAME-$LS_DATE.log\n                BACK_LOG_FILE=$SERVICE_HOME/$BACK_LOG\n                ## 备份日志文件\n                if [  -f \"$BACK_LOG_FILE\" ]; then\n                    echo \"-----Back log file $BACK_LOG exist and copy log to back file!\"\n                    echo \"--------------------------------------------------------------------------------------------------------------------\" >> $BACK_LOG\n                    echo `date \"+%Y-%m-%d %H:%M:%S\"` >> $BACK_LOG\n                    echo \"-----------------------------------------重新启动-------------------------------------------------------------------\" >> $BACK_LOG\n                    cat $LOG_FILE >> $BACK_LOG\n                    ## 删除日志文件\n                    rm -f $LOG_FILE\n                else\n                    echo \"-----Back log file to $BACK_LOG....\"\n                    mv $LOG_FILE $BACK_LOG\n                fi\n                ## 删除Pid文件\n                rm -f $PIDFILE \n            else  \n                echo \"-----Failed to stopping $PROG\"  \n            fi  \n        fi  \n        ;;  \n    status)  \n        status  \n        RETVAL=$?  \n        if [ $RETVAL -eq 0 ]; then  \n            PID=$(cat $PIDFILE)  \n            echo \"-----$PROG is running ($PID)\"  \n        else  \n            echo \"-----$PROG is not running\"  \n        fi  \n        ;;  \n    restart)  \n        $0 stop  \n        $0 start  \n        ;;  \n    *)  \n        echo \"Usage: $0 {start|stop|restart|status}\"  \n        ;;  \nesac  \n\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/example-gitlab-ci.yml",
    "content": "before_script:\n  - echo \"每个job之前都会执行\"\nafter_script:\n  - echo \"每个job之后都会执行\"\n\n#全局变量定义，在job中使用 ${variableName}\n#内置变量：CI_COMMIT_REF_NAME（项目所在的分支或标签名称）、CI_JOB_NAME（任务名称）、CI_JOB_STAGE（任务阶段）\nvariables:\n  # 定义拉取代码的方式，有3种：clone/fetch/none，默认为clone，速度最慢，每步job都会重新clone一次代码。我们一般将它设置为none，\n  # 在具体任务里设置为fetch就可以满足需求，毕竟不是每步都需要新代码，那也不符合我们测试的流程\n  GIT_STRATEGY: \"none\" #GIT策略，\n\n# 来指定需要在job之间缓存的文件或目录\ncache:\n  #因为缓存为不同管道和任务间共享，可能会覆盖，所以有时需要设置key\n  key: ${CI_COMMIT_REF_NAME}  # 启用每分支缓存\n  #key: \"$CI_JOB_NAME/$CI_COMMIT_REF_NAME\" # 启用每个任务和每个分支缓存\n  untracked: true    #缓存所有Git未跟踪的文件\n  #paths:    #缓存哪些文件/文件夹\n    #- node_modules/\n    #- dist/\n\n#表示构建阶段，主要包含 build、test、deploy三个阶段，任务将按此顺序执行\n# build阶段job并行，所有build执行ok并行test阶段job，所有test执行ok并行deploy，全部ok标记success，否则标记failure\n# yml文件中如未明确定义stages，默认取值就是：build、test、deploy，job中未指定stage，默认取值test\nstages:\n  - build\n  - test\n  - deploy\n\n# Jobs 表示构建工作，表示某个 Stage 里面执行的工作,可以在 Stages 里面定义多个 Jobs\n# 定义job任务，job_name 全局唯一且不能是关键字\ntest-job1:\n  # test阶段执行\n  stage: test\n  tags:\n    - xx  #注册runner的标签\n  only:\n    - dev # 只有dev分支提交代码才会执行这个任务\n    - /^future-.*$/  #正则匹配，只有future-开头的分支执行\n  script:  #要执行的内容，脚本\n    - echo \"I am job1\"\n    - echo \"Just from dev&future-* branch and test phase!\"\n  # 代码覆盖率设置\n  coverage: '/Code coverage: \\d+\\.\\d+/'\n  # 指定该任务执行完毕后，哪些目录或文件需要保留，打成zip包供后续使用\n  artifacts:\n    path:\n      - public\n  # 定义此作业完成部署的环境名称，job将会执行部署到production环境\n  #environment:\n    #name: production\n\ntest-job2:\n  # 默认stage阶段为 test\n  stage: test\n  only:\n    - master # 只有Master分支有提交代码才会执行\n  script:\n    - echo \"Trigger for master branch!\"\n  allow_failure: true #允许失败，即不影响下一步构建\n\nbuild-job:\n  stage: build\n  except:\n    - dev # 除dev环境，其他分之提交点都会执行\n  script:\n    - echo \"Trigger without dev branc!\"\n  # when触发条件\n  # on_success、on_failure、always、manual(手动)\n  # 不管前面步骤是否成功，都会执行\n  when: always\n\n############################ yml高级用法###########################\n# .开头的job忽略执行，做继承、模板方法等\n# &(锚)使用隐藏的key,*(aliases)别名做job模板，后续job可以<<(继承)\n.general: &job_template\n  stage: deploy\n  script:\n    - echo 'Job template'\n    - path/shell.sh  #执行一个脚本\n  only:\n    - master\n  tags:\n    - runnerTag\n\n# 生产job\n.prod: &prod\n  # 继承general\n  <<: *job_template\n  # 重写script\n  script:\n    - echo 'Prod branch!'\n\n# 各环境配置\n.test: &test\n  <<: *job_template\n  script:\n    - echo 'Dev branch!'\n  only:\n    - test\n\n.dev: &dev\n  <<: *job_template\n  script:\n    - echo 'Dev branch!'\n  only:\n    - dev\n    - /^feture-*$/\n\nprod-job:\n  <<: *prod\ntest-job:\n  <<: *test\ndev-job:\n  <<: *dev\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/gitlab-hooks/checkStyle模板",
    "content": ""
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/gitlab-hooks/pre-receive",
    "content": "#!/bin/bash\n\n##脚本提供功能：Commit提交的Message和代码规范是否符合统一规范\n##分三个部分：\n# 1.变量定义部分\n# 2.校验部分：注释校验&代码分析\n# 3.初始化入口\n## 校验流程：\n# 1.先做提交注释校验，校验的规则：是否已${TYPE_LIST}定义的开头，且内容长度是否大于${COMMIT_MESSAGE_MIN_LENGTH}\n# 2.如果是master分之，修改了pom文件还会校验是否存在snapshot版本的jar\n# 3.最后代码规范校验\n## (单个项目校验)文件放置目录\n# 1./var/opt/gitlab/git-data/repositories/@hashed/xx/xx/xx.git或者/var/opt/gitlab/git-data/repositories/${group}/${project_name}.git/\n# 2.创建custom_hooks目录\n# 3.在custom_hooks目录下创建pre-receive文件，并保持776可执行权限，且保持该文件权限：chown git:git pre-receive 以及阿里云的p3c-pmd的jar包权限\n# 4.给chown -R git:git custom_hooks\n# 5.官方文档说明：https://docs.gitlab.com/ee/administration/custom_hooks.html#setup\n\n####### 初始化变量部分 #########\n\n## 定义java_home变量 需要修改你配置的java_home\nJAVA_HOME=your_java_home\n## 是否开启commit message的校验：0是，1否\nCHECK_COMMIT_MESSAGE_ON=0\n## 是否开启代码检查：0是，1否\nCHECK_CODE_RULE_ON=0\n## 是否校验master上的pom文件是否包含snapshot：0是，1否\nCHECK_MASTER_POM_SNAPSHOT_ON=1\n## 注释内容最小长度，默认20\nCOMMIT_MESSAGE_MIN_LENGTH=20\n### 代码校验规则：0使用阿里云P3C规则，1使用checkStyle\nCODE_RULE_TYPE=0\n\n## 定义提交开头类型字符规则\n## e.g: fix:测试提交bug修复，Bug编号#12\nTYPE_LIST=(\n         'feat:'   #新功能feature\n         'update:' #在feat内修改\n         'fix:'  #修补bug\n         'docs:'  #文档\n         'style:' #格式化，不影响代码运行的变动\n         'refactor:' #重构\n         'pref:'  #性能优化\n         'test:'  #增加测试\n         'chore:'  #构建过程或辅助工具的变动\n         #'[ci skip]'  #忽略校验\n)\n\n## 获取当前路径\nBASE_PATH=$(cd `dirname $0`; pwd)\n\n#定义和组装校验规则\ndeclare -a regex_list\narrLen=${#TYPE_LIST[@]}\nfor ((i=0;i<$arrLen;i++)) do\n  regex_list[i]='^'${TYPE_LIST[i]}\ndone\nregex_list[$arrLen+1]='^[ci skip]:'\n#echo \"reg_list=== \"${regex_list[@]}\nseparator=\"|\"\n## 合并成一个完整的正则表达式\nregex=\"$( printf \"${separator}%s\" \"${regex_list[@]}\" )\"\n#echo \"type regex: \"$regex\n## 去除头部的 |\nregex=${regex:${#separator}}\n#echo \"regex: \"$regex\n\n## 定义注释出错提示信息\ntips_msg=\"$( printf \"${separator}%s\" \"${TYPE_LIST[@]}\" )\"\ntips_msg=${tips_msg:${#separator}}\n####### 初始化变量部分 #########\n\n####### 校验部分：注释校验&代码分析###########\n## 校验commit message\nvalidate_commit_message()\n{\n   oldrev=$(git rev-parse $1)\n   newrev=$(git rev-parse $2)\n   refname=\"$3\"\n   #echo 'Old version: '$oldrev\n   #echo 'New version: '$newrev\n   #echo 'Branch: '$refname\n\n   ## git 命令\n   #GITCMD=\"git\"\n   ## 按时间倒序列出 commit  找出两个版本之间差异的版本号集合  oldrev~newrev\n   commitList=`git rev-list $oldrev..$newrev`\n   #echo 'commitList: '$commitList\n\n   split=($commitList)\n   #echo 'split: '$split\n\n   # 遍历数组\n   for s in ${split[@]}\n   do\n      #echo “$s”\n      #通过版本号获取仓库中对象实体的类型、大小和内容的信息\n      #比如提交人、作者、邮件、提交时间、提交内容等\n      currentContent=`git cat-file commit $s`\n      #echo 'Commit obj: '$currentContent\n      #获取提交内容\n      msg=`git cat-file commit $s | sed '1,/^$/d'`\n      #echo 'msg: '$msg\n\n\t    ## merge合并分之直接放行\n\t    if [[ $msg == *\"Merge branch\"* ]]; then\n        echo \"Merge branch...skip the checking\"\n\t    else\n\t\t    ## 做内容校验\n\t\t    match=`echo $msg | grep -nE \"(${regex})\"`\n\t\t    #echo 'Match result: '$match\n\n\t\t    ## 找到匹配说明是符合规范的\n\t\t    if [ \"${match}\" != \"\" ]; then\n          ## 校验注释长度\n          msg_length=${#msg}\n          #echo \"Msg length: ${msg_length}\"\n          if [[ ${msg_length} -lt ${COMMIT_MESSAGE_MIN_LENGTH} ]]; then\n            echo -e \"Error: Commit message should be bigger than ${COMMIT_MESSAGE_MIN_LENGTH} and current commit message length: ${msg_length}\"\n            exit 1\n          fi\n\n          ### 找到匹配内容做相应处理，如fix ,校验pom文件等\n          #if [[ \"${match}\" =~ \"fix:\" ]]; then\n            ## 如果是修补bug，规范有点获取到fix中的ID，然后调用禅道对外的API关闭，其他场景类似\n          #fi\n\n          # 是否开启校验和master分之\n          isMaster=$(echo $refname | grep \"master$\")\n          if [ $CHECK_MASTER_POM_SNAPSHOT_ON == 0 ] && [ -n \"$isMaster\" ]; then\n            # 如果是master分之，并且pom文件发生了变更，判断pom文件是否含有sonapshot的引用\n            pomfile=`git diff --name-only ${oldrev} ${newrev} | grep -e \"pom\\.xml\"`\n            if [[ \"${pomfile}\" != \"\" ]]; then\n              #echo $pomfile\n              ## 获取pom文件更新的内容\n              pomcontent=`git show $newrev:$pomfile`\n              #echo $pomcontent\n              ## 校验pom文件是否包含snapshot版本\n              if [[ $pomcontent =~ 'SNAPSHOT' ]]; then\n                echo -e \"Error: Snapshot version cannot exist in master branch!\"\n                exit 1\n              fi\n            fi\n          fi\n\n          ## 其他操作\n          echo \"Commit Success!\"\n        else\n          echo -e \"Error: Commit comments message should be started with [${tips_msg}]...\"\n          exit 1\n        fi\n\t\t  fi\n   done\n}\n\n## 代码校验\nvalidate_code_rules()\n{\n   echo 'Start code analysis!'\n   oldrev=$(git rev-parse $1)\n   newrev=$(git rev-parse $2)\n   refname=\"$3\"\n   #echo 'Old version: '$oldrev\n   #echo 'New version: '$newrev\n   #echo 'Branch: '$refname\n\n   FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e \"\\.java$\"`\n\n   if [ -n \"$FILES\" ]; then\n      TEMPDIR=$BASE_PATH/\"tmp\"\n      for FILE in ${FILES}; do\n          mkdir -p \"${TEMPDIR}/`dirname ${FILE}`\" >/dev/null\n          git show $newrev:$FILE > ${TEMPDIR}/${FILE}\n      done;\n\n      # 多级项目目录支持\n      MAIN_JAVA_PATH=$TEMPDIR'/**/src/main'\n      #echo 'Temp update files path: '$MAIN_JAVA_PATH\n\n      #FILES_TO_CHECK=`find $MAIN_JAVA_PATH -name '*.java'`\n\n      #echo 'Check files:'${FILES_TO_CHECK}\n      echo 'Aliyun p3c-pmd check starting.....'\n\n      #echo 'Current shell Path:' $BASE_PATH\n      #echo 'JAVA_HOME:' $JAVA_HOME\n      #echo 'Root directory for java sources: '$MAIN_JAVA_PATH\n\n      if [[ $CODE_RULE_TYPE == 0 ]]; then\n         ## 需要阿里云P3C的插件包p3c-pmd-2.0.0.jar与该脚本在同级目录下\n         echo 'Code analysis for Aliyun-p3c..'\n         #$JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text\n         #$JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text\n         # 使用 tmp目录，原MAIN_JAVA_PATH拼接有问题，新版gitlab无项目路径\n\t $JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text\n\t RESULT=$?\n         #echo $RESULT\n         if [ $RESULT -gt 0 ]; then\n\t   ## 删除tmp目录，不影响下一个提交\n\t   rm -rf $TEMPDIR\n           exit 1;\n         fi\n      elif [[ $CODE_RULE_TYPE == 1 ]]; then\n         ## 需要CheckStyle插件包checkstyle-8.16-all与该脚本在同级目录下，并且需要对应的CheckStyle.xml模板文件e.g:Cheetah_Checkstyle_ruleset.xml\n         echo 'Code analysis for CheckStyle..'\n           CHECK_RESULT=`$JAVA_HOME/bin/java -jar $BASE_PATH/checkstyle-8.16-all.jar -c $BASE_PATH/Cheetah_Checkstyle_ruleset.xml $MAIN_JAVA_PATH`\n       if [[ $CHECK_RESULT =~ \"[WARN]\" ]]; then\n         echo $CHECK_RESULT | sed 's/\\[WARN\\]/\\n/g'\n\t ## 删除tmp目录，不影响下一个提交\n\t rm -rf $TEMPDIR\n         exit 1\n       fi\n      else\n         ## 不支持的检查操作\n         echo \"Unsupported code validation rule,Please contact the administrator to check the configuration of [CODE_RULE_TYPE] in pre-receive script!\"\n\t ## 删除tmp目录，不影响下一个提交\n\t rm -rf $TEMPDIR\n         exit 1\n      fi\n\n      echo 'End code analysis!'\n\n      rm -rf $TEMPDIR\n   fi\n}\n####### 校验部分：注释校验&代码分析###########\n\n####### 执行入口###########\npre_receive()\n{\n    #commit message 校验\n\tif [[ $CHECK_COMMIT_MESSAGE_ON == 0 ]]; then\n\t   validate_commit_message $1 $2 $3\n\tfi\n\n    #代码规则检查\n\tif [[ $CHECK_CODE_RULE_ON == 0 ]]; then\n\t   validate_code_rules $1 $2 $3\n\tfi\n}\n\n# update hook触发会带参数执行if逻辑\n# hooks脚本触发无参数执行else逻辑\nif [ -n \"$1\" -a -n \"$2\" -a -n \"$3\" ]; then\n    # Output to the terminal in command line mode - if someone wanted to\n    # resend an email; they could redirect the output to sendmail\n    # themselves\n    pre_receive $2 $3 $1\n    #echo $1'+'$2'+'$3\nelse\n    while read oldrev newrev refname\n    do\n       pre_receive $oldrev $newrev $refname\n       #echo $oldrev' '$newrev' '$refname\n    done\nfi\n####### 执行入口###########\nexit 0\n\n### 参考文献：\n# https://www.jianshu.com/p/73073bab7337\n# https://www.jianshu.com/p/b87ca8615c9c\n# https://blog.csdn.net/u012465508/article/details/80788557\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/gitlab-hooks/pre-receive(checkstyle版本，使用请更名为pre-receive)",
    "content": "\nEJECT=0\n#JAVA_HOME=/usr/local/java8\nJAVA_HOME=/usr/local/jdk1.8.0_141\nBASE_PATH=$(cd `dirname $0`; pwd)\n\nwhile read oldrev newrev refname; do\n    echo 'old version:'${oldrev}\n    echo 'new version:'${newrev}\n    echo 'branc:'${refname}\n    \n    if [ \"$oldrev\" = \"0000000000000000000000000000000000000000\" ];then\n        oldrev=\"${newrev}^\"\n    fi\n\n    FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e \"\\.java$\"`\n\n    if [ -n \"$FILES\" ]; then\n        TEMPDIR=$BASE_PATH/\"tmp\"\n        for FILE in ${FILES}; do\n            mkdir -p \"${TEMPDIR}/`dirname ${FILE}`\" >/dev/null\n            git show $newrev:$FILE > ${TEMPDIR}/${FILE}\n        done;\n       \n        MAIN_JAVA_PATH=$TEMPDIR'/src/main'\n        #echo 'Temp update files path: '$MAIN_JAVA_PATH\n\n        #FILES_TO_CHECK=`find $MAIN_JAVA_PATH -name '*.java'`\n        \n        #echo 'Check files:'${FILES_TO_CHECK}\n        echo 'Cheet Checkstyle code starting.....'\n        \n        #echo 'Current shell Path:' $BASE_PATH\n        #echo 'JAVA_HOME:' $JAVA_HOME\n        #echo 'Root directory for java sources: '$MAIN_JAVA_PATH\n      \n       CHECK_RESULT=`$JAVA_HOME/bin/java -jar $BASE_PATH/checkstyle-8.16-all.jar -c $BASE_PATH/Cheetah_Checkstyle_ruleset.xml $MAIN_JAVA_PATH`\n       if [[ $CHECK_RESULT =~ \"[WARN]\" ]]; then\n         echo $CHECK_RESULT | sed 's/\\[WARN\\]/\\n/g'\n         REJECT=1\n       else\n         REJECT=0\n       fi\n      \n       echo 'Cheetah Checkstyle end...'\n\n       #REJECT=1\n       echo $REJECT\n\n       rm -rf $TEMPDIR\n    fi\ndone\n\nexit $REJECT\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/gitlab-hooks/pre-receive(p3c-pmd版，使用请更名为pre-receive)",
    "content": "\nEJECT=0\nJAVA_HOME=/usr/local/java8\nBASE_PATH=$(cd `dirname $0`; pwd)\n\nwhile read oldrev newrev refname; do\n    echo 'old version:'${oldrev}\n    echo 'new version:'${newrev}\n    echo 'branc:'${refname}\n    \n    if [ \"$oldrev\" = \"0000000000000000000000000000000000000000\" ];then\n        oldrev=\"${newrev}^\"\n    fi\n\n    FILES=`git diff --name-only ${oldrev} ${newrev}  | grep -e \"\\.java$\"`\n\n    if [ -n \"$FILES\" ]; then\n        TEMPDIR=$BASE_PATH/\"tmp\"\n        for FILE in ${FILES}; do\n            mkdir -p \"${TEMPDIR}/`dirname ${FILE}`\" >/dev/null\n            git show $newrev:$FILE > ${TEMPDIR}/${FILE}\n        done;\n       \n        MAIN_JAVA_PATH=$TEMPDIR'/src/main'\n        #echo 'Temp update files path: '$MAIN_JAVA_PATH\n\n        #FILES_TO_CHECK=`find $MAIN_JAVA_PATH -name '*.java'`\n        \n        #echo 'Check files:'${FILES_TO_CHECK}\n        echo 'Aliyun p3c-pmd check starting.....'\n        \n        #echo 'Current shell Path:' $BASE_PATH\n        #echo 'JAVA_HOME:' $JAVA_HOME\n        #echo 'Root directory for java sources: '$MAIN_JAVA_PATH\n      \n        #$JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text\n       \n       $JAVA_HOME/bin/java -Dpmd.language=en -cp $BASE_PATH/p3c-pmd-2.0.0.jar net.sourceforge.pmd.PMD -d $MAIN_JAVA_PATH -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text \n       REJECT=$?\n      \n       echo 'Aliyun p3c-pmd check end...'\n\n       #REJECT=1\n       echo $REJECT\n\n       rm -rf $TEMPDIR\n    fi\ndone\n\nexit $REJECT\n"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/monitor-jstat.sh",
    "content": "#!/bin/bash\n\n## 定时监控本机器下所有java应用的 JVM信息\n# 定时任务配置\n# crontab -e\n# 写入如下，5分钟执行一次检测\n# */5 * * * * /home/admin/monitor-jstat.sh >> /data/logs/monitor/monitor.log 2>&1\n\n#导入环境变量，需要查看当前的用户的环境变量，否则会出现jps ifconfig环境变量不可用错误提示\nexport PATH=$PATH:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/data/jdk1.8.0_181/bin:/home/admin/.local/bin:/home/admin/bin\n\n# 老年代告警阈值\noldwarn=\"99000\"\n# 元空间(永久代)告警阈值\nmetawarn=\"99900\"\n\n# 手机号码，多个用逗号隔开\nmobile=\n# 短信发送url地址\nsendsms=\njsonhead=\"Content-type:application/json\"\n\n## 当前日期\nsysdate=`date`\n## 当前服务器IP地址\naddr=`ifconfig -a|grep -w inet|grep -v 127.0.0.1|grep -v 172.16.1.1|awk '{print $2}'|cut -d : -f 2`\n\nfor pid in `jps -v |grep -v Jps |grep -v logstash-watch-collection |awk '{print $1}'`\n\ndo\n ## 应用名称\n name=`jps -v |grep -v Jps |grep -v logstash-watch-collection |grep $pid |awk '{print $2}'`\n\n #jvm内存监控\n #echo \"##################开始Java应用:${name}内存监控############################\"\n #echo \"监控日期：     $sysdate\"\n #echo \"进程PID：      $pid\"\n #echo \"进程名称：     $name\"\n #echo \"当前服务器IP： $addr\"\n\n # 堆栈信息\n jstat=$(jstat -gcutil ${pid})\n #echo -e \"jstat: \\n $jstat\"\n #S0=$(echo ${jstat}|sed -n '2p' |awk '{print $1}')\n #S0=$(echo ${jstat}|awk '{print $12}')\n #echo $S0\n\n # 新生代\n eden=$(echo ${jstat}|awk '{print $14}')\n from=$(echo ${jstat}|awk '{print $12}')\n tospc=$(echo ${jstat}|awk '{print $13}')\n # 老年代\n oldge=$(echo ${jstat}|awk '{print $15}')\n # 永久代 JDK8已经废弃改用 元空间代替\n meta=$(echo ${jstat}|awk '{print $16}')\n\n #echo \"Eden Space:           ${eden}%\"\n #echo \"From Space:           ${from}%\"\n #echo \"To Space:             ${tospc}%\"\n #echo \"Old Generation:       ${oldge}%\"\n #echo \"Meta Space:           ${meta}%\"\n\n ## 将读取到的各区的值*1000，以便做下一次的比较操作\n #eden1=`gawk -v x=$eden -v y=1000 'BEGIN{printf \"%.0f\\n\",x*y}'`\n #from1=`gawk -v x=$from -v y=1000 'BEGIN{printf \"%.0f\\n\",x*y}'`\n #tospc1=`gawk -v x=$tospc -v y=1000 'BEGIN{printf \"%.0f\\n\",x*y}'`\n oldge1=`gawk -v x=$oldge -v y=1000 'BEGIN{printf \"%.0f\\n\",x*y}'`\n meta1=`gawk -v x=$meta -v y=1000 'BEGIN{printf \"%.0f\\n\",x*y}'`\n\n #echo \"Eden*100 Space:           ${eden1}\"\n #echo \"From*100 Space:           ${from1}\"\n #echo \"To*100 Space:             ${tospc1}\"\n #echo \"Old*100 Generation:       ${oldge1}\"\n #echo \"Meta*1000 Space:          ${meta1}\"\n\n\n #if [ ${eden1} -ge \"99999\" ]\n #then\n   #jvm=$jvm+${name}+\":Eden Space:\"+${eden}+\"%超阀值 \"\n #fi\n\n #if [ ${from1} -ge \"99999\" ]\n #then\n   #jvm=$jvm+${name}+\":From Space:\"+${from}+\"%超阀值 \"\n #fi\n\n #if [ ${tospc1} -ge \"99999\" ]\n #then\n   #jvm=$jvm+${name}+\":To Space:\"+${topspc}+\"%超阀值 \"\n #fi\n\n # 仅监控 老年代和元空间，超过90以上报警\n jvm=\n if [ ${oldge1} -ge ${oldwarn} ]\n then\n   jvm=\"${jvm}[老年代 ${oldge}%超阀值]\"\n fi\n if [ ${meta1} -ge ${metawarn} ]\n then\n   jvm=\"${jvm}[元空间(永久代) ${meta}%超阈值]\"\n fi\n\n if [ ! -n \"$jvm\" ]\n then\n   echo \"应用:${name}-JVM信息正常\"\n else\n   jvm=\"应用${name}的JVM告警信息：${jvm}\"\n\n   echo \"监控日期：     $sysdate\"\n   echo \"进程PID：      $pid\"\n   echo \"进程名称：     $name\"\n   echo \"当前服务器IP： $addr\"\n   echo $jvm\n\n   #echo \"JVM告警信息：${jvm}\"\n   smsContent='{\"mobile\":\"'$mobile'\",\"content\":\"'$jvm'\",\"userid\":\"0001\",\"pwd\":\"123456\"}'\n   #echo \"JVM告警发送短信内容: ${smsContent}\"\n   # -s 不输出请求信息\n   smsResult=$(curl -H ${jsonhead} -X POST -s -d \"${smsContent}\" ${sendsms})\n   #echo \"短信返回结果：${smsResult}\"\n fi\n #echo \"##################结束Java应用:${name}内存监控############################\"\ndone"
  },
  {
    "path": "SpringCloud-Demo-Doc/持续集成/remote_deploy.sh",
    "content": "#!/bin/bash\n\n## jenkins 自动部远程署脚本，需要配置两个服务器之间免密登录\n## 免登陆配置参考：https://blog.csdn.net/u011186019/article/details/51737760?utm_source=blogxgwz4\n##jekins 项目 Post Steps设置 启动该脚本，配置如下：\n#BUILD_ID=DONTKILLME   -- 表示Jenkins执行完后不杀死该进程，否则会再jenkins执行完后杀死启动的进程\n#bash /home/omni-services/remote-deploy/remote-deploy.sh\n\nSERVICE_NAME=appname\nREMOTE_SERVICES_HOME=/home/services\nREMOTE_SERVICE_IP=目标服务器IP\nREMOTE_SERVICE_HOME=$REMOTE_SERVICES_HOME/$SERVICE_NAME\n##服务jar\nREMOTE_SERVICE_JAR=$REMOTE_SERVICE_HOME/$SERVICE_NAME.jar\n##启动脚本\nREMOTE_SERVICE_BOOTSTRAP=$REMOTE_SERVICE_HOME/bootstrap.sh\n##jenkins编译完成后服务Jar包位置\nLOCAL_JAR_PATH=/root/.jenkins/workspace/$SERVICE_NAME-perf/target/$SERVICE_NAME.jar\n\necho \"=============Service name: $SERVICE_NAME\"\necho \"=============Remote services home: $REMOTE_SERVICES_HOME\"\necho \"=============Remote server ip: $REMOTE_SERVICE_IP\"\necho \"=============Remote service home: $REMOTE_SERVICE_HOME\"\necho \"=============Remote service jar: $REMOTE_SERVICE_JAR\"\necho \"=============Remote service bootstrap file: $REMOTE_SERVICE_BOOTSTRAP\"\n\n## 远程操作，停止并备份原来的服务\necho \"-----Stop and Delete remote service: $SERVICE_NAME\"\nssh -T root@$REMOTE_SERVICE_IP << remotessh\nsh $REMOTE_SERVICE_BOOTSTRAP stop\nmv $REMOTE_SERVICE_JAR $REMOTE_SERVICE_HOME/$SERVICE_NAME-`date \"+%Y-%m-%d %H:%M:%S\"`.jar\nexit\nremotessh\n\n##复制一份新的服务Jar\necho \"-----Scp $LOCAL_JAR_PATH to $REMOTE_SERVICE_HOME\"\nscp $LOCAL_JAR_PATH root@$REMOTE_SERVICE_IP:$REMOTE_SERVICE_HOME \n\n##远程启动服务\necho \"-----Start remote service\"\nssh -T root@$REMOTE_SERVICE_IP << remotessh\nsh $REMOTE_SERVICE_BOOTSTRAP start\nexit\nremotessh\n\nexit\n"
  },
  {
    "path": "SpringCloud-Docker/Dockerfile",
    "content": "## 基于java 8镜像\nFROM java:8\n\n## 将本地文件挂在到当前容器\nVOLUME /tmp\n\n## 拷贝文件内容\nADD SpringCloud-Docker.jar SpringCloud-Docker.jar\nRUN bash -c 'touch /SpringCloud-Docker.jar'\n\n## 开放端口\nEXPOSE 8100\n\n## 容器启动后命令\nENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/SpringCloud-Docker.jar\"]\n"
  },
  {
    "path": "SpringCloud-Docker/README.md",
    "content": "**Docker + SpringBoot + Maven 构建发布到远程仓库**\n_环境：Aliyun Centos 7 Windows10 IDEA Maven3.5.4_\n\n1. Docker安装:<br>\n[参考阿里云的安装手册](https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.7b301991WYZA2d)<br>\n    1.1 **CentOS 7 (使用yum进行安装)**<b>\n    ```$xslt\n    # step 1: 安装必要的一些系统工具\n    sudo yum install -y yum-utils device-mapper-persistent-data lvm2\n    # Step 2: 添加软件源信息\n    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n    # Step 3: 更新并安装 Docker-CE\n    sudo yum makecache fast\n    sudo yum -y install docker-ce\n    # Step 4: 开启Docker服务\n    sudo service docker start\n    \n    # 注意：\n    # 官方软件源默认启用了最新的软件，您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用，你可以通过以下方式开启。同理可以开启各种测试版本等。\n    # vim /etc/yum.repos.d/docker-ce.repo\n    #   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1\n    #\n    # 安装指定版本的Docker-CE:\n    # Step 1: 查找Docker-CE的版本:\n    # yum list docker-ce.x86_64 --showduplicates | sort -r\n    #   Loading mirror speeds from cached hostfile\n    #   Loaded plugins: branch, fastestmirror, langpacks\n    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable\n    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable\n    #   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable\n    #   Available Packages\n    # Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)\n    # sudo yum -y install docker-ce-[VERSION]\n    ```\n   1.2 安装校验，输入如下命令，会显示docker信息<br>\n   ``docker version``\n 2. Docker私服仓库搭建(无登录密码)<br>\n   _环境：PSW(Private service warehouse私服仓库)，使用registry V2方式安装，域名假设域名使用reg.winner.com_<br>\n   2.1 host域名映射：echo '192.168.206.210 reg.winner.com'>> /etc/hosts <br>\n   2.2 环境准备-https证书(openssl证书生成，可能需要安装openssl):<br>\n   Key:\n   ````$xslt\n    mkdir -p ~/certs\n    cd ~/certs\n    openssl genrsa -out reg.winner.com.key 2048\n   ````\n   Crt文件：\n   ```$xslt\n    openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.winner.com.key -x509 -days 365 -out reg.winner.com.crt\n   ```\n   一些要填的信息:\n   ```$xslt\n    Country Name (2 letter code) [XX]:CN\n    # 国家\n    State or Province Name (full name) []:JS\n    # 省会\n    Locality Name (eg, city) [Default City]:NJ\n    # 城市\n    Organization Name (eg, company) [Default Company Ltd]:ITMUCH\n    # 组织(公司)\n    Organizational Unit Name (eg, section) []:ITMUCH\n    # 组织单位(部门)\n    Common Name (eg, your name or your server's hostname) []:reg.winner.com \n    # 域名\n    Email Address []:eacdy0000@126.com\n    # 邮件\n   ```\n   Tips:自签名证书不受docker信任,需要添加到Docker根证书中,Centos 7的存放路径：```/etc/docker/certs.d/域名``\n   ```$xslt\n   mkdir -p /etc/docker/certs.d/reg.winner.com\n   cp ~/certs/reg.winner.com.crt /etc/docker/certs.d/reg.winner.com/\n   ```\n   重启docker: ``service docker restart``<br>\n   2.3 私服仓库的启动：<br>\n   ``cd ~``\n   ```$xslt\n    docker run -d -p 443:5000 --restart=always --name registry -v `pwd`/certs:/certs -v /opt/docker-image:/opt/docker-image -e STORAGE_PATH=/opt/docker-image -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.winner.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/reg.winner.com.key registry:2\n   ```\n   ```$xslt\n       一些参数解释：\n       `pwd`/certs:/certs --- 将当前目录(cd ~)下的certs挂载到容器的certs目录\n       -v /opt/docker-image:/opt/docker-image --指定存储镜像路径，防止私有仓库容器被删，镜像也丢失\n       -e REGISTRY_HTTP_TLS_CERTIFICATE和-e REGISTRY_HTTP_TLS_KEY 指定证书路径\n   ```\n   2.4 开放远程API，以供我们IDEA+MAVEN远程push镜像到私服仓库:<br>\n   1). docker默认是没有开启Remote API的，需要我们手动开启\n   编辑``/lib/systemd/system/docker.service``文件。_(tips:该文件路径不一定在这里，本案例是在这个目录)_<br>\n   修改如下内容：\n   ```$xslt\n    [Service]\n    Type=notify\n    # the default is not to use systemd for cgroups because the delegate issues still\n    # exists and systemd currently does not support the cgroup feature set required\n    # for containers run by docker\n    ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375\n    #ExecStart=/usr/bin/dockerd -H fd://\n    #ExecStart=/usr/bin/dockerd -H unix://\n    ExecReload=/bin/kill -s HUP $MAINPID\n   ```\n   重点关注:``ExecStart``这个参数<br>\n   2). 重启服务<br>\n   ``sudo systemctl daemon-reload``<br>\n   ``sudo service docker restart``<br>\n   3). 验证<br>\n   浏览器输入``192.168.206.210:2375/images/json``能返回宿主机的所有信息，如镜像信息：\n   ```$xslt\n    [{\"Containers\":-1,\"Created\":1548890077,\"Id\":\"sha256:d0eed8dad114db55d81c870efb8c148026da4a0f61dc7710c053da55f9604849\",\"Labels\":null,\"ParentId\":\"\",\"RepoDigests\":[\"registry@sha256:870474507964d8e7d8c3b53bcfa738e3356d2747a42adad26d0d81ef4479eb1b\"],\"RepoTags\":[\"registry:2\"],\"SharedSize\":-1,\"Size\":25779681,\"VirtualSize\":25779681}]\n   ```\n   更多参考资料[Docker开启Remote API](https://blog.csdn.net/yuanlaijike/article/details/80913096)<br>\n3. IDEA + Maven + Springboot + Dockerfile发布到远程仓库<br>\n  _idea安装Docker Integration 插件，在setting->build->docker->tcp socket中配置Docker信息，选择一下私服仓库是所生成的.crt证书文件_<br>\n  [IDEA docker插件其他参考资料](https://www.jianshu.com/p/6ce91051d24c)<br>\n  3.1 windwos环境添加``DOCKER_HOST``环境变量:\n  ```$xslt\n    DOCKER_HOST\n    tcp://192.168.206.210:2375\n   ```\n  3.2 pom关键配置配置：\n  ```$xslt\n     <!-- maven docker 插件 -->\n                <plugin>\n                    <groupId>com.spotify</groupId>\n                    <artifactId>docker-maven-plugin</artifactId>\n                    <version>1.0.0</version>\n    \n                    <!--将插件绑定在某个phase执行-->\n                    <executions>\n                        <execution>\n                            <id>build-image</id>\n                            <!--将插件绑定在package这个phase上。用户只需执行mvn package ，就会自动执行mvn docker:build-->\n                            <phase>package</phase>\n                            <goals>\n                                <goal>build</goal>\n                            </goals>\n                        </execution>\n                    </executions>\n    \n                    <configuration>\n                        <!-- imageName一定要符合规则[a-z0-9-_.] -->\n                        <imageName>${project.artifactId}:${project.version}</imageName>\n                        <!--指定标签-->\n                        <imageTags>\n                            <imageTag>latest</imageTag>\n                        </imageTags>\n                        <!-- 指定 Dockerfile 路径  ${project.basedir}：项目根路径下-->\n                        <dockerDirectory>${project.basedir}</dockerDirectory>\n                        <!--指定远程 docker api地址-->\n                        <dockerHost>http://192.168.206.210:2375</dockerHost>\n                        <resources>\n                            <resource>\n                                <directory>${project.build.directory}</directory>\n                                <include>${project.build.finalName}.jar</include>\n                            </resource>\n                        </resources>\n                    </configuration>\n                </plugin>\n  ```\n  3.3 Dockerfile配置:\n  ```$xslt\n    ## 基于java 8镜像\n    FROM java:8\n    \n    ## 将本地文件挂在到当前容器\n    VOLUME /tmp\n    \n    ## 拷贝文件内容\n    ADD omni-zipkin-server.jar zipkin-server.jar\n    RUN bash -c 'touch /zipkin-server.jar'\n    \n    ## 开放端口\n    EXPOSE 8818\n    \n    ## 容器启动后命令\n    ENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/zipkin-server.jar\"]\n  ```\n  3.4 执行maven package 打包 输出信息：\n  ```$xslt\n   ......省略......\n   ......省略......\n     ---> Running in e29385dab518\n    Removing intermediate container e29385dab518\n     ---> 02cd42534504\n    Step 5/6 : EXPOSE 8818\n    \n     ---> Running in 7f88b962b174\n    Removing intermediate container 7f88b962b174\n     ---> d34b82c1092d\n    Step 6/6 : ENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/zipkin-server.jar\"]\n    \n     ---> Running in 3062e50da1ea\n    Removing intermediate container 3062e50da1ea\n     ---> 006a803605d3\n    ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}\n    Successfully built 006a803605d3\n    Successfully tagged omni-zipkin-server:0.0.1-SNAPSHOT\n    [INFO] Built omni-zipkin-server:0.0.1-SNAPSHOT\n    [INFO] Tagging omni-zipkin-server:0.0.1-SNAPSHOT with latest\n    [INFO] ------------------------------------------------------------------------\n    [INFO] BUILD SUCCESS\n   ```\n   3.5 到私服仓库查看镜像：\n   ```$xslt\n    [root@iZwz95nk600g8wdsa3pbxvZ ~]# docker images\n    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE\n    omni-zipkin-server   0.0.1-SNAPSHOT      006a803605d3        42 minutes ago      763MB\n    omni-zipkin-server   latest              006a803605d3        42 minutes ago      763MB\n    registry             2                   d0eed8dad114        29 hours ago        25.8MB\n    java                 8                   d23bdf5b1b1b        2 years ago         643MB\n   ```"
  },
  {
    "path": "SpringCloud-Docker/docker-build.sh",
    "content": "#!/bin/bash\n\n#### docker 构建脚本\n##背景：jenkins部署在容器中，无法利用docker执行操作，通过ssh将jar包和当前路径下的dockerfile推送到指定服务器目录上，使用脚本进行构建\n# 1. 本地已安装docker，docker push的前提需要当前服务器已经登陆到容器私服如harbor(docker login)\n# 2. 同级目录下必须存在Dockerfile文件和需要打包的springboot服务jar包\n# 参数说明 $1服务jar名称,$2镜像版本号\n## 执行示例： ./docker-build.sh product-service latest\n\nservice_name=$1\n# 镜像私服仓库/项目，使用harbor作为私服仓库\nregistry_name=myharbor.com:8088/project\nimage_tag=$2\njar_file=$service_name.jar\nimage_info=$registry_name/$service_name:$image_tag\n\n#echo $service_name\n#echo $jar_file\n#echo $image_info\n\necho \"开始执行镜像构建...\"\n# 执行docker 构建镜像\nbuild_result=$(docker build -t $image_info --build-arg JAR_FILE=$jar_file .)\n\n# 判断是否构建成功\n#echo $build_result\nif [[ $build_result =~ \"Successfully\" ]]; then\n  echo \"构建成功，镜像信息如下：\"\n  echo `docker images |grep $service_name`\n  echo \"开始执行镜像推送到私服仓库...\"\n  push_result=$(docker push $image_info)\n  if [[ $push_result =~ \"latest: digest\" ]]; then\n    echo \"推送镜像成功：\"$image_info\n    exit 0\n  else\n    echo \"推送镜像失败，失败信息如下：\"\n    echo $push_result\n    exit 1\n  fi\nelse\n  echo \"构建失败，失败信息如下：\"\n  echo $build_result\n  exit 1\nfi"
  },
  {
    "path": "SpringCloud-Docker/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Docker</artifactId>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <!--<spring-cloud.version>Dalston.RC1</spring-cloud.version>-->\n        <spring-cloud.version>Dalston.SR5</spring-cloud.version>\n        <zipkin.version>2.4.2</zipkin.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter</artifactId>\n    </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zuul</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zipkin</artifactId>\n        </dependency>\n\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-stream-binder-kafka</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-ui</artifactId>\n            <version>${zipkin.version}</version>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>\n            <version>${zipkin.version}</version>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n    <profiles>\n        <profile>\n            <id>dev</id>\n            <properties>\n                <env>dev</env>\n            </properties>\n        </profile>\n        <profile>\n            <id>test</id>\n            <properties>\n                <env>test</env>\n            </properties>\n            <activation>\n                <activeByDefault>true</activeByDefault>\n            </activation>\n        </profile>\n    </profiles>\n\n\n    <build>\n        <finalName>SpringCloud-Docker</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n            <!-- maven docker 插件 -->\n            <plugin>\n                <groupId>com.spotify</groupId>\n                <artifactId>docker-maven-plugin</artifactId>\n                <version>1.0.0</version>\n\n                <!--将插件绑定在某个phase执行-->\n                <executions>\n                    <execution>\n                        <id>build-image</id>\n                        <!--将插件绑定在package这个phase上。也就是说，用户只需执行mvn package ，就会自动执行mvn docker:build-->\n                        <phase>package</phase>\n                        <goals>\n                            <goal>build</goal>\n                        </goals>\n                    </execution>\n                </executions>\n\n                <configuration>\n                    <!-- 覆盖相同标签镜像 -->\n                    <forceTags>true</forceTags>\n                    <!-- imageName一定要符合规则[a-z0-9-_.] -->\n                    <imageName>${project.artifactId}:${project.version}</imageName>\n                    <!--指定标签-->\n                    <imageTags>\n                        <imageTag>latest</imageTag>\n                    </imageTags>\n                    <!-- 指定 Dockerfile 路径  ${project.basedir}：项目根路径下-->\n                    <dockerDirectory>${project.basedir}</dockerDirectory>\n                    <!--指定远程 docker api地址-->\n                    <dockerHost>http://192.168.206.210:2375</dockerHost>\n                    <resources>\n                        <resource>\n                            <directory>${project.build.directory}</directory>\n                            <include>${project.build.finalName}.jar</include>\n                        </resource>\n                    </resources>\n\n                    <!-- setting中配的 docker仓库信息 push到私服仓库 -->\n                    <!--<serverId>docker-registry</serverId>-->\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Docker/src/main/java/com/xiao/springboot/docker/OmniZipkinServerApplication.java",
    "content": "package com.xiao.springboot.docker;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer;\n\n//@EnableZipkinServer\n@EnableZipkinStreamServer\n@SpringBootApplication\npublic class OmniZipkinServerApplication\n{\n\n    public static void main(String[] args)\n    {\n        SpringApplication.run(OmniZipkinServerApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Docker/src/main/java/com/xiao/springboot/docker/controller/DockerDemo.java",
    "content": "package com.xiao.springboot.docker.controller;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/2/1 14:06\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/docker\")\npublic class DockerDemo\n{\n    @RequestMapping(\"/hello\")\n    public String helloDocker()\n    {\n        return \"Hello Docker!\";\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Docker/src/main/resources/application.yml",
    "content": "server:\n  port: 8100\nspring:\n  application:\n    name: docker-service"
  },
  {
    "path": "SpringCloud-Docker/zipkin-server-docker.sh",
    "content": "#!/bin/bash\n\nREMOTE_SERVICE_IP=ssh IP\nSERVICE_DOCKER_IAMGE_NAME=SpringCloud-Docker\nSERVICE_DOCKER_PORT=8818\nSERVICE_DOCKER_TAG=latest\n\n## docker root用户安装，普通用户admin执行无权限解决：\n#sudo groupadd docker     #添加docker用户组\n#sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中\n#newgrp docker     #更新用户组\n#docker ps    #测试docker命令是否可以使用sudo正常使用\n\n\n## 远程启动docker项目\nCONTAINER_ID=`ssh root@$REMOTE_SERVICE_IP docker ps -f ancestor=$SERVICE_DOCKER_IAMGE_NAME | awk 'NR > 1 {print $1}'`\necho \"-----启动开始启动远程服务\"\nssh -T root@$REMOTE_SERVICE_IP << remotessh\ndocker -v\nif [ $? -eq 0 ]; then\n  if [ -n \"$CONTAINER_ID\" ]; then\n     echo \"容器已存在,容器ID：$CONTAINER_ID,即将停止容器...\"\n     docker stop $CONTAINER_ID\n     echo \"容器已停止，即将重新启动...\"\n     docker run -p $SERVICE_DOCKER_PORT:$SERVICE_DOCKER_PORT -d $SERVICE_DOCKER_IAMGE_NAME:$SERVICE_DOCKER_TAG\n  else\n     echo \"即将启动...\"\n     docker run -p $SERVICE_DOCKER_PORT:$SERVICE_DOCKER_PORT -d $SERVICE_DOCKER_IAMGE_NAME:$SERVICE_DOCKER_TAG\n  fi\nelse\n  echo \"检测到未安装docker，请手动安装docker\"\nfi\nexit\nremotessh\n"
  },
  {
    "path": "SpringCloud-Eureka/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<parent>\r\n\t\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t\t<version>0.0.1-SNAPSHOT</version>\r\n\t</parent>\r\n\t<artifactId>SpringCloud-Eureka</artifactId>\r\n\r\n\t<dependencies>\r\n\t\t<!-- erueka配置 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-eureka-server</artifactId>\r\n\t\t</dependency>\r\n\t\t<!-- 注册中心配置 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\r\n\t\t\t<scope>test</scope>\r\n\t\t</dependency>\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<finalName>${artifactId}</finalName>\r\n\t\t<resources>\r\n\t\t\t<resource>\r\n\t\t\t\t<targetPath>${project.build.directory}/classes</targetPath>\r\n\t\t\t\t<directory>src/main/resources</directory>\r\n\t\t\t\t<filtering>true</filtering>\r\n\t\t\t\t<includes>\r\n\t\t\t\t\t<include>**/*.xml</include>\r\n\t\t\t\t\t<include>**/*.yml</include>\r\n\t\t\t\t\t<include>**/*.properties</include>\r\n\t\t\t\t\t<include>META-INF/**</include>\r\n\t\t\t\t</includes>\r\n\t\t\t</resource>\r\n\t\t</resources>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n</project>"
  },
  {
    "path": "SpringCloud-Eureka/readme.txt",
    "content": "注册中心\r\n\r\n\r\n启动后访问：\r\nhttp://localhost:1111/\r\n\r\n备注:\r\n 启动时候由于需要加载github上的配置，启动时会很慢\r\n\r\n"
  },
  {
    "path": "SpringCloud-Eureka/sql/config.sql",
    "content": "CREATE TABLE `properties` (\r\n  `id` bigint(16) NOT NULL AUTO_INCREMENT,\r\n  `key` varchar(255) DEFAULT NULL COMMENT '配置项KEY',\r\n  `value` varchar(255) DEFAULT NULL COMMENT '配置项值',\r\n  `application` varchar(255) DEFAULT NULL COMMENT '应用名称',\r\n  `profile` varchar(255) DEFAULT NULL COMMENT '环境,如dev,test,prod',\r\n  `label` varchar(45) DEFAULT NULL,\r\n  PRIMARY KEY (`id`),\r\n  UNIQUE KEY `id_UNIQUE` (`id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='配置中心表,配置文件按照{application}-{profile}.yml或者{application}-{profile}.properties格式命名';"
  },
  {
    "path": "SpringCloud-Eureka/src/main/java/com/xiao/skywalking/center/Application.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :Application.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月29日\r\n*/\r\n\r\npackage com.xiao.skywalking.center;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\r\n\r\n/**\r\n * [简要描述]:配置中心、注册中心合并<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月29日\r\n * @since\r\n */\r\n@SpringBootApplication\r\n// 注册中心\r\n@EnableEurekaServer\r\npublic class Application\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(Application.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Eureka/src/main/resources/application.yml",
    "content": "server:\r\n    port: 1111\r\n"
  },
  {
    "path": "SpringCloud-Eureka/src/main/resources/bootstrap.yml",
    "content": "spring:\r\n  application:\r\n    name: eureka-server\r\n  #配置中心获取eurak配置 eurka-server相关配置\r\n  cloud:\r\n    config:\r\n      #配置中心地址\r\n      uri: http://localhost:1110\r\n      #依环境读取\r\n      profile: dev\r\n      #主干分之\r\n      label: master\r\n      #文件前缀\r\n      name: eureka-server"
  },
  {
    "path": "SpringCloud-Gateway/README.txt",
    "content": "启动后直接请求：\r\nhttp://localhost:2000/consumer-1113/ribbon?hello=111\r\n会转发到consumer服务上"
  },
  {
    "path": "SpringCloud-Gateway/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<parent>\r\n\t\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t\t<version>0.0.1-SNAPSHOT</version>\r\n\t</parent>\r\n\t<artifactId>SpringCloud-Gateway</artifactId>\r\n\r\n\t<dependencies>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-zuul</artifactId>\r\n\t\t</dependency>\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-eureka</artifactId>\r\n\t\t</dependency>\r\n\r\n\r\n\t\t<!-- zipkin服务跟踪 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t<artifactId>spring-cloud-starter-zipkin</artifactId>\r\n\t\t</dependency>\r\n\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<finalName>message-service</finalName>\r\n\t\t<resources>\r\n\t\t\t<resource>\r\n\t\t\t\t<targetPath>${project.build.directory}/classes</targetPath>\r\n\t\t\t\t<directory>src/main/resources</directory>\r\n\t\t\t\t<filtering>true</filtering>\r\n\t\t\t\t<includes>\r\n\t\t\t\t\t<include>**/*.xml</include>\r\n\t\t\t\t\t<include>**/*.yml</include>\r\n\t\t\t\t\t<include>**/*.properties</include>\r\n\t\t\t\t\t<include>META-INF/**</include>\r\n\t\t\t\t</includes>\r\n\t\t\t</resource>\r\n\t\t</resources>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n\r\n</project>"
  },
  {
    "path": "SpringCloud-Gateway/src/main/java/com/xiao/skywalking/gateway/zuul/GatewayApplication.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :GateWayApplication.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n*/\r\n\r\npackage com.xiao.skywalking.gateway.zuul;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\r\nimport org.springframework.cloud.netflix.zuul.EnableZuulProxy;\r\n\r\n/**\r\n * [简要描述]:使用@EnableZuulProxy激活zuul<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@SpringBootApplication\r\n@EnableEurekaClient\r\n@EnableZuulProxy\r\npublic class GatewayApplication\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(GatewayApplication.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Gateway/src/main/resources/application.yml",
    "content": "#zuul 网关\r\nspring: \r\n  application: \r\n    name: service-zuul  #服务注册中心测试名\r\n  zipkin:\r\n    base-url: http://localhost:1115   #关联zipkin链路跟踪\r\nserver:\r\n  port: 2000\r\neureka:\r\n    instance: \r\n        # eureka实例的主机名\r\n        hostname: api-gateway\r\n    client:\r\n        serviceUrl: \r\n            defaultZone: http://localhost:1111/eureka/"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/README.MD",
    "content": "**SpringCloud Feign Hystrix 熔断、线程使用坑记录**\n\n坑：<br>\n1. 并发时Feign提供的服务其中一个接口出现超时异常次数多了，导致该Feign整个服务不可用，其实是hystrix进行了熔断处理，[Hystrix参考资料](https://segmentfault.com/a/1190000012439580)\n2. Feign提供服务，并发起来10个以上，就会出现线程池拒绝异常``RejectedExecutionException``，也是Hystrix搞的鬼，其默认线程池是10个，[关于Hystrix线程池的参考资料](https://www.cnblogs.com/seifon/p/9921774.html)\n\n参考文章中说明了几点会出现熔断(打开断路器)的：一个是请求到达一定的阈值、一个是错误发生超过了一定的比例。<br>\n\n**第一个问题：**<br>\n是由于feign的超时出现了错误，当并发访问达到一定错误比例的是，hystrix变开启了断路器(服务级别)，那么该服务下所有的接口将变得不可用。<br>\n首先我们看hystrix的超时通用配置：<br>\n```$xslt\nhystrix:\n  command:\n    ## 默认全局配置\n    default:\n      #fallback:\n        # 是否关闭回退方法\n        #enable: true\n        #isolation:\n          #semaphore:\n            ## 当触发fallback时，并发最大出发fallback的数量，超过该数量直接拒绝服务\n            #maxConcurrentRequests: 1000\n      execution:\n        # 断路器\n        circuitBreaker:\n          #确定断路器是否用于跟踪运行状况和断路请求\n          #enable: true\n          #当在配置时间窗口内达到此数量的失败后，进行短路。默认20个，如：10s内请求失败数量达到20个，断路器开\n          requestVolumeThreshold: 20\n          #短路多久以后开始尝试是否恢复，默认5s,缺省情况采用的是连续错误次数来隔离，一旦一个实例访问成功，马上恢复实例的访问\n          sleepWindowInMilliseconds: 5000\n          #出错百分比阈值，当达到此阈值后，开始短路。默认50%,(建议业务不要使用)\n          #errorThresholdPercentage: 50\n          #强制打开熔断器，如果打开这个开关，那么拒绝所有request，默认false\n          #forceOpen: false\n          #强制关闭熔断器 如果这个开关打开circuit将一直关闭且忽略circuitBreaker.errorThresholdPercentage\n          #forceClosed: false\n          #关闭超时熔断功能\n        #timeout:\n         #enable: false\n        isolation:\n          # 隔离策略：有THREAD(默认)(单独的线程上执行，并发请求受线程池中的线程数量的限制)和SEMAPHORE(调用线程上执行，并发请求受到信号量计数的限制)\n          #strategy: THREAD\n          #semaphore:\n            #当触发fallback时，并发最大出发fallback的数量，超过该数量直接拒绝服务，默认10，SEMAPHORE模式有效\n            #maxConcurrentRequests: 10\n          thread:\n            #设置熔断超时时间，默认1S，容易出现 fallback available 异常\n            #在THREAD模式下，达到超时时间，可以中断，在SEMAPHORE模式下，会等待执行完成后，再去判断是否超时\n            timeoutInMilliseconds: 5000\n            #调用线程允许请求HystrixCommand.GetFallback()的最大数量，默认10\n            #maxConcurrentRequests: 10\n            #在发生超时时是否应中断,默认值：true,THREAD模式有效\n            #interruptOnTimeout: true\n            #当发生取消时，执行是否应该中断，默认值：true,THREAD模式有效\n            #interruptOnCancel: true\n```\n这里主要关注：``hystrix.command.execution.circuitBreaker.isolation.thread.timeoutInMilliseconds``这一项配置，默认值是2S，\n并且这个配置的值要小于``ribbon.ReadTimeout``配置时间。<br>\n其次，既然是单个接口导致的服务超时，其他接口是可用的，而这里又是全局的配置，所以Hystrix也提供了针对接口级别的配置：<br>\n```$xslt\nhystrix:\n command:\n   ## 接口级别配置，其格式：feign名称#方法名(参数类型)\n   #ProducerFeign#timeout(String):\n     #execution:\n       #isolation:\n         #thread:\n           #timeoutInMilliseconds: 5000\n```\n此外，hystrix使用[Archaius](https://github.com/Netflix/archaius)来提供动态属性修改的支持，扩展步骤：<br>\n>> 1.初始化配置获取源，这里可以从配置中心、redis、zookeeper等，实现``com.netflix.config.PolledConfigurationSource``接口的poll方法，[参考类：DynamicConfigSource](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/dynamic/DynamicConfigSource.java)<br>\n>> 2.配置并初始化自动配置``com.netflix.config.DynamicConfiguration``，通过定时任务去定时刷新的，[参考类：InitHystrixConfiguration](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/dynamic/InitHystrixConfiguration.java)<br>\n>> 3.其他更多参考博文资料：[hystrix 简单使用以及动态配置更新](https://my.oschina.net/u/1169457/blog/1787414/)、[zookeeper的动态配置](https://github.com/tigerMoon/demo-hystrix-config)<br>\n\n以上能实现接口级别的隔离配置，来解决部分处理耗时的接口超时到时服务不可用的问题。<br>\n\n**第二个问题：**<br>\n并发起来，超过个10个线程出现线程拒绝异常``java.util.concurrent.RejectedExecutionException``<br>\n同样套路，我们来先看下配置:<br>\n```$xslt\nhystrix:\n  # 线程池\n  threadpool:\n    default:\n      #默认为10,基本得原则时保持线程池尽可能小，他主要是为了释放压力，防止资源被阻塞\n      coreSize: 50\n      ## 最大排队长度。默认-1,不能动态调整\n      maxQueueSize: 1000\n      #动态控制线程池队列的上限，即使maxQueueSize没有达到，达到queueSizeRejectionThreshold该值后，请求也会被拒绝，默认值5\n      #queueSizeRejectionThreshold: 800\n```\n默认线程池的配置只有10，而maxQueueSize也没有配置，queueSizeRejectionThreshold默认为5，那么超过10个线程并发请求即会出现线程拒绝异常了。<br>\n这里建议是：``coreSize``尽可能的小，``maxQueueSize``是不可动态修改的，``queueSizeRejectionThreshold``参数可以动态调整，可以用到上述第一个问题动态修改的套路使用，\n但这个值超过maxQueueSize的值就会失效<br>\n其他参考博文：[踩坑 Spring Cloud Hystrix 线程池队列配置](https://www.cnblogs.com/seifon/p/9921774.html)\n\n**此外，这里再扩展两个优化点**：<br>\n1. Hystrix请求缓存，请注意，仅针对同一线程内请求的缓存。这里使用注解来实现，步骤：<br>\n>> 1.实现一个filter,用来拦截所有请求的时候，初始化hystrix的上下文，[参考类:HystrixCacheFilter](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/filter)<br>\n>> 2.需要一个@ServletComponentScan注解来扫描到这个filter，[参考类：HystrixCacheConfiguration](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/config/HystrixCacheConfiguration.java)<br>\n>> 3.接口上使用@CacheResult注解，[参考类:ProducerFeign](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/feign/ProducerFeign.java)<br>\n\n2. 针对Feign服务接口做一层JVM缓存，提高短时间内重复请求的吞吐量和效率，本案例使用：springboot cache + caffeine 实现，接口上使用@Cacheable注解标记，[参考类:CaffeineCacheConfiguration](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/config/CaffeineCacheConfiguration.java)<br>\n \n[Github-Demo地址](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Hystrix-Demo)\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/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        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Hystrix-Consumer</artifactId>\n    <groupId>com.xiao.skywalking.demo</groupId>\n    <version>0.0.1-SNAPSHOT</version>\n\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <spring-cloud.version>Dalston.RC1</spring-cloud.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n        <!-- feign 默认集成hystrix ribbon -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-hystrix</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-ribbon</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n\n        <!-- spring 配置中心 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n\n        <!-- CaffeineCache缓存 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-cache</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.github.ben-manes.caffeine</groupId>\n            <artifactId>caffeine</artifactId>\n            <version>2.6.0</version>\n        </dependency>\n\n        <!-- sentinel -->\n        <!--<dependency>-->\n        <!--<groupId>org.springframework.cloud</groupId>-->\n        <!--<artifactId>spring-cloud-alibaba-sentinel</artifactId>-->\n        <!--<version>0.1.2.RELEASE</version>-->\n        <!--</dependency>-->\n        <!-- sentinel feign支持 -->\n        <!--<dependency>-->\n        <!--<groupId>org.springframework.cloud</groupId>-->\n        <!--<artifactId>spring-cloud-starter-openfeign</artifactId>-->\n        <!--<version>1.4.7.RELEASE</version>-->\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Dalston.RC1</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n</project>"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/ConsumerApplication.java",
    "content": "package com.xiao.hystrix.demo.consumer;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.client.RestTemplate;\n\n//import org.springframework.cloud.alibaba.sentinel.annotation.SentinelRestTemplate;\n//import org.springframework.context.annotation.Bean;\n//import org.springframework.web.client.RestTemplate;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:27\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableFeignClients\n@EnableEurekaClient\npublic class ConsumerApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConsumerApplication.class, args);\n    }\n\n    @Bean\n    //    @SentinelRestTemplate\n    //    @LoadBalanced\n    public RestTemplate restTemplate()\n    {\n        return new RestTemplate();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/api/ConsumerRestService.java",
    "content": "package com.xiao.hystrix.demo.consumer.api;\n\nimport com.xiao.hystrix.demo.consumer.feign.ProducerFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:29\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/consumer\")\npublic class ConsumerRestService\n{\n    @Autowired\n    private ProducerFeign producerFeign;\n\n    @RequestMapping(\"/timeout\")\n    public String timeout(String input)\n    {\n        return producerFeign.timeout(input);\n    }\n\n    @RequestMapping(\"/normal\")\n    public String normal(String input)\n    {\n        return producerFeign.normal(input);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/common/CacheConstants.java",
    "content": "package com.xiao.hystrix.demo.consumer.common;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/8 18:34\n * @since JDK 1.8\n */\npublic interface CacheConstants\n{\n    String CFG_DATA_CACHE = \"cfgDataCache\";\n    String BIZ_DATA_CACHE = \"bizDataCache\";\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/config/CaffeineCacheConfiguration.java",
    "content": "package com.xiao.hystrix.demo.consumer.config;\n\nimport com.github.benmanes.caffeine.cache.Caffeine;\nimport com.xiao.hystrix.demo.consumer.common.CacheConstants;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.cache.caffeine.CaffeineCacheManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/8 10:42\n * @since JDK 1.8\n */\n@Configuration\n@EnableCaching\n@Slf4j\npublic class CaffeineCacheConfiguration\n{\n    @Bean\n    public CacheManager cacheManager()\n    {\n        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();\n        Caffeine caffeine = Caffeine.newBuilder()\n                //cache的初始容量值\n                .initialCapacity(100)\n                // 最大容量值\n                .maximumSize(1000)\n                // 过期时间 1分钟\n                .expireAfterWrite(1, TimeUnit.MINUTES);\n        caffeineCacheManager.setAllowNullValues(true);\n        caffeineCacheManager.setCaffeine(caffeine);\n        caffeineCacheManager.setCacheNames(getNames());\n        return caffeineCacheManager;\n    }\n\n    private Collection<String> getNames()\n    {\n        List<String> names = new ArrayList<>(2);\n        names.add(CacheConstants.BIZ_DATA_CACHE);\n        names.add(CacheConstants.CFG_DATA_CACHE);\n        return names;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/config/FeignConfiguration.java",
    "content": "package com.xiao.hystrix.demo.consumer.config;\n\nimport com.xiao.hystrix.demo.consumer.feign.impl.ProducerFeignFallBack;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 16:11\n * @since JDK 1.8\n */\n//@Configuration\npublic class FeignConfiguration\n{\n    //    @Bean\n    public ProducerFeignFallBack feignFallBack()\n    {\n        return new ProducerFeignFallBack();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/config/HystrixCacheConfiguration.java",
    "content": "package com.xiao.hystrix.demo.consumer.config;\n\nimport org.springframework.boot.web.servlet.ServletComponentScan;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * [简要描述]: 初始化扫描 filter\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/8 10:18\n * @since JDK 1.8\n */\n@ServletComponentScan(basePackages = \"com.purcotton.pref.consumer.filter\")\n@Configuration\npublic class HystrixCacheConfiguration\n{\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/dynamic/DynamicConfigSource.java",
    "content": "package com.xiao.hystrix.demo.consumer.dynamic;\n\nimport com.netflix.config.PollResult;\nimport com.netflix.config.PolledConfigurationSource;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.cloud.config.environment.Environment;\nimport org.springframework.cloud.config.environment.PropertySource;\nimport org.springframework.http.*;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.client.HttpClientErrorException;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]: 动态刷新hystrix配置\n * [详细描述]: 可以从DB、redis、zookeeper、配置中心等等获取配置文件\n *\n * @author llxiao\n * @version 1.0, 2019/8/5 18:53\n * @since JDK 1.8\n */\n@Component\n@ConditionalOnProperty(name = \"hystrix.config.application\")\n@Slf4j\npublic class DynamicConfigSource implements PolledConfigurationSource\n{\n\n    public static final String HYSTRIX_CONFIG_APPLICATION = \"hystrix.config.application\";\n\n    @Value(\"${hystrix.config.application:hystrix}\")\n    private String application;\n    @Value(\"${spring.cloud.config.profile:}\")\n    private String profile;\n    @Value(\"${spring.cloud.config.uri:}\")\n    private String uri;\n    @Value(\"${spring.cloud.config.label:}\")\n    private String label;\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    /**\n     * Poll the configuration source to get the latest content.\n     *\n     * @param initial true if this operation is the first poll.\n     * @param checkPoint Object that is used to determine the starting point if the result returned is incremental.\n     * Null if there is no check point or the caller wishes to get the full content.\n     * @return The content of the configuration which may be full or incremental.\n     * @exception Exception If any exception occurs when fetching the configurations.\n     */\n    @Override\n    public PollResult poll(boolean initial, Object checkPoint) throws Exception\n    {\n        // 获取配置\n        return PollResult.createFull(getFromConfigCenter());\n    }\n\n    /**\n     * [简要描述]:配置中心获取hystrix配置<br/>\n     * [详细描述]:<br/>\n     *\n     * @return java.util.Map\n     * llxiao  2019/8/8 - 8:49\n     **/\n    private Map<String, Object> getFromConfigCenter()\n    {\n        Map<String, Object> complete = new HashMap<>();\n        Environment environment = getRemoteEnvironment();\n        if (null != environment)\n        {\n            if (environment.getPropertySources() != null)\n            {\n                for (PropertySource source : environment.getPropertySources())\n                {\n                    complete.putAll((Map<String, Object>) source.getSource());\n                }\n            }\n        }\n        return complete;\n    }\n\n    private Environment getRemoteEnvironment()\n    {\n        String path = \"/{name}/{profile}\";\n\n        Object[] args = new String[] { application, profile };\n        if (StringUtils.hasText(label))\n        {\n            args = new String[] { application, profile, label };\n            path = path + \"/{label}\";\n        }\n        ResponseEntity<Environment> response = null;\n\n        try\n        {\n            HttpHeaders headers = new HttpHeaders();\n            final HttpEntity<Void> entity = new HttpEntity<>((Void) null, headers);\n            response = restTemplate.exchange(uri + path, HttpMethod.GET, entity, Environment.class, args);\n        }\n        catch (HttpClientErrorException e)\n        {\n            if (e.getStatusCode() != HttpStatus.NOT_FOUND)\n            {\n                throw e;\n            }\n        }\n\n        if (response == null || response.getStatusCode() != HttpStatus.OK)\n        {\n            return null;\n        }\n        Environment result = response.getBody();\n        return result;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/dynamic/InitHystrixConfiguration.java",
    "content": "package com.xiao.hystrix.demo.consumer.dynamic;\n\nimport com.netflix.config.ConfigurationManager;\nimport com.netflix.config.DynamicConfiguration;\nimport com.netflix.config.FixedDelayPollingScheduler;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * [简要描述]: 初始化加载动态配置\n * [详细描述]: 通过定时任务动态获取hystrix的配置\n *\n * @author llxiao\n * @version 1.0, 2019/8/5 18:56\n * @since JDK 1.8\n */\n@Configuration\n@ConditionalOnBean(DynamicConfigSource.class)\n@Slf4j\npublic class InitHystrixConfiguration\n{\n    @Bean\n    public DynamicConfiguration dynamicConfiguration(DynamicConfigSource dynamicConfigSource)\n    {\n        log.info(\"初始化Hystrix 动态加载配置服务.....\");\n        // 延迟3000ms启动，每隔6S中执行一次，是否忽略删除配置\n        DynamicConfiguration dynamicConfiguration = new DynamicConfiguration(dynamicConfigSource, new FixedDelayPollingScheduler(\n                30 * 100, 60 * 100, false));\n        // 安裝后会启动schedel,定时调用DynamicConfigSource.poll()更新配置\n        ConfigurationManager.install(dynamicConfiguration);\n        return dynamicConfiguration;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/feign/ProducerFeign.java",
    "content": "package com.xiao.hystrix.demo.consumer.feign;\n\nimport com.netflix.hystrix.contrib.javanica.cache.annotation.CacheResult;\nimport com.xiao.hystrix.demo.consumer.common.CacheConstants;\nimport com.xiao.hystrix.demo.consumer.feign.impl.ProducerFeignFactory;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @since JDK 1.8\n */\n@FeignClient(name = \"pref-producer-service\", fallbackFactory = ProducerFeignFactory.class, path = \"/api\")\npublic interface ProducerFeign\n{\n    @CacheResult\n    @RequestMapping(\"/timeout\")\n    @Cacheable(value = CacheConstants.CFG_DATA_CACHE)\n    String timeout(@RequestParam(\"input\") String input);\n\n    @CacheResult\n    @RequestMapping(\"/normal\")\n    @Cacheable(value = CacheConstants.CFG_DATA_CACHE)\n    String normal(@RequestParam(\"input\") String input);\n}"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/feign/impl/ProducerFeignFactory.java",
    "content": "package com.xiao.hystrix.demo.consumer.feign.impl;\n\nimport com.xiao.hystrix.demo.consumer.feign.ProducerFeign;\nimport feign.hystrix.FallbackFactory;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.RejectedExecutionException;\n\n/**\n * [简要描述]: 工厂模式实现fallback\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/6 09:51\n * @since JDK 1.8\n */\n@Component\npublic class ProducerFeignFactory implements FallbackFactory<ProducerFeign>\n{\n    private final ProducerFeignFallBack producerFeignFallBack;\n\n    public ProducerFeignFactory(ProducerFeignFallBack producerFeignFallBack)\n    {\n        this.producerFeignFallBack = producerFeignFallBack;\n    }\n\n    /**\n     * Returns an instance of the fallback appropriate for the given cause\n     */\n    @Override\n    public ProducerFeign create(Throwable cause)\n    {\n        if (cause instanceof RejectedExecutionException)\n        {\n            cause.printStackTrace();\n        }\n        return producerFeignFallBack;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/feign/impl/ProducerFeignFallBack.java",
    "content": "package com.xiao.hystrix.demo.consumer.feign.impl;\n\nimport com.xiao.hystrix.demo.consumer.feign.ProducerFeign;\nimport org.springframework.stereotype.Component;\n\n/**\n * [简要描述]: fallback\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:31\n * @since JDK 1.8\n */\n@Component\npublic class ProducerFeignFallBack implements ProducerFeign\n{\n    @Override\n    public String timeout(String input)\n    {\n        return \"Time out fall back!  \" + input;\n    }\n\n    @Override\n    public String normal(String input)\n    {\n        return \"Normal fall back!  \" + input;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/java/com/xiao/hystrix/demo/consumer/filter/HystrixCacheFilter.java",
    "content": "package com.xiao.hystrix.demo.consumer.filter;\n\nimport com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;\n\nimport javax.servlet.*;\nimport javax.servlet.annotation.WebFilter;\nimport java.io.IOException;\n\n/**\n * [简要描述]: 请求缓存不是只写入一次结果就不再变化的，而是每次请求到达Controller的时候，我们都需要为HystrixRequestContext进行初始化，之前的缓存也就是不存在了，<p>\n * 我们是在同一个请求中保证结果相同，同一次请求中的第一次访问后对结果进行缓存，缓存的生命周期只有一次请求<p>\n * [详细描述]: 初始化HystrixRequestContext <p>\n * Hystrix 缓存使用：<p>\n * 1.需要初始化HystrixRequestContext，并在调用完后清理，使用filter方式进行全局拦截<p>\n * 2.使用CacheResult注解<p>\n * 3.仅限在同一个请求中多次调用feign中生效<p>\n *\n * @author llxiao\n * @version 1.0, 2019/8/8 10:14\n * @since JDK 1.8\n */\n@WebFilter(urlPatterns = \"/*\")\npublic class HystrixCacheFilter implements Filter\n{\n    /**\n     * Called by the web container to indicate to a filter that it is being\n     * placed into service. The servlet container calls the init method exactly\n     * once after instantiating the filter. The init method must complete\n     * successfully before the filter is asked to do any filtering work.\n     * <p>\n     * The web container cannot place the filter into service if the init method\n     * either:\n     * <ul>\n     * <li>Throws a ServletException</li>\n     * <li>Does not return within a time period defined by the web\n     * container</li>\n     * </ul>\n     *\n     * @param filterConfig The configuration information associated with the\n     * filter instance being initialised\n     * @exception ServletException if the initialisation fails\n     */\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException\n    {\n\n    }\n\n    /**\n     * The <code>doFilter</code> method of the Filter is called by the container\n     * each time a request/response pair is passed through the chain due to a\n     * client request for a resource at the end of the chain. The FilterChain\n     * passed in to this method allows the Filter to pass on the request and\n     * response to the next entity in the chain.\n     * <p>\n     * A typical implementation of this method would follow the following\n     * pattern:- <br>\n     * 1. Examine the request<br>\n     * 2. Optionally wrap the request object with a custom implementation to\n     * filter content or headers for input filtering <br>\n     * 3. Optionally wrap the response object with a custom implementation to\n     * filter content or headers for output filtering <br>\n     * 4. a) <strong>Either</strong> invoke the next entity in the chain using\n     * the FilterChain object (<code>chain.doFilter()</code>), <br>\n     * 4. b) <strong>or</strong> not pass on the request/response pair to the\n     * next entity in the filter chain to block the request processing<br>\n     * 5. Directly set headers on the response after invocation of the next\n     * entity in the filter chain.\n     *\n     * @param request The request to process\n     * @param response The response associated with the request\n     * @param chain Provides access to the next filter in the chain for this\n     * filter to pass the request and response to for further\n     * processing\n     * @exception IOException if an I/O error occurs during this filter's\n     * processing of the request\n     * @exception ServletException if the processing fails for any other reason\n     */\n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException\n    {\n        //初始化Hystrix请求上下文\n        HystrixRequestContext context = HystrixRequestContext.initializeContext();\n        try\n        {\n            chain.doFilter(request, response);\n        }\n        finally\n        {\n            //关闭Hystrix请求上下文\n            context.shutdown();\n        }\n    }\n\n    /**\n     * Called by the web container to indicate to a filter that it is being\n     * taken out of service. This method is only called once all threads within\n     * the filter's doFilter method have exited or after a timeout period has\n     * passed. After the web container calls this method, it will not call the\n     * doFilter method again on this instance of the filter. <br>\n     * <br>\n     * <p>\n     * This method gives the filter an opportunity to clean up any resources\n     * that are being held (for example, memory, file handles, threads) and make\n     * sure that any persistent state is synchronized with the filter's current\n     * state in memory.\n     */\n    @Override\n    public void destroy()\n    {\n\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/resources/application.properties",
    "content": "### sentinelʹ\n#spring.cloud.sentinel.transport.port=8730\n#spring.cloud.sentinel.transport.dashboard=192.168.206.212:8880\n# ʹð sentinel\n#feign.sentinel.enabled=true\n## hystrix\nfeign.hystrix.enabled=true\n## ĵhystrixӦ\nhystrix.config.application=hystrix-consumer-service\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/resources/application.yml",
    "content": "eureka:\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    lease-expiration-duration-in-seconds: 10\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    lease-renewal-interval-in-seconds: 2\n  client:\n    serviceUrl:\n      defaultZone: http://localhost:8888/eureka/\n      #开启健康检查（需要spring-boot-starter-actuator依赖）\n      #healthcheck:\n       #enable: true\nfeign:\n  #请求和响应进行GZIP压缩，以提高通信效率\n  compression:\n    request:\n      #配置请求GZIP压缩\n      enable: true\n      #配置压缩支持的MIME TYPE\n      mime-types: text/xml,application/xml,application/json\n      #配置压缩数据大小的下限\n      min-request-size: 208\n    #配置响应GZIP压缩\n    response:\n      enable: true\n\nribbon:\n  #设置连接超时时间\n  ConnectTimeout: 600\n  #设置读取超时时间\n  ReadTimeout: 5000\n  #对所有操作请求都进行重试\n  OkToRetryOnAllOperations: true\n  #切换实例的重试次数\n  MaxAutoRetriesNextServer: 2\n  #对当前实例的重试次数\n  MaxAutoRetries: 1\n\n# 设置针对hello-service服务的连接超时时间\n#hello-service.ribbon.ConnectTimeout=600\n# 设置针对hello-service服务的读取超时时间\n#hello-service.ribbon.ReadTimeout=6000\n# 设置针对hello-service服务所有操作请求都进行重试\n#hello-service.ribbon.OkToRetryOnAllOperations=true\n# 设置针对hello-service服务切换实例的重试次数\n#hello-service.ribbon.MaxAutoRetriesNextServer=2\n# 设置针对hello-service服务的当前实例的重试次数\n#hello-service.ribbon.MaxAutoRetries=1\n\nhystrix:\n  # 线程池\n  threadpool:\n    default:\n      #默认为10,基本得原则时保持线程池尽可能小，他主要是为了释放压力，防止资源被阻塞\n      coreSize: 50\n      ## 最大排队长度。默认-1,不能动态调整\n      maxQueueSize: 1000\n      #动态控制线程池队列的上限，即使maxQueueSize没有达到，达到queueSizeRejectionThreshold该值后，请求也会被拒绝，默认值5\n      #queueSizeRejectionThreshold: 800\n    #pref-producer-service:\n      #coreSize: 50\n      #maximumSize: 100\n      #keepAliveTimeMinutes: 1\n      #allowMaximumSizeToDivergeFromCoreSize: true\n  command:\n    ## 默认全局配置\n    default:\n      fallback:\n        # 是否关闭回退方法\n        #enable: true\n        #isolation:\n          #semaphore:\n            ## 当触发fallback时，并发最大出发fallback的数量，超过该数量直接拒绝服务\n            #maxConcurrentRequests: 1000\n      execution:\n        # 断路器\n        circuitBreaker:\n          #确定断路器是否用于跟踪运行状况和断路请求\n          #enable: true\n          #当在配置时间窗口内达到此数量的失败后，进行短路。默认20个，如：10s内请求失败数量达到20个，断路器开\n          requestVolumeThreshold: 20\n          #短路多久以后开始尝试是否恢复，默认5s,缺省情况采用的是连续错误次数来隔离，一旦一个实例访问成功，马上恢复实例的访问\n          sleepWindowInMilliseconds: 5000\n          #出错百分比阈值，当达到此阈值后，开始短路。默认50%,(建议业务不要使用)\n          #errorThresholdPercentage: 50\n          #强制打开熔断器，如果打开这个开关，那么拒绝所有request，默认false\n          #forceOpen: false\n          #强制关闭熔断器 如果这个开关打开circuit将一直关闭且忽略circuitBreaker.errorThresholdPercentage\n          #forceClosed: false\n          #关闭超时熔断功能\n        #timeout:\n         #enable: false\n        isolation:\n          # 隔离策略：有THREAD(默认)(单独的线程上执行，并发请求受线程池中的线程数量的限制)和SEMAPHORE(调用线程上执行，并发请求受到信号量计数的限制)\n          #strategy: THREAD\n          #semaphore:\n            #当触发fallback时，并发最大出发fallback的数量，超过该数量直接拒绝服务，默认10，SEMAPHORE模式有效\n            #maxConcurrentRequests: 10\n          thread:\n            #设置熔断超时时间，默认1S，容易出现 fallback available 异常\n            #在THREAD模式下，达到超时时间，可以中断，在SEMAPHORE模式下，会等待执行完成后，再去判断是否超时\n            timeoutInMilliseconds: 5000\n            #调用线程允许请求HystrixCommand.GetFallback()的最大数量，默认10\n            #maxConcurrentRequests: 10\n            #在发生超时时是否应中断,默认值：true,THREAD模式有效\n            #interruptOnTimeout: true\n            #当发生取消时，执行是否应该中断，默认值：true,THREAD模式有效\n            #interruptOnCancel: true\n    ## 接口级别配置 -- 移到配置中心\n    #ProducerFeign#timeout(String):\n     # execution:\n        #isolation:\n          #thread:\n            #timeoutInMilliseconds: 5000\n\n\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Consumer/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8082\nspring:\n  application:\n    name: hystrix-consumer-service\n  cloud:\n    config:\n      uri: http://192.168.206.204:9000/config/\n      profile: dev\n      label: master\n      name: ${spring.application.name}\n      # 自定义配置中，是否将服务信息发布到配置中心\n      custom: false\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Eureka/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        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.xiao.skywalking.demo</groupId>\n    <artifactId>SpringCloud-Hystrix-Eureka</artifactId>\n    <version>0.0.1-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <spring-cloud.version>Dalston.RC1</spring-cloud.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka-server</artifactId>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Dalston.RC1</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Eureka/src/main/java/com/xiao/hystrix/demo/eureka/EurekaApplication.java",
    "content": "package com.xiao.hystrix.demo.eureka;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:40\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableEurekaServer\npublic class EurekaApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(EurekaApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Eureka/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8888\nspring:\n  application:\n    name: hystrix-eureka-server\neureka:\n  instance:\n    hostname: localhost\n    prefer-ip-address: true\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n  client:\n    register-with-eureka: true\n    fetch-registry: false\n    service-url:\n      defaultZone: http://localhost:8888/eureka/\n  server:\n    ##以下配置，生产环境不建议使用\n    ###自我保护机制关闭\n    enable-self-preservation: false\n    ## 清理间隔（单位毫秒，默认是60*1000）\n    eviction-interval-timer-in-ms: 2000\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/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        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Hystrix-Producer</artifactId>\n    <groupId>com.xiao.skywalking.demo</groupId>\n    <version>0.0.1-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <spring-cloud.version>Dalston.RC1</spring-cloud.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n\n        <!-- sentinel -->\n        <!--<dependency>-->\n        <!--<groupId>org.springframework.cloud</groupId>-->\n        <!--<artifactId>spring-cloud-alibaba-sentinel</artifactId>-->\n        <!--<version>0.1.2.RELEASE</version>-->\n        <!--</dependency>-->\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Dalston.RC1</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/java/com/xiao/hystrix/demo/producer/ProducerApplication.java",
    "content": "package com.xiao.hystrix.demo.producer;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:46\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableEurekaClient\npublic class ProducerApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ProducerApplication.class, args);\n    }\n\n    //    @Bean\n    //    @SentinelRestTemplate\n    //    public RestTemplate restTemplate()\n    //    {\n    //        return new RestTemplate();\n    //    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/java/com/xiao/hystrix/demo/producer/api/ProducerRestService.java",
    "content": "package com.xiao.hystrix.demo.producer.api;\n\nimport com.xiao.hystrix.demo.producer.service.ProducerService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:55\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/api\")\npublic class ProducerRestService\n{\n    @Autowired\n    private ProducerService producerService;\n\n    @RequestMapping(\"/timeout\")\n    public String timeout(String input)\n    {\n        return this.producerService.timeout(input);\n    }\n\n    @RequestMapping(\"/normal\")\n    public String normal(String input)\n    {\n        return this.producerService.normal(input);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/java/com/xiao/hystrix/demo/producer/service/ProducerService.java",
    "content": "package com.xiao.hystrix.demo.producer.service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:56\n * @since JDK 1.8\n */\npublic interface ProducerService\n{\n    /**\n     * [简要描述]:超时APi模拟<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:57\n     **/\n    String timeout(String input);\n\n    /**\n     * [简要描述]:正常APi<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:59\n     **/\n    String normal(String input);\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/java/com/xiao/hystrix/demo/producer/service/impl/ProducerServiceImpl.java",
    "content": "package com.xiao.hystrix.demo.producer.service.impl;\n\nimport com.xiao.hystrix.demo.producer.service.ProducerService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Random;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:57\n * @since JDK 1.8\n */\n@Service\npublic class ProducerServiceImpl implements ProducerService\n{\n    /**\n     * [简要描述]:超时APi模拟<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:57\n     **/\n    @Override\n    public String timeout(String input)\n    {\n        try\n        {\n            // 模拟超时2S钟\n            Thread.sleep(4000);\n        }\n        catch (InterruptedException e)\n        {\n            e.printStackTrace();\n        }\n        return \"producer timeout: \" + input + '-' + new Random().nextInt(1000);\n    }\n\n    /**\n     * [简要描述]:正常APi<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:59\n     **/\n    @Override\n    public String normal(String input)\n    {\n        return \"producer normal: \" + input + '-' + new Random().nextInt(1000);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/resources/application.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Hystrix-Demo/SpringCloud-Hystrix-Producer/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8081\nspring:\n  application:\n    name: hystrix-producer-service\neureka:\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    lease-expiration-duration-in-seconds: 10\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    lease-renewal-interval-in-seconds: 2\n  client:\n    serviceUrl:\n      defaultZone: http://localhost:8888/eureka/\n        #开启健康检查（需要spring-boot-starter-actuator依赖）\n        #healthcheck:\n      #enable: true\nlogging:\n  level: debug"
  },
  {
    "path": "SpringCloud-Hystrix-Demo/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    <groupId>com.xiao.skywalking.demo</groupId>\n    <artifactId>SpringCloud-Hystrix-Demo</artifactId>\n    <version>0.0.1-SNAPSHOT</version>\n    <modules>\n        <module>SpringCloud-Hystrix-Eureka</module>\n        <module>SpringCloud-Hystrix-Producer</module>\n        <module>SpringCloud-Hystrix-Consumer</module>\n    </modules>\n\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>pom</packaging>\n\n</project>"
  },
  {
    "path": "SpringCloud-Kafka-Elk/README.md",
    "content": "1. 实现核心思路：\n>> 业务日志通过logback异步输出到kafka\n>> logstash 从kafka读取数据，并清洗数据(如：过滤，json格式化，删除一些字段等),输出到es<br>\n>> kibana进行数据可视化查看 <br>\n\n2.elk相关知识[参考资料](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Demo-Doc/kafka%2Belk)<br>\n3.相关注意事项:<br>\n>集成了kafka，所以在当kafka不可用的情况下，会有个metadata更新1分钟的时间，所以logback必须要进行异步输出<br>\n>结合[@LogAnnotation](https://github.com/Xlinlin/spring-cloud-demo/tree/master/SpringCloud-Common/src/main/java/com/xiao/skywalking/demo/common/logaspect)注解的实现，在代码层嵌入，节省运维和管理日志文件的成本。当然也可能在一定程度上回影响业务，各自取舍<br>\n"
  },
  {
    "path": "SpringCloud-Kafka-Elk/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n    <modelVersion>4.0.0</modelVersion>\r\n    <parent>\r\n        <groupId>com.xiao.skywalking.demo</groupId>\r\n        <artifactId>SpringCloud-Demo</artifactId>\r\n        <version>0.0.1-SNAPSHOT</version>\r\n    </parent>\r\n    <artifactId>SpringCloud-Kafka-Elk</artifactId>\r\n\r\n    <dependencies>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-eureka</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-config</artifactId>\r\n        </dependency>\r\n\r\n        <!--kafka支持 -->\r\n        <dependency>\r\n            <groupId>org.springframework.kafka</groupId>\r\n            <artifactId>spring-kafka</artifactId>\r\n        </dependency>\r\n\r\n        <!-- lombok插件 -->\r\n        <dependency>\r\n            <groupId>org.projectlombok</groupId>\r\n            <artifactId>lombok</artifactId>\r\n            <optional>true</optional>\r\n        </dependency>\r\n\r\n        <!-- logstash -->\r\n        <dependency>\r\n            <groupId>net.logstash.logback</groupId>\r\n            <artifactId>logstash-logback-encoder</artifactId>\r\n            <version>4.11</version>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>com.github.danielwegener</groupId>\r\n            <artifactId>logback-kafka-appender</artifactId>\r\n            <version>0.1.0</version>\r\n            <scope>runtime</scope>\r\n        </dependency>\r\n\r\n        <dependency>\r\n            <groupId>com.xiao.skywalking.demo</groupId>\r\n            <artifactId>SpringCloud-Common</artifactId>\r\n            <version>0.0.1-SNAPSHOT</version>\r\n        </dependency>\r\n    </dependencies>\r\n\r\n    <profiles>\r\n        <profile>\r\n            <id>dev</id>\r\n            <activation>\r\n                <activeByDefault>true</activeByDefault>\r\n            </activation>\r\n            <properties>\r\n                <env>dev</env>\r\n                <!-- dev logtash server -->\r\n                <logstashServer>ip:port</logstashServer>\r\n                <!-- dev kafka server 集群配置 -->\r\n                <kafkaServer>ip:port,ip:port,ip:port</kafkaServer>\r\n                <kafkaLogTopic>logstash</kafkaLogTopic>\r\n            </properties>\r\n        </profile>\r\n        <profile>\r\n            <id>test</id>\r\n            <properties>\r\n                <env>test</env>\r\n                <!-- test logtash server -->\r\n                <logstashServer>ip:port</logstashServer>\r\n                <!-- test kafka server 集群配置-->\r\n                <kafkaServer>ip:port,ip:port,ip:port</kafkaServer>\r\n                <kafkaLogTopic>logstash</kafkaLogTopic>\r\n            </properties>\r\n        </profile>\r\n    </profiles>\r\n\r\n    <build>\r\n        <finalName>${artifactId}</finalName>\r\n        <resources>\r\n            <resource>\r\n                <targetPath>${project.build.directory}/classes</targetPath>\r\n                <directory>src/main/resources</directory>\r\n                <filtering>true</filtering>\r\n                <includes>\r\n                    <include>**/*.xml</include>\r\n                    <include>**/*.yml</include>\r\n                    <include>**/*.properties</include>\r\n                    <include>META-INF/**</include>\r\n                </includes>\r\n            </resource>\r\n        </resources>\r\n        <plugins>\r\n            <plugin>\r\n                <groupId>org.springframework.boot</groupId>\r\n                <artifactId>spring-boot-maven-plugin</artifactId>\r\n            </plugin>\r\n        </plugins>\r\n    </build>\r\n</project>"
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/java/com/xiao/springcloud/demo/kafka/elk/ElkKafkaApplication.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :ElkKafkaApplication.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年8月9日\r\n*/\r\n\r\npackage com.xiao.springcloud.demo.kafka.elk;\r\n\r\nimport java.util.Optional;\r\n\r\nimport org.apache.kafka.clients.consumer.ConsumerRecord;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\r\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\r\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\r\nimport org.springframework.kafka.annotation.KafkaListener;\r\nimport org.springframework.scheduling.annotation.EnableScheduling;\r\nimport org.springframework.scheduling.annotation.Scheduled;\r\n\r\nimport com.xiao.springcloud.demo.kafka.elk.kafka.KafkaProducerTest;\r\nimport com.xiao.springcloud.demo.kafka.elk.kafka.LogCompent;\r\n\r\nimport lombok.extern.slf4j.Slf4j;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年8月9日\r\n * @since JDK 1.8\r\n */\r\n@SpringBootApplication\r\n// 自动注册发现\r\n@EnableDiscoveryClient\r\n// fegin客户端\r\n@EnableFeignClients\r\n\r\n@EnableEurekaClient\r\n@EnableScheduling\r\n@Slf4j\r\npublic class ElkKafkaApplication\r\n{\r\n    @Autowired\r\n    KafkaProducerTest producerTest;\r\n\r\n    @Autowired\r\n    LogCompent logCompent;\r\n\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(ElkKafkaApplication.class, args);\r\n    }\r\n\r\n    // 每隔1分钟执行一次记录日志\r\n    @Scheduled(fixedRate = 1000 * 60)\r\n    public void testKafka()\r\n    {\r\n        producerTest.sendTest();\r\n        logCompent.testLog();\r\n    }\r\n\r\n    // kafka的消息监听\r\n    @KafkaListener(topics = \"kafkaTest\", id = \"member-service\")\r\n    public void listen(ConsumerRecord<?, ?> record) throws Exception\r\n    {\r\n        Optional<?> kafkaMessage = Optional.ofNullable(record.value());\r\n        if (kafkaMessage.isPresent())\r\n        {\r\n            Object message = kafkaMessage.get();\r\n            log.info(\"----------------- record =\" + record);\r\n            log.info(\"------------------ re-message =\" + message);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/java/com/xiao/springcloud/demo/kafka/elk/kafka/KafkaProducerTest.java",
    "content": "/*\r\n * Winner\r\n * 文件名  :KafkaProducerTest.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年8月7日\r\n */\r\n\r\npackage com.xiao.springcloud.demo.kafka.elk.kafka;\r\n\r\nimport java.time.LocalDateTime;\r\nimport java.time.format.DateTimeFormatter;\r\n\r\nimport com.xiao.springcloud.demo.common.logaspect.LogAnnotation;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.kafka.core.KafkaTemplate;\r\nimport org.springframework.stereotype.Component;\r\n\r\nimport lombok.extern.slf4j.Slf4j;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年8月7日\r\n * @since JDK 1.8\r\n */\r\n@Component\r\n@Slf4j\r\npublic class KafkaProducerTest\r\n{\r\n    @Autowired\r\n    private KafkaTemplate<String, String> kafkaTemplate;\r\n\r\n    /**\r\n     * 发送消息到kafka,主题为test\r\n     */\r\n    @LogAnnotation\r\n    public void sendTest()\r\n    {\r\n        System.out.println(\"-=-=-=-=-=-=-=-=send message to kafka!!!!\");\r\n        kafkaTemplate.send(\"kafkaTest\", \"hello,kafka from Producer test!!!!\" + LocalDateTime.now()\r\n                .format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss.SSS\")));\r\n        log.info(\"hello,kafka from Producer test!!!!\" + LocalDateTime.now()\r\n                .format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss.SSS\")));\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/java/com/xiao/springcloud/demo/kafka/elk/kafka/LogCompent.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :LogCompent.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年8月7日\r\n*/\r\n\r\npackage com.xiao.springcloud.demo.kafka.elk.kafka;\r\n\r\nimport org.springframework.stereotype.Component;\r\n\r\nimport lombok.extern.slf4j.Slf4j;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年8月7日\r\n * @since JDK 1.8\r\n */\r\n@Component\r\n@Slf4j\r\npublic class LogCompent\r\n{\r\n\r\n    public void testLog()\r\n    {\r\n        log.info(\"Hello kafak for logback !!!!!!!!!!!!!!!!!!!!!!!\");\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/resources/application.yml",
    "content": "server:\r\n  port: 1114\r\nspring: \r\n  kafka:\r\n    #kafka服务器配置  192.168.1.1:9092\r\n    bootstrap-servers: \r\n    - ip:port\r\n    consumer: \r\n      #默认组\r\n      group-id: test-group\r\n      key-deserializer:\r\n        org.apache.kafka.common.serialization.StringDeserializer\r\n      value-deserializer:\r\n        org.apache.kafka.common.serialization.StringDeserializer\r\n      #自动提交，单节点设置成false\r\n      enable-auto-commit: false\r\n      auto-commit-interval: 100\r\n      auto-offset-reset: earliest\r\n    producer:\r\n      #批量发送消息\r\n      batch-size: 65536\r\n      buffer-memory: 524288\r\n      key-serializer: \r\n        org.apache.kafka.common.serialization.StringSerializer\r\n      value-serializer:\r\n        org.apache.kafka.common.serialization.StringSerializer\r\n        \r\n      "
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/resources/bootstrap.yml",
    "content": "spring:\r\n  cloud:\r\n    config:\r\n      uri: http://39.108.36.134:8808/omni-config-server\r\n      profile: @env@\r\n      label: master\r\n      name: omni-member-service\r\n  application: \r\n    name: omni-member-service\r\n  logstash: \r\n    server: @logstashServer@\r\n    kafka-servers: @kafkaServer@\r\n    logs-topic: @kafkaLogTopic@"
  },
  {
    "path": "SpringCloud-Kafka-Elk/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n    <include\n            resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n\n    <!-- logback加载优先于application.yml文件，因此需要从bootstrap.yml文件中读取spring.application.name信息 -->\n    <springProperty scope=\"context\" name=\"springAppName\"\n                    source=\"spring.application.name\"/>\n\n    <!-- spring bootstrap配置文件中读取 logtash服务信息 -->\n    <springProperty scope=\"context\" name=\"logtashServer\"\n                    source=\"spring.logstash.server\"/>\n\n    <!-- kafka配置 -->\n    <springProperty scope=\"context\" name=\"kafkaServer\"\n                    source=\"spring.logstash.kafka-servers\"/>\n    <springProperty scope=\"context\" name=\"kafkaLogTopic\"\n                    source=\"spring.logstash.logs-topic\"/>\n\n    <!-- 日志在工程中的输出位置 -->\n    <property name=\"LOG_FILE\"\n              value=\"${BUILD_FOLDER:-build}/${springAppName}\"/>\n\n    <!-- 控制台的日志输出样式 -->\n    <property name=\"CONSOLE_LOG_PATTERN\"\n              value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- 控制台Appender -->\n    <appender name=\"console\"\n              class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- 通过Tcp Socket输出到logstash服务端 -->\n    <appender name=\"logstash-tcp\"\n              class=\"net.logstash.logback.appender.LogstashTcpSocketAppender\">\n        <destination>${logtashServer}</destination>\n        <!-- 调整适当大小，解决丢包问题。单位：B -->\n        <queueSize>1048576</queueSize>\n        <encoder\n                class=\"net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder\">\n            <providers>\n                <timestamp/>\n                <pattern>\n                    <pattern>\n                        {\n                        \"level\":\"%level\",\n                        \"service\": \"${springAppName:-}\",\n                        \"trace\": \"%X{X-B3-TraceId:-}\",\n                        \"span\": \"%X{X-B3-SpanId:-}\",\n                        \"stack_trace\": \"%exception{10}\",\n                        \"req_id\": \"%X{reqId}\",\n                        \"elapsed_time\": \"#asLong{%X{elapsedTime}}\",\n                        \"pid\": \"${PID:-}\",\n                        \"thread\": \"%thread\",\n                        \"class\": \"%logger{40}\",\n                        \"method_name\":\n                        \"%method\",\n                        \"message\": \"%message\"\n                        }\n                    </pattern>\n                </pattern>\n            </providers>\n        </encoder>\n    </appender>\n\n    <!-- 发送kafka -->\n    <appender name=\"kafkaAppender\"\n              class=\"com.github.danielwegener.logback.kafka.KafkaAppender\">\n        <encoder\n                class=\"com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder\">\n            <layout class=\"net.logstash.logback.layout.LogstashLayout\">\n                <includeContext>true</includeContext>\n                <includeCallerData>true</includeCallerData>\n                <includeMdc>true</includeMdc>\n                <!-- 自定义属性 -->\n                <!-- <customFields>{\"serverName\":\"${springAppName}\"}</customFields> -->\n                <fieldNames\n                        class=\"net.logstash.logback.fieldnames.ShortenedFieldNames\"/>\n            </layout>\n            <charset>UTF-8</charset>\n        </encoder>\n        <!--kafka topic 需要与配置文件里面的topic一致 否则kafka会沉默并鄙视你 -->\n        <topic>${kafkaLogTopic}</topic>\n        <!-- 路由分区策略，可依据HostName、ContextName、ThreadName、LoggerName，默认NoKey -->\n        <!-- <keyingStrategy -->\n        <!-- class=\"com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy\"\n            /> -->\n        <!-- 交付策略 一种熔断策略(连接不是上默认发送到控制台/AsynchronousDeliveryStrategy)，一种阻塞策略(直到发送成功/BlockingDeliveryStrategy) -->\n        <deliveryStrategy\n                class=\"com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy\"/>\n        <!-- 开启后所有不能快速通过网络抵达kafka集群的消息都会被分发到appender -->\n        <producerConfig>block.on.buffer.full=false</producerConfig>\n        <!-- kafka连接地址 -->\n        <producerConfig>bootstrap.servers=${kafkaServer}</producerConfig>\n\n    </appender>\n\n    <!-- 使用异步来记录日志信息，不能阻塞主业务流程-->\n    <appender name=\"async\" class=\"ch.qos.logback.classic.AsyncAppender\">\n        <discardingThreshold>0</discardingThreshold>\n        <queueSize>1000</queueSize>\n        <includeCallerData>true</includeCallerData>\n        <appender-ref ref=\"kafkaAppender\"/>\n    </appender>\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.mongodb.driver\" level=\"ERROR\"/>\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"info\"/>\n\n    <!-- 仅针对member包的日志输出 -->\n    <logger name=\"com.purcotton.omni.member\" level=\"info\"\n            additivity=\"false\">\n        <!-- 到logstash中 -->\n        <!-- <appender-ref ref=\"logstash-tcp\" /> -->\n        <!-- 异步输出到kafka，不能阻塞流程 -->\n        <appender-ref ref=\"async\"/>\n        <!--<appender-ref ref=\"console\"/>-->\n    </logger>\n\n    <root level=\"info\">\n        <appender-ref ref=\"console\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "SpringCloud-MQTT/Readme.MD",
    "content": "1. MQTT(activemq)+NGINX实现 java、android、IOS、web、小程序消息推送\n2. 小程序需要nginx配置wss，通过nginx跳转到activemq ws服务，详情[文档参考](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Demo-Doc/%E5%85%B6%E4%BB%96%E4%B8%AA%E4%BA%BA%E6%80%BB%E7%BB%93/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8FMQTT%E5%8D%8F%E8%AE%AE%E9%80%9A%E4%BF%A1.docx)\n3. nginx配置[参考](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-MQTT/doc),其中wss.conf文件为 小程序跳转的wss服务，mqtt.conf为mqtt的tcp配置，nginx.conf为主配置\n4. activemq下载源码，在其基础上做简单鉴权处理，在org.apache.activemq.security.SimpleAuthenticationBroker上做简单封装，比如做密码MD5加密等\n5. nginx ssl配置暂未实现 "
  },
  {
    "path": "SpringCloud-MQTT/doc/mqtt.conf",
    "content": "\n#日志格式化，HTTP 通用日志格式，从而所得到的日志可以导入到日志分析工具中\nlog_format mqtt '$remote_addr [$time_local] $protocol $status $bytes_received ' \n                '$bytes_sent $upstream_addr';\n\naccess_log logs/stream-access.log basic;\n\n# MQTT tcp\nupstream mqtt {\n   #mqtt 服务链接，tcp 1883端口  - 可以配置多个，不用粘性会话，MQTT集群内是互通的，路由任意节#点都可以收到数据包\n   server 192.168.206.210:1883 max_fails=3 fail_timeout=30s;\n}\n\n#tcp入口配置\nserver {\n   #tcp保活时间控制2min,检测数据包间隔5s,重试3次，（MQTT的心跳包是1m发一个，保活时间间隔不得低于1m\n   listen 2883 so_keepalive=2m:2s:3;\n   proxy_connect_timeout 5s;\n   proxy_timeout 30s;\n   proxy_pass mqtt;\n\n}\n\n\n#ws   6164\nupstream mqttws { \n   server  192.168.206.210:6164; \n   #server  192.168.1.116:70830 weight=5 max_fails=1 fail_timeout=10s; \n} \nserver {\n    listen 61614;\n    proxy_connect_timeout 5s;\n    proxy_timeout 30s;         \n    proxy_pass mqttws;     \n}   \n"
  },
  {
    "path": "SpringCloud-MQTT/doc/nginx.conf",
    "content": "#工作用户\nuser admin;\n#工作进程数，一般可与cpu数保持一致\nworker_processes 1;\n# 最大文件打开数（连接）,提高TCP连接数\nworker_rlimit_nofile 10000;\n\nevents {\n   # 使用epoll事件模型,仅用于linux2.6以上内核,可以大大提高nginx的性能\n   #use epoll\n   #最大链接,提供tcp连接数量\n   worker_connections 1000; #default 1024\n}\n\nerror_log logs/error.log;\n#error_log logs/error.log notice;\n\n#pid logs/nginx.pid\n\n# wss\nhttp {\n\n    #include mime.types;\n    #default_type application/octet-stream;\n    #server_names_hash_bucket_size 3526;\n    #server_names_hash_max_size 4096;\n\n    include wss.conf;\n    client_max_body_size   3m; ##上传大小，小程序上传大图片时需要设置\n\n}\n\n\n# tcp + ws\nstream {\n   include mqtt.conf;\n}\n"
  },
  {
    "path": "SpringCloud-MQTT/doc/wss.conf",
    "content": "###  配置原来的ws和http接口\nupstream websocket {\n   #远程socket服务器地址，此处连接activemq ws连接\n   server 192.168.206.210:6164;\n}\n\n\n#upstream web {\n  #server www.xx.com;# 远程HTTP配置\n#}\n\n#主入口配置\nserver {\n   listen 443;# 默认https和wss协议端口\n   server_name purcotton.com;\n   ssl on;  #开启ssl\n   ssl_certificate /home/admin/nginx-work/cert/server-cert.cer;#你的上传到服务器的证书位置\n   ssl_certificate_key /home/admin/nginx-work/cert/server-key.key;#你的上传到服务器的证书位置\n   ssl_client_certificate /home/admin/nginx-work/cert/root-cert.cer;  #根级证书公钥，用于验证各个二级client\n   ssl_verify_client on;  #开启客户端证书验证 \n   ssl_session_timeout 5m;\n   ssl_session_cache shared:SSL:50m;\n   ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;\n   ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;\n   underscores_in_headers on;#开启自定义头信息的下划线\n   #wss协议转发 小程序里面要访问的链接\n   location /mqtt {\n       proxy_pass http://websocket;#代理到上面的地址去\n       proxy_http_version 1.1;\n       proxy_set_header Upgrade $http_upgrade;\n       proxy_set_header Connection \"Upgrade\";\t\t\n       proxy_redirect off;\n\t\t\n       #重要配置，解决小程序连接 Sec-WebSocket-Protocol错误提示\n       proxy_set_header Sec-WebSocket-Protocol mqtt;\n       more_clear_headers Sec-WebSocket-Protocol;\n   }\n \n   #web端 ws请求\n   location /ws {\n       proxy_pass http://websocket;#代理到上面的地址去\n       proxy_http_version 1.1;\n       proxy_set_header Upgrade $http_upgrade;\n       proxy_set_header Connection \"Upgrade\";\n       proxy_redirect off;\n\n       #重要配置，解决小程序连接 Sec-WebSocket-Protocol错误提示\n       proxy_set_header Sec-WebSocket-Protocol mqtt;\n       more_clear_headers Sec-WebSocket-Protocol;\n   }\n\n   #https协议转发 小程序里面要访问的链接\n   #    #location /{\n   #        #\tproxy_pass http://web;#代理到原有的http的地址去\n   #        #\tproxy_set_header   X-Real-IP        $remote_addr;\n   #        #   proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;\n   #        #\tadd_header Access-Control-Allow-Origin *;#跨域访问设置\n   #    #}\n}\n"
  },
  {
    "path": "SpringCloud-MQTT/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<parent>\r\n\t\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t\t<version>0.0.1-SNAPSHOT</version>\r\n\t</parent>\r\n\t<artifactId>SpringCloud-MQTT</artifactId>\r\n\t<properties>\r\n\t\t<activemq.version>5.9.0</activemq.version>\r\n\t</properties>\r\n\r\n\t<dependencies>\r\n\r\n\t\t<!-- activemq -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.apache.activemq</groupId>\r\n\t\t\t<artifactId>activemq-client</artifactId>\r\n\t\t</dependency>\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.apache.commons</groupId>\r\n\t\t\t<artifactId>commons-lang3</artifactId>\r\n\t\t\t<version>3.4</version>\r\n\t\t</dependency>\r\n\r\n\t\t<!-- eclipse mqtt -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.eclipse.paho</groupId>\r\n\t\t\t<artifactId>org.eclipse.paho.client.mqttv3</artifactId>\r\n\t\t\t<version>1.2.1</version>\r\n\t\t</dependency>\r\n\r\n\t\t<!--web 支持 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\r\n\t\t</dependency>\r\n\t\t<!--jsp页面使用jstl标签 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>javax.servlet</groupId>\r\n\t\t\t<artifactId>jstl</artifactId>\r\n\t\t</dependency>\r\n\t\t<!--用于编译jsp -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.apache.tomcat.embed</groupId>\r\n\t\t\t<artifactId>tomcat-embed-jasper</artifactId>\r\n\t\t\t<scope>provided</scope>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<!-- 热部署模块 -->\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-devtools</artifactId>\r\n\t\t\t<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->\r\n\t\t</dependency>\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<finalName>${artifactId}</finalName>\r\n\t\t<resources>\r\n\t\t\t<resource>\r\n\t\t\t\t<targetPath>${project.build.directory}/classes</targetPath>\r\n\t\t\t\t<directory>src/main/resources</directory>\r\n\t\t\t\t<filtering>true</filtering>\r\n\t\t\t\t<includes>\r\n\t\t\t\t\t<include>**/*.xml</include>\r\n\t\t\t\t\t<include>**/*.yml</include>\r\n\t\t\t\t\t<include>**/*.properties</include>\r\n\t\t\t\t\t<include>META-INF/**</include>\r\n\t\t\t\t</includes>\r\n\t\t\t</resource>\r\n\t\t</resources>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n</project>"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/ClientCallback.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :ClientCallback.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年4月16日\r\n*/\r\n\r\npackage com.skywalking.mqtt;\r\n\r\nimport org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;\r\nimport org.eclipse.paho.client.mqttv3.MqttCallback;\r\nimport org.eclipse.paho.client.mqttv3.MqttClient;\r\nimport org.eclipse.paho.client.mqttv3.MqttConnectOptions;\r\nimport org.eclipse.paho.client.mqttv3.MqttException;\r\nimport org.eclipse.paho.client.mqttv3.MqttMessage;\r\nimport org.eclipse.paho.client.mqttv3.MqttSecurityException;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年4月16日\r\n * @since 项目名称 项目版本\r\n */\r\npublic class ClientCallback implements MqttCallback\r\n{\r\n    private MqttClient client;\r\n    private MqttConnectOptions options;\r\n\r\n    public ClientCallback(MqttClient client, MqttConnectOptions options)\r\n    {\r\n        this.client = client;\r\n        this.options = options;\r\n    }\r\n\r\n    @Override\r\n    public void connectionLost(Throwable cause)\r\n    {\r\n        // 连接丢失后，一般在这里面进行重连\r\n        System.out.println(\"连接断开，可以做重连\");\r\n        try\r\n        {\r\n            client.connect(options);\r\n        }\r\n        catch (MqttSecurityException e)\r\n        {\r\n            // TODO Auto-generated catch block\r\n            e.printStackTrace();\r\n        }\r\n        catch (MqttException e)\r\n        {\r\n            // TODO Auto-generated catch block\r\n            e.printStackTrace();\r\n        }\r\n        // while(!sampleClient.isConnected()){\r\n        // try {\r\n        // Thread.sleep(1000);\r\n        // sampleClient.connect(connOpts);\r\n        // //客户端每次上线都必须上传自己所有涉及的订阅关系，否则可能会导致消息接收延迟\r\n        // sampleClient.subscribe(topicFilters,qos);\r\n        // } catch (Exception e) {\r\n        // e.printStackTrace();\r\n        // }\r\n        // }\r\n    }\r\n\r\n    @Override\r\n    public void messageArrived(String topic, MqttMessage message) throws Exception\r\n    {\r\n        // subscribe后得到的消息会执行到这里面\r\n        System.out.println(\"接收消息主题 : \" + topic);\r\n        System.out.println(\"接收消息Qos : \" + message.getQos());\r\n        String msg = new String(message.getPayload());\r\n        System.out.println(\"接收消息到服务端内容 : \" + msg);\r\n        if (msg.contains(\"close\"))\r\n        {\r\n            client.close();\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void deliveryComplete(IMqttDeliveryToken token)\r\n    {\r\n        System.out.println(\"deliveryComplete---------\" + token.isComplete());\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/MqttServiceApp.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :MqttServiceApp.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年4月16日\r\n*/\r\n\r\npackage com.skywalking.mqtt;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.boot.builder.SpringApplicationBuilder;\r\nimport org.springframework.boot.web.servlet.ServletComponentScan;\r\nimport org.springframework.boot.web.support.SpringBootServletInitializer;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年4月16日\r\n * @since 项目名称 项目版本\r\n */\r\n@SpringBootApplication\r\n@ServletComponentScan\r\npublic class MqttServiceApp extends SpringBootServletInitializer\r\n{\r\n    /**\r\n     * [简要描述]:Servlet初始化器<br/>\r\n     * [详细描述]:<br/>\r\n     * \r\n     * @author llxiao\r\n     * @param application\r\n     * @return\r\n     * @see\r\n     *      org.springframework.boot.web.support.SpringBootServletInitializer#configure(org.springframework.boot.builder.SpringApplicationBuilder)\r\n     */\r\n    @Override\r\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)\r\n    {\r\n        return application.sources(MqttServiceApp.class);\r\n    }\r\n\r\n    public static void main(String[] args) throws Exception\r\n    {\r\n        SpringApplication.run(MqttServiceApp.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/MqttTestClient.java",
    "content": "/*\r\n * Winner\r\n * 文件名  :MqttTestClient.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年4月16日\r\n */\r\n\r\npackage com.skywalking.mqtt;\r\n\r\nimport org.eclipse.paho.client.mqttv3.MqttClient;\r\nimport org.eclipse.paho.client.mqttv3.MqttConnectOptions;\r\nimport org.eclipse.paho.client.mqttv3.MqttException;\r\nimport org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;\r\n\r\nimport javax.net.SocketFactory;\r\nimport javax.net.ssl.SSLContext;\r\nimport javax.net.ssl.SSLSocketFactory;\r\nimport javax.net.ssl.TrustManager;\r\nimport javax.net.ssl.TrustManagerFactory;\r\nimport java.io.InputStream;\r\nimport java.security.KeyStore;\r\nimport java.security.SecureRandom;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年4月16日\r\n * @since 项目名称 项目版本\r\n */\r\npublic class MqttTestClient\r\n{\r\n    private String clientId;\r\n\r\n    private MqttClient client;\r\n\r\n    private MqttConnectOptions options;\r\n\r\n    // private String userName = \"admin\";\r\n    //\r\n    // private String passWord = \"admin123\";\r\n\r\n    public MqttTestClient(String clientId)\r\n    {\r\n        this.clientId = clientId;\r\n    }\r\n\r\n    private void start() throws MqttException\r\n    {\r\n        String host = \"tcp://39.108.176.226:1883\";\r\n\r\n        try\r\n        {\r\n            // host为主机名，clientid即连接MQTT的客户端ID，一般以唯一标识符表示，MemoryPersistence设置clientid的保存形式，默认为以内存保存\r\n            client = new MqttClient(host, clientId, new MemoryPersistence());\r\n            // MQTT的连接设置\r\n            options = new MqttConnectOptions();\r\n            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录，这里设置为true表示每次连接到服务器都以新的身份连接\r\n            options.setCleanSession(true);\r\n            // 设置连接的用户名\r\n            options.setUserName(\"admin\");\r\n            // 设置连接的密码\r\n            options.setPassword(\"admin123\".toCharArray());\r\n            // 设置超时时间 单位为秒\r\n            options.setConnectionTimeout(10);\r\n            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线，但这个方法并没有重连的机制\r\n            options.setKeepAliveInterval(20);\r\n\r\n            //            options.setSocketFactory(setSSLSocketFactory());\r\n\r\n            // // 设置回调\r\n            // MqttTopic topic = client.getTopic(TOPIC+\"/test/\");\r\n            // // setWill方法，如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息\r\n            // options.setWill(topic, \"close\".getBytes(), 2, true);\r\n            client.connect(options);\r\n            client.setCallback(new ClientCallback(client, options));\r\n            // 订阅消息\r\n            int[] Qos = { 1\r\n            };\r\n            String[] topic1 = { \"PTP/test\"\r\n            };\r\n            client.subscribe(topic1, Qos);\r\n\r\n        }\r\n        catch (Exception e)\r\n        {\r\n            e.printStackTrace();\r\n            client.close();\r\n        }\r\n    }\r\n\r\n    private SocketFactory setSSLSocketFactory()\r\n    {\r\n        SSLSocketFactory factory = null;\r\n        try\r\n        {\r\n            SSLContext sslContext = SSLContext.getInstance(\"TLS\");\r\n            TrustManager[] trustAllCerts = getTrustManagers();\r\n            sslContext.init(null, trustAllCerts, new SecureRandom());\r\n            factory = sslContext.getSocketFactory();\r\n        }\r\n        catch (Exception e)\r\n        {\r\n            e.printStackTrace();\r\n        }\r\n        return factory;\r\n    }\r\n\r\n    private TrustManager[] sslTrustManagers()\r\n    {\r\n        TrustManager[] trustManagers = null;\r\n        try\r\n        {\r\n            // p12文件ssl\r\n            KeyStore keyStore = KeyStore.getInstance(\"PKCS12\");\r\n            InputStream instream = MqttTestClient.class.getClassLoader().getResourceAsStream(\"client.p12\");\r\n            keyStore.load(instream, \"admin123\".toCharArray());\r\n\r\n            //kbs文件ssl\r\n            //KeyStore ts = KeyStore.getInstance(\"BKS\");\r\n            //bks文件，还有生成时密钥库口令\r\n            //ts.load(context.getAssets().open(\"key.bks\"), \"123456\".toCharArray());\r\n\r\n            TrustManagerFactory tmf = TrustManagerFactory.getInstance(\"SunX509\");\r\n            tmf.init(keyStore);\r\n            trustManagers = tmf.getTrustManagers();\r\n        }\r\n        catch (Exception e)\r\n        {\r\n            e.printStackTrace();\r\n        }\r\n        return trustManagers;\r\n    }\r\n\r\n    private TrustManager[] getTrustManagers()\r\n    {\r\n        TrustManager[] trustAllCerts = new TrustManager[1];\r\n        trustAllCerts[0] = new PurTrustManager();\r\n        return trustAllCerts;\r\n    }\r\n\r\n    public static void main(String[] args) throws MqttException\r\n    {\r\n        String clientId = \"javaClient:\" + System.currentTimeMillis();\r\n        MqttTestClient client = new MqttTestClient(clientId);\r\n        client.start();\r\n        System.out.println(clientId);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/MvcController.java",
    "content": "package com.skywalking.mqtt;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.servlet.ModelAndView;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/4 14:32\n * @since JDK 1.8\n */\n@Controller()\npublic class MvcController\n{\n    @RequestMapping(\"/mqtt\")\n    public ModelAndView mqtt(){\n        ModelAndView mv = new ModelAndView();\n//        mv.addObject(\"msg\", \"this a msg from HelloWorldController\");\n        mv.setViewName(\"mqtt_client\");;\n        return mv;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/PurTrustManager.java",
    "content": "package com.skywalking.mqtt;\n\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\nimport java.security.cert.CertificateException;\nimport java.security.cert.X509Certificate;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/5/4 12:33\n * @since JDK 1.8\n */\npublic class PurTrustManager implements TrustManager, X509TrustManager\n{\n    @Override\n    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException\n    {\n    }\n\n    @Override\n    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException\n    {\n\n    }\n\n    @Override\n    public X509Certificate[] getAcceptedIssuers()\n    {\n        return null;\n    }\n\n\n}\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/java/com/skywalking/mqtt/TopicProducerTest.java",
    "content": "/*\r\n * Winner \r\n * 文件名  :TopicProducerTest.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年4月16日\r\n*/\r\n\r\npackage com.skywalking.mqtt;\r\n\r\nimport java.util.Scanner;\r\n\r\nimport javax.jms.Connection;\r\nimport javax.jms.DeliveryMode;\r\nimport javax.jms.JMSException;\r\nimport javax.jms.MessageProducer;\r\nimport javax.jms.Session;\r\nimport javax.jms.TextMessage;\r\nimport javax.jms.Topic;\r\n\r\nimport org.apache.activemq.ActiveMQConnectionFactory;\r\nimport org.apache.commons.lang3.StringUtils;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年4月16日\r\n * @since 项目名称 项目版本\r\n */\r\npublic class TopicProducerTest\r\n{\r\n    public static void main(String[] args) throws JMSException\r\n    {\r\n        // 创建连接工厂\r\n        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(\"tcp://localhost:61616\");\r\n        String PTP_CLIENTID = \"PTP_CLIENTID\";\r\n\r\n        // 鉴权，如没有开启可省略\r\n        // factory.setUserName(\"admin\");\r\n        // factory.setPassword(\"admin123\");\r\n        // 创建JMS连接实例，并启动连接\r\n        Connection connection = factory.createConnection();\r\n\r\n        connection.start();\r\n\r\n        // 创建Session对象，不开启事务\r\n        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);\r\n\r\n        // 创建主题\r\n        Topic topic = session.createTopic(\"PTP.test\");\r\n\r\n        // 创建生成者\r\n        MessageProducer producer = session.createProducer(topic);\r\n\r\n        // 设置消息不需持久化。默认消息需要持久化\r\n        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);\r\n\r\n        Scanner sc = new Scanner(System.in);\r\n        boolean isStart = true;\r\n        String userMsg = \"\";\r\n        String msg = \"\";\r\n        TextMessage message = null;\r\n        String[] messages = null;\r\n        String clientId = null;\r\n        while (isStart)\r\n        {\r\n            userMsg = sc.nextLine();\r\n            if (StringUtils.isBlank(userMsg) || \"stop\".equals(userMsg))\r\n            {\r\n                System.out.println(\"Stop producer message!\");\r\n                isStart = false;\r\n            }\r\n            messages = userMsg.split(\":\");\r\n            msg = \"Hello MQ,Client msg:\" + messages[0];\r\n            message = session.createTextMessage(msg);\r\n\r\n            if (messages.length == 2)\r\n            {\r\n                clientId = messages[1];\r\n            }\r\n\r\n            // 发送指定消息，配合主题分发策略使用，以附带用户ID ，分发策略对特定的主题进行拦截解析分发\r\n            if (StringUtils.isNotBlank(clientId))\r\n            {\r\n                message.setStringProperty(PTP_CLIENTID, clientId);\r\n            }\r\n\r\n            // 发送消息。non-persistent 默认异步发送；persistent 默认同步发送\r\n            producer.send(message);\r\n        }\r\n        sc.close();\r\n        // 关闭连接\r\n        producer.close();\r\n        session.close();\r\n        connection.close();\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-MQTT/src/main/resources/application.yml",
    "content": "spring: \r\n    mvc: \r\n        view: \r\n            prefix: /WEB-INF/jsp/\r\n            suffix: .jsp\r\nserver: \r\n    port: 8082\r\n    session: \r\n        timeout: 10\r\n    tomcat: \r\n        max-threads: 800\r\n        uri-encoding: UTF-8"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/crypto-js.js",
    "content": ";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t    /*\n\t     * Local polyfil of Object.create\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {};\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }())\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var i = 0; i < thatSigBytes; i += 4) {\n\t                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            var r = (function (m_w) {\n\t                var m_w = m_w;\n\t                var m_z = 0x3ade68b1;\n\t                var mask = 0xffffffff;\n\n\t                return function () {\n\t                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t                    var result = ((m_z << 0x10) + m_w) & mask;\n\t                    result /= 0x100000000;\n\t                    result += 0.5;\n\t                    return result * (Math.random() > .5 ? 1 : -1);\n\t                }\n\t            });\n\n\t            for (var i = 0, rcache; i < nBytes; i += 4) {\n\t                var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t                rcache = _r() * 0x3ade67b7;\n\t                words.push((_r() * 0x100000000) | 0);\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                var processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64 encoding strategy.\n\t     */\n\t    var Base64 = C_enc.Base64 = {\n\t        /**\n\t         * Converts a word array to a Base64 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Base64 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64 string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t         */\n\t        parse: function (base64Str) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                    reverseMap = this._reverseMap = [];\n\t                    for (var j = 0; j < map.length; j++) {\n\t                        reverseMap[map.charCodeAt(j)] = j;\n\t                    }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t      var words = [];\n\t      var nBytes = 0;\n\t      for (var i = 0; i < base64StrLength; i++) {\n\t          if (i % 4) {\n\t              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);\n\t              nBytes++;\n\t          }\n\t      }\n\t      return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var T = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        for (var i = 0; i < 64; i++) {\n\t            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t        }\n\t    }());\n\n\t    /**\n\t     * MD5 hash algorithm.\n\t     */\n\t    var MD5 = C_algo.MD5 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var M_offset_0  = M[offset + 0];\n\t            var M_offset_1  = M[offset + 1];\n\t            var M_offset_2  = M[offset + 2];\n\t            var M_offset_3  = M[offset + 3];\n\t            var M_offset_4  = M[offset + 4];\n\t            var M_offset_5  = M[offset + 5];\n\t            var M_offset_6  = M[offset + 6];\n\t            var M_offset_7  = M[offset + 7];\n\t            var M_offset_8  = M[offset + 8];\n\t            var M_offset_9  = M[offset + 9];\n\t            var M_offset_10 = M[offset + 10];\n\t            var M_offset_11 = M[offset + 11];\n\t            var M_offset_12 = M[offset + 12];\n\t            var M_offset_13 = M[offset + 13];\n\t            var M_offset_14 = M[offset + 14];\n\t            var M_offset_15 = M[offset + 15];\n\n\t            // Working varialbes\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\n\t            // Computation\n\t            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);\n\t            d = FF(d, a, b, c, M_offset_1,  12, T[1]);\n\t            c = FF(c, d, a, b, M_offset_2,  17, T[2]);\n\t            b = FF(b, c, d, a, M_offset_3,  22, T[3]);\n\t            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);\n\t            d = FF(d, a, b, c, M_offset_5,  12, T[5]);\n\t            c = FF(c, d, a, b, M_offset_6,  17, T[6]);\n\t            b = FF(b, c, d, a, M_offset_7,  22, T[7]);\n\t            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);\n\t            d = FF(d, a, b, c, M_offset_9,  12, T[9]);\n\t            c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t            b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);\n\t            d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t            c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t            b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);\n\t            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);\n\t            c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t            b = GG(b, c, d, a, M_offset_0,  20, T[19]);\n\t            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);\n\t            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);\n\t            c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t            b = GG(b, c, d, a, M_offset_4,  20, T[23]);\n\t            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);\n\t            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);\n\t            c = GG(c, d, a, b, M_offset_3,  14, T[26]);\n\t            b = GG(b, c, d, a, M_offset_8,  20, T[27]);\n\t            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);\n\t            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);\n\t            c = GG(c, d, a, b, M_offset_7,  14, T[30]);\n\t            b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);\n\t            d = HH(d, a, b, c, M_offset_8,  11, T[33]);\n\t            c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t            b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);\n\t            d = HH(d, a, b, c, M_offset_4,  11, T[37]);\n\t            c = HH(c, d, a, b, M_offset_7,  16, T[38]);\n\t            b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);\n\t            d = HH(d, a, b, c, M_offset_0,  11, T[41]);\n\t            c = HH(c, d, a, b, M_offset_3,  16, T[42]);\n\t            b = HH(b, c, d, a, M_offset_6,  23, T[43]);\n\t            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);\n\t            d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t            c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t            b = HH(b, c, d, a, M_offset_2,  23, T[47]);\n\n\t            a = II(a, b, c, d, M_offset_0,  6,  T[48]);\n\t            d = II(d, a, b, c, M_offset_7,  10, T[49]);\n\t            c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t            b = II(b, c, d, a, M_offset_5,  21, T[51]);\n\t            a = II(a, b, c, d, M_offset_12, 6,  T[52]);\n\t            d = II(d, a, b, c, M_offset_3,  10, T[53]);\n\t            c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t            b = II(b, c, d, a, M_offset_1,  21, T[55]);\n\t            a = II(a, b, c, d, M_offset_8,  6,  T[56]);\n\t            d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t            c = II(c, d, a, b, M_offset_6,  15, T[58]);\n\t            b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t            a = II(a, b, c, d, M_offset_4,  6,  T[60]);\n\t            d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t            c = II(c, d, a, b, M_offset_2,  15, T[62]);\n\t            b = II(b, c, d, a, M_offset_9,  21, T[63]);\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t            var nBitsTotalL = nBitsTotal;\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)\n\t            );\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)\n\t            );\n\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    function FF(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & c) | (~b & d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function GG(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & d) | (c & ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function HH(a, b, c, d, x, s, t) {\n\t        var n = a + (b ^ c ^ d) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function II(a, b, c, d, x, s, t) {\n\t        var n = a + (c ^ (b | ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.MD5('message');\n\t     *     var hash = CryptoJS.MD5(wordArray);\n\t     */\n\t    C.MD5 = Hasher._createHelper(MD5);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacMD5(message, key);\n\t     */\n\t    C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * UTF-16 BE encoding strategy.\n\t     */\n\t    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 BE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 BE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 BE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 BE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-16 LE encoding strategy.\n\t     */\n\t    C_enc.Utf16LE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 LE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 LE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 LE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 LE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    function swapEndian(word) {\n\t        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t    }\n\t}());\n\n\n\t(function () {\n\t    // Check if typed arrays are supported\n\t    if (typeof ArrayBuffer != 'function') {\n\t        return;\n\t    }\n\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\n\t    // Reference original init\n\t    var superInit = WordArray.init;\n\n\t    // Augment WordArray.init to handle typed arrays\n\t    var subInit = WordArray.init = function (typedArray) {\n\t        // Convert buffers to uint8\n\t        if (typedArray instanceof ArrayBuffer) {\n\t            typedArray = new Uint8Array(typedArray);\n\t        }\n\n\t        // Convert other array views to uint8\n\t        if (\n\t            typedArray instanceof Int8Array ||\n\t            (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t            typedArray instanceof Int16Array ||\n\t            typedArray instanceof Uint16Array ||\n\t            typedArray instanceof Int32Array ||\n\t            typedArray instanceof Uint32Array ||\n\t            typedArray instanceof Float32Array ||\n\t            typedArray instanceof Float64Array\n\t        ) {\n\t            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t        }\n\n\t        // Handle Uint8Array\n\t        if (typedArray instanceof Uint8Array) {\n\t            // Shortcut\n\t            var typedArrayByteLength = typedArray.byteLength;\n\n\t            // Extract bytes\n\t            var words = [];\n\t            for (var i = 0; i < typedArrayByteLength; i++) {\n\t                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t            }\n\n\t            // Initialize this word array\n\t            superInit.call(this, words, typedArrayByteLength);\n\t        } else {\n\t            // Else call normal init\n\t            superInit.apply(this, arguments);\n\t        }\n\t    };\n\n\t    subInit.prototype = WordArray;\n\t}());\n\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var _zl = WordArray.create([\n\t        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n\t        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,\n\t        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,\n\t        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,\n\t        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);\n\t    var _zr = WordArray.create([\n\t        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,\n\t        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,\n\t        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,\n\t        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,\n\t        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);\n\t    var _sl = WordArray.create([\n\t         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,\n\t        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,\n\t        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,\n\t          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,\n\t        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);\n\t    var _sr = WordArray.create([\n\t        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,\n\t        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,\n\t        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,\n\t        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,\n\t        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);\n\n\t    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t    /**\n\t     * RIPEMD160 hash algorithm.\n\t     */\n\t    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                // Swap\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\t            // Shortcut\n\t            var H  = this._hash.words;\n\t            var hl = _hl.words;\n\t            var hr = _hr.words;\n\t            var zl = _zl.words;\n\t            var zr = _zr.words;\n\t            var sl = _sl.words;\n\t            var sr = _sr.words;\n\n\t            // Working variables\n\t            var al, bl, cl, dl, el;\n\t            var ar, br, cr, dr, er;\n\n\t            ar = al = H[0];\n\t            br = bl = H[1];\n\t            cr = cl = H[2];\n\t            dr = dl = H[3];\n\t            er = el = H[4];\n\t            // Computation\n\t            var t;\n\t            for (var i = 0; i < 80; i += 1) {\n\t                t = (al +  M[offset+zl[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f1(bl,cl,dl) + hl[0];\n\t                } else if (i<32) {\n\t\t            t +=  f2(bl,cl,dl) + hl[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(bl,cl,dl) + hl[2];\n\t                } else if (i<64) {\n\t\t            t +=  f4(bl,cl,dl) + hl[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f5(bl,cl,dl) + hl[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sl[i]);\n\t                t = (t+el)|0;\n\t                al = el;\n\t                el = dl;\n\t                dl = rotl(cl, 10);\n\t                cl = bl;\n\t                bl = t;\n\n\t                t = (ar + M[offset+zr[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f5(br,cr,dr) + hr[0];\n\t                } else if (i<32) {\n\t\t            t +=  f4(br,cr,dr) + hr[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(br,cr,dr) + hr[2];\n\t                } else if (i<64) {\n\t\t            t +=  f2(br,cr,dr) + hr[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f1(br,cr,dr) + hr[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sr[i]) ;\n\t                t = (t+er)|0;\n\t                ar = er;\n\t                er = dr;\n\t                dr = rotl(cr, 10);\n\t                cr = br;\n\t                br = t;\n\t            }\n\t            // Intermediate hash value\n\t            t    = (H[1] + cl + dr)|0;\n\t            H[1] = (H[2] + dl + er)|0;\n\t            H[2] = (H[3] + el + ar)|0;\n\t            H[3] = (H[4] + al + br)|0;\n\t            H[4] = (H[0] + bl + cr)|0;\n\t            H[0] =  t;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)\n\t            );\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 5; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                // Swap\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\n\t    function f1(x, y, z) {\n\t        return ((x) ^ (y) ^ (z));\n\n\t    }\n\n\t    function f2(x, y, z) {\n\t        return (((x)&(y)) | ((~x)&(z)));\n\t    }\n\n\t    function f3(x, y, z) {\n\t        return (((x) | (~(y))) ^ (z));\n\t    }\n\n\t    function f4(x, y, z) {\n\t        return (((x) & (z)) | ((y)&(~(z))));\n\t    }\n\n\t    function f5(x, y, z) {\n\t        return ((x) ^ ((y) |(~(z))));\n\n\t    }\n\n\t    function rotl(x,n) {\n\t        return (x<<n) | (x>>>(32-n));\n\t    }\n\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.RIPEMD160('message');\n\t     *     var hash = CryptoJS.RIPEMD160(wordArray);\n\t     */\n\t    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t     */\n\t    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA1 = C_algo.SHA1;\n\t    var HMAC = C_algo.HMAC;\n\n\t    /**\n\t     * Password-Based Key Derivation Function 2 algorithm.\n\t     */\n\t    var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hasher to use. Default: SHA1\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: SHA1,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create();\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Computes the Password-Based Key Derivation Function 2.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init HMAC\n\t            var hmac = HMAC.create(cfg.hasher, password);\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\t            var blockIndex = WordArray.create([0x00000001]);\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var blockIndexWords = blockIndex.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                var block = hmac.update(salt).finalize(blockIndex);\n\t                hmac.reset();\n\n\t                // Shortcuts\n\t                var blockWords = block.words;\n\t                var blockWordsLength = blockWords.length;\n\n\t                // Iterations\n\t                var intermediate = block;\n\t                for (var i = 1; i < iterations; i++) {\n\t                    intermediate = hmac.finalize(intermediate);\n\t                    hmac.reset();\n\n\t                    // Shortcut\n\t                    var intermediateWords = intermediate.words;\n\n\t                    // XOR intermediate with block\n\t                    for (var j = 0; j < blockWordsLength; j++) {\n\t                        blockWords[j] ^= intermediateWords[j];\n\t                    }\n\t                }\n\n\t                derivedKey.concat(block);\n\t                blockIndexWords[0]++;\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Computes the Password-Based Key Derivation Function 2.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.PBKDF2(password, salt);\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.PBKDF2 = function (password, salt, cfg) {\n\t        return PBKDF2.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var MD5 = C_algo.MD5;\n\n\t    /**\n\t     * This key derivation function is meant to conform with EVP_BytesToKey.\n\t     * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t     */\n\t    var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: MD5,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create();\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Derives a key from a password.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init hasher\n\t            var hasher = cfg.hasher.create();\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                if (block) {\n\t                    hasher.update(block);\n\t                }\n\t                var block = hasher.update(password).finalize(salt);\n\t                hasher.reset();\n\n\t                // Iterations\n\t                for (var i = 1; i < iterations; i++) {\n\t                    block = hasher.finalize(block);\n\t                    hasher.reset();\n\t                }\n\n\t                derivedKey.concat(block);\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Derives a key from a password.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.EvpKDF(password, salt);\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.EvpKDF = function (password, salt, cfg) {\n\t        return EvpKDF.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA256 = C_algo.SHA256;\n\n\t    /**\n\t     * SHA-224 hash algorithm.\n\t     */\n\t    var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA256._doFinalize.call(this);\n\n\t            hash.sigBytes -= 4;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA224('message');\n\t     *     var hash = CryptoJS.SHA224(wordArray);\n\t     */\n\t    C.SHA224 = SHA256._createHelper(SHA224);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA224(message, key);\n\t     */\n\t    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var X32WordArray = C_lib.WordArray;\n\n\t    /**\n\t     * x64 namespace.\n\t     */\n\t    var C_x64 = C.x64 = {};\n\n\t    /**\n\t     * A 64-bit word.\n\t     */\n\t    var X64Word = C_x64.Word = Base.extend({\n\t        /**\n\t         * Initializes a newly created 64-bit word.\n\t         *\n\t         * @param {number} high The high 32 bits.\n\t         * @param {number} low The low 32 bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t         */\n\t        init: function (high, low) {\n\t            this.high = high;\n\t            this.low = low;\n\t        }\n\n\t        /**\n\t         * Bitwise NOTs this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after negating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var negated = x64Word.not();\n\t         */\n\t        // not: function () {\n\t            // var high = ~this.high;\n\t            // var low = ~this.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ANDs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to AND with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ANDing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var anded = x64Word.and(anotherX64Word);\n\t         */\n\t        // and: function (word) {\n\t            // var high = this.high & word.high;\n\t            // var low = this.low & word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to OR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var ored = x64Word.or(anotherX64Word);\n\t         */\n\t        // or: function (word) {\n\t            // var high = this.high | word.high;\n\t            // var low = this.low | word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise XORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to XOR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after XORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var xored = x64Word.xor(anotherX64Word);\n\t         */\n\t        // xor: function (word) {\n\t            // var high = this.high ^ word.high;\n\t            // var low = this.low ^ word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftL(25);\n\t         */\n\t        // shiftL: function (n) {\n\t            // if (n < 32) {\n\t                // var high = (this.high << n) | (this.low >>> (32 - n));\n\t                // var low = this.low << n;\n\t            // } else {\n\t                // var high = this.low << (n - 32);\n\t                // var low = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftR(7);\n\t         */\n\t        // shiftR: function (n) {\n\t            // if (n < 32) {\n\t                // var low = (this.low >>> n) | (this.high << (32 - n));\n\t                // var high = this.high >>> n;\n\t            // } else {\n\t                // var low = this.high >>> (n - 32);\n\t                // var high = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotL(25);\n\t         */\n\t        // rotL: function (n) {\n\t            // return this.shiftL(n).or(this.shiftR(64 - n));\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotR(7);\n\t         */\n\t        // rotR: function (n) {\n\t            // return this.shiftR(n).or(this.shiftL(64 - n));\n\t        // },\n\n\t        /**\n\t         * Adds this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to add with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after adding.\n\t         *\n\t         * @example\n\t         *\n\t         *     var added = x64Word.add(anotherX64Word);\n\t         */\n\t        // add: function (word) {\n\t            // var low = (this.low + word.low) | 0;\n\t            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t            // var high = (this.high + word.high + carry) | 0;\n\n\t            // return X64Word.create(high, low);\n\t        // }\n\t    });\n\n\t    /**\n\t     * An array of 64-bit words.\n\t     *\n\t     * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var X64WordArray = C_x64.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create();\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ]);\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ], 10);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 8;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this 64-bit word array to a 32-bit word array.\n\t         *\n\t         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x32WordArray = x64WordArray.toX32();\n\t         */\n\t        toX32: function () {\n\t            // Shortcuts\n\t            var x64Words = this.words;\n\t            var x64WordsLength = x64Words.length;\n\n\t            // Convert\n\t            var x32Words = [];\n\t            for (var i = 0; i < x64WordsLength; i++) {\n\t                var x64Word = x64Words[i];\n\t                x32Words.push(x64Word.high);\n\t                x32Words.push(x64Word.low);\n\t            }\n\n\t            return X32WordArray.create(x32Words, this.sigBytes);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {X64WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = x64WordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\n\t            // Clone \"words\" array\n\t            var words = clone.words = this.words.slice(0);\n\n\t            // Clone each X64Word object\n\t            var wordsLength = words.length;\n\t            for (var i = 0; i < wordsLength; i++) {\n\t                words[i] = words[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var C_algo = C.algo;\n\n\t    // Constants tables\n\t    var RHO_OFFSETS = [];\n\t    var PI_INDEXES  = [];\n\t    var ROUND_CONSTANTS = [];\n\n\t    // Compute Constants\n\t    (function () {\n\t        // Compute rho offset constants\n\t        var x = 1, y = 0;\n\t        for (var t = 0; t < 24; t++) {\n\t            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t            var newX = y % 5;\n\t            var newY = (2 * x + 3 * y) % 5;\n\t            x = newX;\n\t            y = newY;\n\t        }\n\n\t        // Compute pi index constants\n\t        for (var x = 0; x < 5; x++) {\n\t            for (var y = 0; y < 5; y++) {\n\t                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t            }\n\t        }\n\n\t        // Compute round constants\n\t        var LFSR = 0x01;\n\t        for (var i = 0; i < 24; i++) {\n\t            var roundConstantMsw = 0;\n\t            var roundConstantLsw = 0;\n\n\t            for (var j = 0; j < 7; j++) {\n\t                if (LFSR & 0x01) {\n\t                    var bitPosition = (1 << j) - 1;\n\t                    if (bitPosition < 32) {\n\t                        roundConstantLsw ^= 1 << bitPosition;\n\t                    } else /* if (bitPosition >= 32) */ {\n\t                        roundConstantMsw ^= 1 << (bitPosition - 32);\n\t                    }\n\t                }\n\n\t                // Compute next LFSR\n\t                if (LFSR & 0x80) {\n\t                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t                    LFSR = (LFSR << 1) ^ 0x71;\n\t                } else {\n\t                    LFSR <<= 1;\n\t                }\n\t            }\n\n\t            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t        }\n\t    }());\n\n\t    // Reusable objects for temporary values\n\t    var T = [];\n\t    (function () {\n\t        for (var i = 0; i < 25; i++) {\n\t            T[i] = X64Word.create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-3 hash algorithm.\n\t     */\n\t    var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} outputLength\n\t         *   The desired number of bits in the output hash.\n\t         *   Only values permitted are: 224, 256, 384, 512.\n\t         *   Default: 512\n\t         */\n\t        cfg: Hasher.cfg.extend({\n\t            outputLength: 512\n\t        }),\n\n\t        _doReset: function () {\n\t            var state = this._state = []\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = new X64Word.init();\n\t            }\n\n\t            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var nBlockSizeLanes = this.blockSize / 2;\n\n\t            // Absorb\n\t            for (var i = 0; i < nBlockSizeLanes; i++) {\n\t                // Shortcuts\n\t                var M2i  = M[offset + 2 * i];\n\t                var M2i1 = M[offset + 2 * i + 1];\n\n\t                // Swap endian\n\t                M2i = (\n\t                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)\n\t                );\n\t                M2i1 = (\n\t                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Absorb message into state\n\t                var lane = state[i];\n\t                lane.high ^= M2i1;\n\t                lane.low  ^= M2i;\n\t            }\n\n\t            // Rounds\n\t            for (var round = 0; round < 24; round++) {\n\t                // Theta\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Mix column lanes\n\t                    var tMsw = 0, tLsw = 0;\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        tMsw ^= lane.high;\n\t                        tLsw ^= lane.low;\n\t                    }\n\n\t                    // Temporary values\n\t                    var Tx = T[x];\n\t                    Tx.high = tMsw;\n\t                    Tx.low  = tLsw;\n\t                }\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Shortcuts\n\t                    var Tx4 = T[(x + 4) % 5];\n\t                    var Tx1 = T[(x + 1) % 5];\n\t                    var Tx1Msw = Tx1.high;\n\t                    var Tx1Lsw = Tx1.low;\n\n\t                    // Mix surrounding columns\n\t                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        lane.high ^= tMsw;\n\t                        lane.low  ^= tLsw;\n\t                    }\n\t                }\n\n\t                // Rho Pi\n\t                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t                    // Shortcuts\n\t                    var lane = state[laneIndex];\n\t                    var laneMsw = lane.high;\n\t                    var laneLsw = lane.low;\n\t                    var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t                    // Rotate lanes\n\t                    if (rhoOffset < 32) {\n\t                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t                    } else /* if (rhoOffset >= 32) */ {\n\t                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t                    }\n\n\t                    // Transpose lanes\n\t                    var TPiLane = T[PI_INDEXES[laneIndex]];\n\t                    TPiLane.high = tMsw;\n\t                    TPiLane.low  = tLsw;\n\t                }\n\n\t                // Rho pi at x = y = 0\n\t                var T0 = T[0];\n\t                var state0 = state[0];\n\t                T0.high = state0.high;\n\t                T0.low  = state0.low;\n\n\t                // Chi\n\t                for (var x = 0; x < 5; x++) {\n\t                    for (var y = 0; y < 5; y++) {\n\t                        // Shortcuts\n\t                        var laneIndex = x + 5 * y;\n\t                        var lane = state[laneIndex];\n\t                        var TLane = T[laneIndex];\n\t                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t                        // Mix rows\n\t                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);\n\t                    }\n\t                }\n\n\t                // Iota\n\t                var lane = state[0];\n\t                var roundConstant = ROUND_CONSTANTS[round];\n\t                lane.high ^= roundConstant.high;\n\t                lane.low  ^= roundConstant.low;;\n\t            }\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\t            var blockSizeBits = this.blockSize * 32;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var outputLengthBytes = this.cfg.outputLength / 8;\n\t            var outputLengthLanes = outputLengthBytes / 8;\n\n\t            // Squeeze\n\t            var hashWords = [];\n\t            for (var i = 0; i < outputLengthLanes; i++) {\n\t                // Shortcuts\n\t                var lane = state[i];\n\t                var laneMsw = lane.high;\n\t                var laneLsw = lane.low;\n\n\t                // Swap endian\n\t                laneMsw = (\n\t                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)\n\t                );\n\t                laneLsw = (\n\t                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Squeeze state to retrieve hash\n\t                hashWords.push(laneLsw);\n\t                hashWords.push(laneMsw);\n\t            }\n\n\t            // Return final computed hash\n\t            return new WordArray.init(hashWords, outputLengthBytes);\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\n\t            var state = clone._state = this._state.slice(0);\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = state[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA3('message');\n\t     *     var hash = CryptoJS.SHA3(wordArray);\n\t     */\n\t    C.SHA3 = Hasher._createHelper(SHA3);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA3(message, key);\n\t     */\n\t    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\n\t    function X64Word_create() {\n\t        return X64Word.create.apply(X64Word, arguments);\n\t    }\n\n\t    // Constants\n\t    var K = [\n\t        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t    ];\n\n\t    // Reusable objects\n\t    var W = [];\n\t    (function () {\n\t        for (var i = 0; i < 80; i++) {\n\t            W[i] = X64Word_create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-512 hash algorithm.\n\t     */\n\t    var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var H0 = H[0];\n\t            var H1 = H[1];\n\t            var H2 = H[2];\n\t            var H3 = H[3];\n\t            var H4 = H[4];\n\t            var H5 = H[5];\n\t            var H6 = H[6];\n\t            var H7 = H[7];\n\n\t            var H0h = H0.high;\n\t            var H0l = H0.low;\n\t            var H1h = H1.high;\n\t            var H1l = H1.low;\n\t            var H2h = H2.high;\n\t            var H2l = H2.low;\n\t            var H3h = H3.high;\n\t            var H3l = H3.low;\n\t            var H4h = H4.high;\n\t            var H4l = H4.low;\n\t            var H5h = H5.high;\n\t            var H5l = H5.low;\n\t            var H6h = H6.high;\n\t            var H6l = H6.low;\n\t            var H7h = H7.high;\n\t            var H7l = H7.low;\n\n\t            // Working variables\n\t            var ah = H0h;\n\t            var al = H0l;\n\t            var bh = H1h;\n\t            var bl = H1l;\n\t            var ch = H2h;\n\t            var cl = H2l;\n\t            var dh = H3h;\n\t            var dl = H3l;\n\t            var eh = H4h;\n\t            var el = H4l;\n\t            var fh = H5h;\n\t            var fl = H5l;\n\t            var gh = H6h;\n\t            var gl = H6l;\n\t            var hh = H7h;\n\t            var hl = H7l;\n\n\t            // Rounds\n\t            for (var i = 0; i < 80; i++) {\n\t                // Shortcut\n\t                var Wi = W[i];\n\n\t                // Extend message\n\t                if (i < 16) {\n\t                    var Wih = Wi.high = M[offset + i * 2]     | 0;\n\t                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;\n\t                } else {\n\t                    // Gamma0\n\t                    var gamma0x  = W[i - 15];\n\t                    var gamma0xh = gamma0x.high;\n\t                    var gamma0xl = gamma0x.low;\n\t                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t                    // Gamma1\n\t                    var gamma1x  = W[i - 2];\n\t                    var gamma1xh = gamma1x.high;\n\t                    var gamma1xl = gamma1x.low;\n\t                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t                    var Wi7  = W[i - 7];\n\t                    var Wi7h = Wi7.high;\n\t                    var Wi7l = Wi7.low;\n\n\t                    var Wi16  = W[i - 16];\n\t                    var Wi16h = Wi16.high;\n\t                    var Wi16l = Wi16.low;\n\n\t                    var Wil = gamma0l + Wi7l;\n\t                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t                    var Wil = Wil + gamma1l;\n\t                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t                    var Wil = Wil + Wi16l;\n\t                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t                    Wi.high = Wih;\n\t                    Wi.low  = Wil;\n\t                }\n\n\t                var chh  = (eh & fh) ^ (~eh & gh);\n\t                var chl  = (el & fl) ^ (~el & gl);\n\t                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t                // t1 = h + sigma1 + ch + K[i] + W[i]\n\t                var Ki  = K[i];\n\t                var Kih = Ki.high;\n\t                var Kil = Ki.low;\n\n\t                var t1l = hl + sigma1l;\n\t                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + chl;\n\t                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Kil;\n\t                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Wil;\n\t                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t                // t2 = sigma0 + maj\n\t                var t2l = sigma0l + majl;\n\t                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t                // Update working variables\n\t                hh = gh;\n\t                hl = gl;\n\t                gh = fh;\n\t                gl = fl;\n\t                fh = eh;\n\t                fl = el;\n\t                el = (dl + t1l) | 0;\n\t                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t                dh = ch;\n\t                dl = cl;\n\t                ch = bh;\n\t                cl = bl;\n\t                bh = ah;\n\t                bl = al;\n\t                al = (t1l + t2l) | 0;\n\t                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H0l = H0.low  = (H0l + al);\n\t            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t            H1l = H1.low  = (H1l + bl);\n\t            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t            H2l = H2.low  = (H2l + cl);\n\t            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t            H3l = H3.low  = (H3l + dl);\n\t            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t            H4l = H4.low  = (H4l + el);\n\t            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t            H5l = H5.low  = (H5l + fl);\n\t            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t            H6l = H6.low  = (H6l + gl);\n\t            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t            H7l = H7.low  = (H7l + hl);\n\t            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Convert hash to 32-bit word array before returning\n\t            var hash = this._hash.toX32();\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        },\n\n\t        blockSize: 1024/32\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA512('message');\n\t     *     var hash = CryptoJS.SHA512(wordArray);\n\t     */\n\t    C.SHA512 = Hasher._createHelper(SHA512);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA512(message, key);\n\t     */\n\t    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA512 = C_algo.SHA512;\n\n\t    /**\n\t     * SHA-384 hash algorithm.\n\t     */\n\t    var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA512._doFinalize.call(this);\n\n\t            hash.sigBytes -= 16;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA384('message');\n\t     *     var hash = CryptoJS.SHA384(wordArray);\n\t     */\n\t    C.SHA384 = SHA512._createHelper(SHA384);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA384(message, key);\n\t     */\n\t    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var Base64 = C_enc.Base64;\n\t    var C_algo = C.algo;\n\t    var EvpKDF = C_algo.EvpKDF;\n\n\t    /**\n\t     * Abstract base cipher template.\n\t     *\n\t     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t     */\n\t    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {WordArray} iv The IV to use for this operation.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Creates this cipher in encryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createEncryptor: function (key, cfg) {\n\t            return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Creates this cipher in decryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createDecryptor: function (key, cfg) {\n\t            return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created cipher.\n\t         *\n\t         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t         */\n\t        init: function (xformMode, key, cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Store transform mode and key\n\t            this._xformMode = xformMode;\n\t            this._key = key;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this cipher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     cipher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-cipher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Adds data to be encrypted or decrypted.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.process('data');\n\t         *     var encrypted = cipher.process(wordArray);\n\t         */\n\t        process: function (dataUpdate) {\n\t            // Append\n\t            this._append(dataUpdate);\n\n\t            // Process available blocks\n\t            return this._process();\n\t        },\n\n\t        /**\n\t         * Finalizes the encryption or decryption process.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after final processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.finalize();\n\t         *     var encrypted = cipher.finalize('data');\n\t         *     var encrypted = cipher.finalize(wordArray);\n\t         */\n\t        finalize: function (dataUpdate) {\n\t            // Final data update\n\t            if (dataUpdate) {\n\t                this._append(dataUpdate);\n\t            }\n\n\t            // Perform concrete-cipher logic\n\t            var finalProcessedData = this._doFinalize();\n\n\t            return finalProcessedData;\n\t        },\n\n\t        keySize: 128/32,\n\n\t        ivSize: 128/32,\n\n\t        _ENC_XFORM_MODE: 1,\n\n\t        _DEC_XFORM_MODE: 2,\n\n\t        /**\n\t         * Creates shortcut functions to a cipher's object interface.\n\t         *\n\t         * @param {Cipher} cipher The cipher to create a helper for.\n\t         *\n\t         * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t         */\n\t        _createHelper: (function () {\n\t            function selectCipherStrategy(key) {\n\t                if (typeof key == 'string') {\n\t                    return PasswordBasedCipher;\n\t                } else {\n\t                    return SerializableCipher;\n\t                }\n\t            }\n\n\t            return function (cipher) {\n\t                return {\n\t                    encrypt: function (message, key, cfg) {\n\t                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t                    },\n\n\t                    decrypt: function (ciphertext, key, cfg) {\n\t                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t                    }\n\t                };\n\t            };\n\t        }())\n\t    });\n\n\t    /**\n\t     * Abstract base stream cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t     */\n\t    var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t        _doFinalize: function () {\n\t            // Process partial blocks\n\t            var finalProcessedBlocks = this._process(!!'flush');\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 1\n\t    });\n\n\t    /**\n\t     * Mode namespace.\n\t     */\n\t    var C_mode = C.mode = {};\n\n\t    /**\n\t     * Abstract base block cipher mode template.\n\t     */\n\t    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t        /**\n\t         * Creates this mode for encryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t         */\n\t        createEncryptor: function (cipher, iv) {\n\t            return this.Encryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Creates this mode for decryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t         */\n\t        createDecryptor: function (cipher, iv) {\n\t            return this.Decryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created mode.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t         */\n\t        init: function (cipher, iv) {\n\t            this._cipher = cipher;\n\t            this._iv = iv;\n\t        }\n\t    });\n\n\t    /**\n\t     * Cipher Block Chaining mode.\n\t     */\n\t    var CBC = C_mode.CBC = (function () {\n\t        /**\n\t         * Abstract base CBC mode.\n\t         */\n\t        var CBC = BlockCipherMode.extend();\n\n\t        /**\n\t         * CBC encryptor.\n\t         */\n\t        CBC.Encryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // XOR and encrypt\n\t                xorBlock.call(this, words, offset, blockSize);\n\t                cipher.encryptBlock(words, offset);\n\n\t                // Remember this block to use with next block\n\t                this._prevBlock = words.slice(offset, offset + blockSize);\n\t            }\n\t        });\n\n\t        /**\n\t         * CBC decryptor.\n\t         */\n\t        CBC.Decryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // Remember this block to use with next block\n\t                var thisBlock = words.slice(offset, offset + blockSize);\n\n\t                // Decrypt and XOR\n\t                cipher.decryptBlock(words, offset);\n\t                xorBlock.call(this, words, offset, blockSize);\n\n\t                // This block becomes the previous block\n\t                this._prevBlock = thisBlock;\n\t            }\n\t        });\n\n\t        function xorBlock(words, offset, blockSize) {\n\t            // Shortcut\n\t            var iv = this._iv;\n\n\t            // Choose mixing block\n\t            if (iv) {\n\t                var block = iv;\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            } else {\n\t                var block = this._prevBlock;\n\t            }\n\n\t            // XOR blocks\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= block[i];\n\t            }\n\t        }\n\n\t        return CBC;\n\t    }());\n\n\t    /**\n\t     * Padding namespace.\n\t     */\n\t    var C_pad = C.pad = {};\n\n\t    /**\n\t     * PKCS #5/7 padding strategy.\n\t     */\n\t    var Pkcs7 = C_pad.Pkcs7 = {\n\t        /**\n\t         * Pads data using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to pad.\n\t         * @param {number} blockSize The multiple that the data should be padded to.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t         */\n\t        pad: function (data, blockSize) {\n\t            // Shortcut\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count padding bytes\n\t            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t            // Create padding word\n\t            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t            // Create padding\n\t            var paddingWords = [];\n\t            for (var i = 0; i < nPaddingBytes; i += 4) {\n\t                paddingWords.push(paddingWord);\n\t            }\n\t            var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t            // Add padding\n\t            data.concat(padding);\n\t        },\n\n\t        /**\n\t         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to unpad.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t         */\n\t        unpad: function (data) {\n\t            // Get number of padding bytes from last byte\n\t            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t            // Remove padding\n\t            data.sigBytes -= nPaddingBytes;\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract base block cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t     */\n\t    var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Mode} mode The block mode to use. Default: CBC\n\t         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t         */\n\t        cfg: Cipher.cfg.extend({\n\t            mode: CBC,\n\t            padding: Pkcs7\n\t        }),\n\n\t        reset: function () {\n\t            // Reset cipher\n\t            Cipher.reset.call(this);\n\n\t            // Shortcuts\n\t            var cfg = this.cfg;\n\t            var iv = cfg.iv;\n\t            var mode = cfg.mode;\n\n\t            // Reset block mode\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                var modeCreator = mode.createEncryptor;\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                var modeCreator = mode.createDecryptor;\n\n\t                // Keep at least one block in the buffer for unpadding\n\t                this._minBufferSize = 1;\n\t            }\n\t            this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t        },\n\n\t        _doProcessBlock: function (words, offset) {\n\t            this._mode.processBlock(words, offset);\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcut\n\t            var padding = this.cfg.padding;\n\n\t            // Finalize\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                // Pad data\n\t                padding.pad(this._data, this.blockSize);\n\n\t                // Process final blocks\n\t                var finalProcessedBlocks = this._process(!!'flush');\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                // Process final blocks\n\t                var finalProcessedBlocks = this._process(!!'flush');\n\n\t                // Unpad data\n\t                padding.unpad(finalProcessedBlocks);\n\t            }\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 128/32\n\t    });\n\n\t    /**\n\t     * A collection of cipher parameters.\n\t     *\n\t     * @property {WordArray} ciphertext The raw ciphertext.\n\t     * @property {WordArray} key The key to this ciphertext.\n\t     * @property {WordArray} iv The IV used in the ciphering operation.\n\t     * @property {WordArray} salt The salt used with a key derivation function.\n\t     * @property {Cipher} algorithm The cipher algorithm.\n\t     * @property {Mode} mode The block mode used in the ciphering operation.\n\t     * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t     * @property {number} blockSize The block size of the cipher.\n\t     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t     */\n\t    var CipherParams = C_lib.CipherParams = Base.extend({\n\t        /**\n\t         * Initializes a newly created cipher params object.\n\t         *\n\t         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n\t         *         ciphertext: ciphertextWordArray,\n\t         *         key: keyWordArray,\n\t         *         iv: ivWordArray,\n\t         *         salt: saltWordArray,\n\t         *         algorithm: CryptoJS.algo.AES,\n\t         *         mode: CryptoJS.mode.CBC,\n\t         *         padding: CryptoJS.pad.PKCS7,\n\t         *         blockSize: 4,\n\t         *         formatter: CryptoJS.format.OpenSSL\n\t         *     });\n\t         */\n\t        init: function (cipherParams) {\n\t            this.mixIn(cipherParams);\n\t        },\n\n\t        /**\n\t         * Converts this cipher params object to a string.\n\t         *\n\t         * @param {Format} formatter (Optional) The formatting strategy to use.\n\t         *\n\t         * @return {string} The stringified cipher params.\n\t         *\n\t         * @throws Error If neither the formatter nor the default formatter is set.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = cipherParams + '';\n\t         *     var string = cipherParams.toString();\n\t         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t         */\n\t        toString: function (formatter) {\n\t            return (formatter || this.formatter).stringify(this);\n\t        }\n\t    });\n\n\t    /**\n\t     * Format namespace.\n\t     */\n\t    var C_format = C.format = {};\n\n\t    /**\n\t     * OpenSSL formatting strategy.\n\t     */\n\t    var OpenSSLFormatter = C_format.OpenSSL = {\n\t        /**\n\t         * Converts a cipher params object to an OpenSSL-compatible string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The OpenSSL-compatible string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            // Shortcuts\n\t            var ciphertext = cipherParams.ciphertext;\n\t            var salt = cipherParams.salt;\n\n\t            // Format\n\t            if (salt) {\n\t                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t            } else {\n\t                var wordArray = ciphertext;\n\t            }\n\n\t            return wordArray.toString(Base64);\n\t        },\n\n\t        /**\n\t         * Converts an OpenSSL-compatible string to a cipher params object.\n\t         *\n\t         * @param {string} openSSLStr The OpenSSL-compatible string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t         */\n\t        parse: function (openSSLStr) {\n\t            // Parse base64\n\t            var ciphertext = Base64.parse(openSSLStr);\n\n\t            // Shortcut\n\t            var ciphertextWords = ciphertext.words;\n\n\t            // Test for salt\n\t            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t                // Extract salt\n\t                var salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t                // Remove salt from ciphertext\n\t                ciphertextWords.splice(0, 4);\n\t                ciphertext.sigBytes -= 16;\n\t            }\n\n\t            return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t         */\n\t        cfg: Base.extend({\n\t            format: OpenSSLFormatter\n\t        }),\n\n\t        /**\n\t         * Encrypts a message.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Encrypt\n\t            var encryptor = cipher.createEncryptor(key, cfg);\n\t            var ciphertext = encryptor.finalize(message);\n\n\t            // Shortcut\n\t            var cipherCfg = encryptor.cfg;\n\n\t            // Create and return serializable cipher params\n\t            return CipherParams.create({\n\t                ciphertext: ciphertext,\n\t                key: key,\n\t                iv: cipherCfg.iv,\n\t                algorithm: cipher,\n\t                mode: cipherCfg.mode,\n\t                padding: cipherCfg.padding,\n\t                blockSize: cipher.blockSize,\n\t                formatter: cfg.format\n\t            });\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Decrypt\n\t            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t            return plaintext;\n\t        },\n\n\t        /**\n\t         * Converts serialized ciphertext to CipherParams,\n\t         * else assumed CipherParams already and returns ciphertext unchanged.\n\t         *\n\t         * @param {CipherParams|string} ciphertext The ciphertext.\n\t         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t         *\n\t         * @return {CipherParams} The unserialized ciphertext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t         */\n\t        _parse: function (ciphertext, format) {\n\t            if (typeof ciphertext == 'string') {\n\t                return format.parse(ciphertext, this);\n\t            } else {\n\t                return ciphertext;\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Key derivation function namespace.\n\t     */\n\t    var C_kdf = C.kdf = {};\n\n\t    /**\n\t     * OpenSSL key derivation function.\n\t     */\n\t    var OpenSSLKdf = C_kdf.OpenSSL = {\n\t        /**\n\t         * Derives a key and IV from a password.\n\t         *\n\t         * @param {string} password The password to derive from.\n\t         * @param {number} keySize The size in words of the key to generate.\n\t         * @param {number} ivSize The size in words of the IV to generate.\n\t         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t         *\n\t         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t         */\n\t        execute: function (password, keySize, ivSize, salt) {\n\t            // Generate random salt\n\t            if (!salt) {\n\t                salt = WordArray.random(64/8);\n\t            }\n\n\t            // Derive key and IV\n\t            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n\t            // Separate key and IV\n\t            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t            key.sigBytes = keySize * 4;\n\n\t            // Return params\n\t            return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A serializable cipher wrapper that derives the key from a password,\n\t     * and returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t         */\n\t        cfg: SerializableCipher.cfg.extend({\n\t            kdf: OpenSSLKdf\n\t        }),\n\n\t        /**\n\t         * Encrypts a message using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Encrypt\n\t            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t            // Mix in derived params\n\t            ciphertext.mixIn(derivedParams);\n\n\t            return ciphertext;\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Decrypt\n\t            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t            return plaintext;\n\t        }\n\t    });\n\t}());\n\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t    var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    CFB.Encryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // Remember this block to use with next block\n\t            this._prevBlock = words.slice(offset, offset + blockSize);\n\t        }\n\t    });\n\n\t    CFB.Decryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            // Remember this block to use with next block\n\t            var thisBlock = words.slice(offset, offset + blockSize);\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // This block becomes the previous block\n\t            this._prevBlock = thisBlock;\n\t        }\n\t    });\n\n\t    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t        // Shortcut\n\t        var iv = this._iv;\n\n\t        // Generate keystream\n\t        if (iv) {\n\t            var keystream = iv.slice(0);\n\n\t            // Remove IV for subsequent blocks\n\t            this._iv = undefined;\n\t        } else {\n\t            var keystream = this._prevBlock;\n\t        }\n\t        cipher.encryptBlock(keystream, 0);\n\n\t        // Encrypt\n\t        for (var i = 0; i < blockSize; i++) {\n\t            words[offset + i] ^= keystream[i];\n\t        }\n\t    }\n\n\t    return CFB;\n\t}());\n\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    ECB.Encryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.encryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    ECB.Decryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.decryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    return ECB;\n\t}());\n\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcuts\n\t        var dataSigBytes = data.sigBytes;\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t        // Compute last byte position\n\t        var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t        data.sigBytes += nPaddingBytes;\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t        // Pad\n\t        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t    pad: function (data, blockSize) {\n\t        // Add 0x80 byte\n\t        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t        // Zero pad the rest\n\t        CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Remove zero padding\n\t        CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t        // Remove one more byte -- the 0x80 byte\n\t        data.sigBytes--;\n\t    }\n\t};\n\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t    var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = OFB.Encryptor = OFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var keystream = this._keystream;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                keystream = this._keystream = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    OFB.Decryptor = Encryptor;\n\n\t    return OFB;\n\t}());\n\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t    pad: function () {\n\t    },\n\n\t    unpad: function () {\n\t    }\n\t};\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var CipherParams = C_lib.CipherParams;\n\t    var C_enc = C.enc;\n\t    var Hex = C_enc.Hex;\n\t    var C_format = C.format;\n\n\t    var HexFormatter = C_format.Hex = {\n\t        /**\n\t         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The hexadecimally encoded string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            return cipherParams.ciphertext.toString(Hex);\n\t        },\n\n\t        /**\n\t         * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t         *\n\t         * @param {string} input The hexadecimally encoded string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t         */\n\t        parse: function (input) {\n\t            var ciphertext = Hex.parse(input);\n\t            return CipherParams.create({ ciphertext: ciphertext });\n\t        }\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Lookup tables\n\t    var SBOX = [];\n\t    var INV_SBOX = [];\n\t    var SUB_MIX_0 = [];\n\t    var SUB_MIX_1 = [];\n\t    var SUB_MIX_2 = [];\n\t    var SUB_MIX_3 = [];\n\t    var INV_SUB_MIX_0 = [];\n\t    var INV_SUB_MIX_1 = [];\n\t    var INV_SUB_MIX_2 = [];\n\t    var INV_SUB_MIX_3 = [];\n\n\t    // Compute lookup tables\n\t    (function () {\n\t        // Compute double table\n\t        var d = [];\n\t        for (var i = 0; i < 256; i++) {\n\t            if (i < 128) {\n\t                d[i] = i << 1;\n\t            } else {\n\t                d[i] = (i << 1) ^ 0x11b;\n\t            }\n\t        }\n\n\t        // Walk GF(2^8)\n\t        var x = 0;\n\t        var xi = 0;\n\t        for (var i = 0; i < 256; i++) {\n\t            // Compute sbox\n\t            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t            SBOX[x] = sx;\n\t            INV_SBOX[sx] = x;\n\n\t            // Compute multiplication\n\t            var x2 = d[x];\n\t            var x4 = d[x2];\n\t            var x8 = d[x4];\n\n\t            // Compute sub bytes, mix columns tables\n\t            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t            SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t            SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n\t            SUB_MIX_3[x] = t;\n\n\t            // Compute inv sub bytes, inv mix columns tables\n\t            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n\t            INV_SUB_MIX_3[sx] = t;\n\n\t            // Compute next counter\n\t            if (!x) {\n\t                x = xi = 1;\n\t            } else {\n\t                x = x2 ^ d[d[d[x8 ^ x2]]];\n\t                xi ^= d[d[xi]];\n\t            }\n\t        }\n\t    }());\n\n\t    // Precomputed Rcon lookup\n\t    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t    /**\n\t     * AES block cipher algorithm.\n\t     */\n\t    var AES = C_algo.AES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Skip reset of nRounds has been set before and key did not change\n\t            if (this._nRounds && this._keyPriorReset === this._key) {\n\t                return;\n\t            }\n\n\t            // Shortcuts\n\t            var key = this._keyPriorReset = this._key;\n\t            var keyWords = key.words;\n\t            var keySize = key.sigBytes / 4;\n\n\t            // Compute number of rounds\n\t            var nRounds = this._nRounds = keySize + 6;\n\n\t            // Compute number of key schedule rows\n\t            var ksRows = (nRounds + 1) * 4;\n\n\t            // Compute key schedule\n\t            var keySchedule = this._keySchedule = [];\n\t            for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t                if (ksRow < keySize) {\n\t                    keySchedule[ksRow] = keyWords[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 1];\n\n\t                    if (!(ksRow % keySize)) {\n\t                        // Rot word\n\t                        t = (t << 8) | (t >>> 24);\n\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t                        // Mix Rcon\n\t                        t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t                    } else if (keySize > 6 && ksRow % keySize == 4) {\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t                    }\n\n\t                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t                }\n\t            }\n\n\t            // Compute inv key schedule\n\t            var invKeySchedule = this._invKeySchedule = [];\n\t            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t                var ksRow = ksRows - invKsRow;\n\n\t                if (invKsRow % 4) {\n\t                    var t = keySchedule[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 4];\n\t                }\n\n\t                if (invKsRow < 4 || ksRow <= 4) {\n\t                    invKeySchedule[invKsRow] = t;\n\t                } else {\n\t                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t                }\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            // Swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\n\t            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t            // Inv swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\t        },\n\n\t        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t            // Shortcut\n\t            var nRounds = this._nRounds;\n\n\t            // Get input, add round key\n\t            var s0 = M[offset]     ^ keySchedule[0];\n\t            var s1 = M[offset + 1] ^ keySchedule[1];\n\t            var s2 = M[offset + 2] ^ keySchedule[2];\n\t            var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t            // Key schedule row counter\n\t            var ksRow = 4;\n\n\t            // Rounds\n\t            for (var round = 1; round < nRounds; round++) {\n\t                // Shift rows, sub bytes, mix columns, add round key\n\t                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t                // Update state\n\t                s0 = t0;\n\t                s1 = t1;\n\t                s2 = t2;\n\t                s3 = t3;\n\t            }\n\n\t            // Shift rows, sub bytes, add round key\n\t            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t            // Set output\n\t            M[offset]     = t0;\n\t            M[offset + 1] = t1;\n\t            M[offset + 2] = t2;\n\t            M[offset + 3] = t3;\n\t        },\n\n\t        keySize: 256/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Permuted Choice 1 constants\n\t    var PC1 = [\n\t        57, 49, 41, 33, 25, 17, 9,  1,\n\t        58, 50, 42, 34, 26, 18, 10, 2,\n\t        59, 51, 43, 35, 27, 19, 11, 3,\n\t        60, 52, 44, 36, 63, 55, 47, 39,\n\t        31, 23, 15, 7,  62, 54, 46, 38,\n\t        30, 22, 14, 6,  61, 53, 45, 37,\n\t        29, 21, 13, 5,  28, 20, 12, 4\n\t    ];\n\n\t    // Permuted Choice 2 constants\n\t    var PC2 = [\n\t        14, 17, 11, 24, 1,  5,\n\t        3,  28, 15, 6,  21, 10,\n\t        23, 19, 12, 4,  26, 8,\n\t        16, 7,  27, 20, 13, 2,\n\t        41, 52, 31, 37, 47, 55,\n\t        30, 40, 51, 45, 33, 48,\n\t        44, 49, 39, 56, 34, 53,\n\t        46, 42, 50, 36, 29, 32\n\t    ];\n\n\t    // Cumulative bit shift constants\n\t    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t    // SBOXes and round permutation constants\n\t    var SBOX_P = [\n\t        {\n\t            0x0: 0x808200,\n\t            0x10000000: 0x8000,\n\t            0x20000000: 0x808002,\n\t            0x30000000: 0x2,\n\t            0x40000000: 0x200,\n\t            0x50000000: 0x808202,\n\t            0x60000000: 0x800202,\n\t            0x70000000: 0x800000,\n\t            0x80000000: 0x202,\n\t            0x90000000: 0x800200,\n\t            0xa0000000: 0x8200,\n\t            0xb0000000: 0x808000,\n\t            0xc0000000: 0x8002,\n\t            0xd0000000: 0x800002,\n\t            0xe0000000: 0x0,\n\t            0xf0000000: 0x8202,\n\t            0x8000000: 0x0,\n\t            0x18000000: 0x808202,\n\t            0x28000000: 0x8202,\n\t            0x38000000: 0x8000,\n\t            0x48000000: 0x808200,\n\t            0x58000000: 0x200,\n\t            0x68000000: 0x808002,\n\t            0x78000000: 0x2,\n\t            0x88000000: 0x800200,\n\t            0x98000000: 0x8200,\n\t            0xa8000000: 0x808000,\n\t            0xb8000000: 0x800202,\n\t            0xc8000000: 0x800002,\n\t            0xd8000000: 0x8002,\n\t            0xe8000000: 0x202,\n\t            0xf8000000: 0x800000,\n\t            0x1: 0x8000,\n\t            0x10000001: 0x2,\n\t            0x20000001: 0x808200,\n\t            0x30000001: 0x800000,\n\t            0x40000001: 0x808002,\n\t            0x50000001: 0x8200,\n\t            0x60000001: 0x200,\n\t            0x70000001: 0x800202,\n\t            0x80000001: 0x808202,\n\t            0x90000001: 0x808000,\n\t            0xa0000001: 0x800002,\n\t            0xb0000001: 0x8202,\n\t            0xc0000001: 0x202,\n\t            0xd0000001: 0x800200,\n\t            0xe0000001: 0x8002,\n\t            0xf0000001: 0x0,\n\t            0x8000001: 0x808202,\n\t            0x18000001: 0x808000,\n\t            0x28000001: 0x800000,\n\t            0x38000001: 0x200,\n\t            0x48000001: 0x8000,\n\t            0x58000001: 0x800002,\n\t            0x68000001: 0x2,\n\t            0x78000001: 0x8202,\n\t            0x88000001: 0x8002,\n\t            0x98000001: 0x800202,\n\t            0xa8000001: 0x202,\n\t            0xb8000001: 0x808200,\n\t            0xc8000001: 0x800200,\n\t            0xd8000001: 0x0,\n\t            0xe8000001: 0x8200,\n\t            0xf8000001: 0x808002\n\t        },\n\t        {\n\t            0x0: 0x40084010,\n\t            0x1000000: 0x4000,\n\t            0x2000000: 0x80000,\n\t            0x3000000: 0x40080010,\n\t            0x4000000: 0x40000010,\n\t            0x5000000: 0x40084000,\n\t            0x6000000: 0x40004000,\n\t            0x7000000: 0x10,\n\t            0x8000000: 0x84000,\n\t            0x9000000: 0x40004010,\n\t            0xa000000: 0x40000000,\n\t            0xb000000: 0x84010,\n\t            0xc000000: 0x80010,\n\t            0xd000000: 0x0,\n\t            0xe000000: 0x4010,\n\t            0xf000000: 0x40080000,\n\t            0x800000: 0x40004000,\n\t            0x1800000: 0x84010,\n\t            0x2800000: 0x10,\n\t            0x3800000: 0x40004010,\n\t            0x4800000: 0x40084010,\n\t            0x5800000: 0x40000000,\n\t            0x6800000: 0x80000,\n\t            0x7800000: 0x40080010,\n\t            0x8800000: 0x80010,\n\t            0x9800000: 0x0,\n\t            0xa800000: 0x4000,\n\t            0xb800000: 0x40080000,\n\t            0xc800000: 0x40000010,\n\t            0xd800000: 0x84000,\n\t            0xe800000: 0x40084000,\n\t            0xf800000: 0x4010,\n\t            0x10000000: 0x0,\n\t            0x11000000: 0x40080010,\n\t            0x12000000: 0x40004010,\n\t            0x13000000: 0x40084000,\n\t            0x14000000: 0x40080000,\n\t            0x15000000: 0x10,\n\t            0x16000000: 0x84010,\n\t            0x17000000: 0x4000,\n\t            0x18000000: 0x4010,\n\t            0x19000000: 0x80000,\n\t            0x1a000000: 0x80010,\n\t            0x1b000000: 0x40000010,\n\t            0x1c000000: 0x84000,\n\t            0x1d000000: 0x40004000,\n\t            0x1e000000: 0x40000000,\n\t            0x1f000000: 0x40084010,\n\t            0x10800000: 0x84010,\n\t            0x11800000: 0x80000,\n\t            0x12800000: 0x40080000,\n\t            0x13800000: 0x4000,\n\t            0x14800000: 0x40004000,\n\t            0x15800000: 0x40084010,\n\t            0x16800000: 0x10,\n\t            0x17800000: 0x40000000,\n\t            0x18800000: 0x40084000,\n\t            0x19800000: 0x40000010,\n\t            0x1a800000: 0x40004010,\n\t            0x1b800000: 0x80010,\n\t            0x1c800000: 0x0,\n\t            0x1d800000: 0x4010,\n\t            0x1e800000: 0x40080010,\n\t            0x1f800000: 0x84000\n\t        },\n\t        {\n\t            0x0: 0x104,\n\t            0x100000: 0x0,\n\t            0x200000: 0x4000100,\n\t            0x300000: 0x10104,\n\t            0x400000: 0x10004,\n\t            0x500000: 0x4000004,\n\t            0x600000: 0x4010104,\n\t            0x700000: 0x4010000,\n\t            0x800000: 0x4000000,\n\t            0x900000: 0x4010100,\n\t            0xa00000: 0x10100,\n\t            0xb00000: 0x4010004,\n\t            0xc00000: 0x4000104,\n\t            0xd00000: 0x10000,\n\t            0xe00000: 0x4,\n\t            0xf00000: 0x100,\n\t            0x80000: 0x4010100,\n\t            0x180000: 0x4010004,\n\t            0x280000: 0x0,\n\t            0x380000: 0x4000100,\n\t            0x480000: 0x4000004,\n\t            0x580000: 0x10000,\n\t            0x680000: 0x10004,\n\t            0x780000: 0x104,\n\t            0x880000: 0x4,\n\t            0x980000: 0x100,\n\t            0xa80000: 0x4010000,\n\t            0xb80000: 0x10104,\n\t            0xc80000: 0x10100,\n\t            0xd80000: 0x4000104,\n\t            0xe80000: 0x4010104,\n\t            0xf80000: 0x4000000,\n\t            0x1000000: 0x4010100,\n\t            0x1100000: 0x10004,\n\t            0x1200000: 0x10000,\n\t            0x1300000: 0x4000100,\n\t            0x1400000: 0x100,\n\t            0x1500000: 0x4010104,\n\t            0x1600000: 0x4000004,\n\t            0x1700000: 0x0,\n\t            0x1800000: 0x4000104,\n\t            0x1900000: 0x4000000,\n\t            0x1a00000: 0x4,\n\t            0x1b00000: 0x10100,\n\t            0x1c00000: 0x4010000,\n\t            0x1d00000: 0x104,\n\t            0x1e00000: 0x10104,\n\t            0x1f00000: 0x4010004,\n\t            0x1080000: 0x4000000,\n\t            0x1180000: 0x104,\n\t            0x1280000: 0x4010100,\n\t            0x1380000: 0x0,\n\t            0x1480000: 0x10004,\n\t            0x1580000: 0x4000100,\n\t            0x1680000: 0x100,\n\t            0x1780000: 0x4010004,\n\t            0x1880000: 0x10000,\n\t            0x1980000: 0x4010104,\n\t            0x1a80000: 0x10104,\n\t            0x1b80000: 0x4000004,\n\t            0x1c80000: 0x4000104,\n\t            0x1d80000: 0x4010000,\n\t            0x1e80000: 0x4,\n\t            0x1f80000: 0x10100\n\t        },\n\t        {\n\t            0x0: 0x80401000,\n\t            0x10000: 0x80001040,\n\t            0x20000: 0x401040,\n\t            0x30000: 0x80400000,\n\t            0x40000: 0x0,\n\t            0x50000: 0x401000,\n\t            0x60000: 0x80000040,\n\t            0x70000: 0x400040,\n\t            0x80000: 0x80000000,\n\t            0x90000: 0x400000,\n\t            0xa0000: 0x40,\n\t            0xb0000: 0x80001000,\n\t            0xc0000: 0x80400040,\n\t            0xd0000: 0x1040,\n\t            0xe0000: 0x1000,\n\t            0xf0000: 0x80401040,\n\t            0x8000: 0x80001040,\n\t            0x18000: 0x40,\n\t            0x28000: 0x80400040,\n\t            0x38000: 0x80001000,\n\t            0x48000: 0x401000,\n\t            0x58000: 0x80401040,\n\t            0x68000: 0x0,\n\t            0x78000: 0x80400000,\n\t            0x88000: 0x1000,\n\t            0x98000: 0x80401000,\n\t            0xa8000: 0x400000,\n\t            0xb8000: 0x1040,\n\t            0xc8000: 0x80000000,\n\t            0xd8000: 0x400040,\n\t            0xe8000: 0x401040,\n\t            0xf8000: 0x80000040,\n\t            0x100000: 0x400040,\n\t            0x110000: 0x401000,\n\t            0x120000: 0x80000040,\n\t            0x130000: 0x0,\n\t            0x140000: 0x1040,\n\t            0x150000: 0x80400040,\n\t            0x160000: 0x80401000,\n\t            0x170000: 0x80001040,\n\t            0x180000: 0x80401040,\n\t            0x190000: 0x80000000,\n\t            0x1a0000: 0x80400000,\n\t            0x1b0000: 0x401040,\n\t            0x1c0000: 0x80001000,\n\t            0x1d0000: 0x400000,\n\t            0x1e0000: 0x40,\n\t            0x1f0000: 0x1000,\n\t            0x108000: 0x80400000,\n\t            0x118000: 0x80401040,\n\t            0x128000: 0x0,\n\t            0x138000: 0x401000,\n\t            0x148000: 0x400040,\n\t            0x158000: 0x80000000,\n\t            0x168000: 0x80001040,\n\t            0x178000: 0x40,\n\t            0x188000: 0x80000040,\n\t            0x198000: 0x1000,\n\t            0x1a8000: 0x80001000,\n\t            0x1b8000: 0x80400040,\n\t            0x1c8000: 0x1040,\n\t            0x1d8000: 0x80401000,\n\t            0x1e8000: 0x400000,\n\t            0x1f8000: 0x401040\n\t        },\n\t        {\n\t            0x0: 0x80,\n\t            0x1000: 0x1040000,\n\t            0x2000: 0x40000,\n\t            0x3000: 0x20000000,\n\t            0x4000: 0x20040080,\n\t            0x5000: 0x1000080,\n\t            0x6000: 0x21000080,\n\t            0x7000: 0x40080,\n\t            0x8000: 0x1000000,\n\t            0x9000: 0x20040000,\n\t            0xa000: 0x20000080,\n\t            0xb000: 0x21040080,\n\t            0xc000: 0x21040000,\n\t            0xd000: 0x0,\n\t            0xe000: 0x1040080,\n\t            0xf000: 0x21000000,\n\t            0x800: 0x1040080,\n\t            0x1800: 0x21000080,\n\t            0x2800: 0x80,\n\t            0x3800: 0x1040000,\n\t            0x4800: 0x40000,\n\t            0x5800: 0x20040080,\n\t            0x6800: 0x21040000,\n\t            0x7800: 0x20000000,\n\t            0x8800: 0x20040000,\n\t            0x9800: 0x0,\n\t            0xa800: 0x21040080,\n\t            0xb800: 0x1000080,\n\t            0xc800: 0x20000080,\n\t            0xd800: 0x21000000,\n\t            0xe800: 0x1000000,\n\t            0xf800: 0x40080,\n\t            0x10000: 0x40000,\n\t            0x11000: 0x80,\n\t            0x12000: 0x20000000,\n\t            0x13000: 0x21000080,\n\t            0x14000: 0x1000080,\n\t            0x15000: 0x21040000,\n\t            0x16000: 0x20040080,\n\t            0x17000: 0x1000000,\n\t            0x18000: 0x21040080,\n\t            0x19000: 0x21000000,\n\t            0x1a000: 0x1040000,\n\t            0x1b000: 0x20040000,\n\t            0x1c000: 0x40080,\n\t            0x1d000: 0x20000080,\n\t            0x1e000: 0x0,\n\t            0x1f000: 0x1040080,\n\t            0x10800: 0x21000080,\n\t            0x11800: 0x1000000,\n\t            0x12800: 0x1040000,\n\t            0x13800: 0x20040080,\n\t            0x14800: 0x20000000,\n\t            0x15800: 0x1040080,\n\t            0x16800: 0x80,\n\t            0x17800: 0x21040000,\n\t            0x18800: 0x40080,\n\t            0x19800: 0x21040080,\n\t            0x1a800: 0x0,\n\t            0x1b800: 0x21000000,\n\t            0x1c800: 0x1000080,\n\t            0x1d800: 0x40000,\n\t            0x1e800: 0x20040000,\n\t            0x1f800: 0x20000080\n\t        },\n\t        {\n\t            0x0: 0x10000008,\n\t            0x100: 0x2000,\n\t            0x200: 0x10200000,\n\t            0x300: 0x10202008,\n\t            0x400: 0x10002000,\n\t            0x500: 0x200000,\n\t            0x600: 0x200008,\n\t            0x700: 0x10000000,\n\t            0x800: 0x0,\n\t            0x900: 0x10002008,\n\t            0xa00: 0x202000,\n\t            0xb00: 0x8,\n\t            0xc00: 0x10200008,\n\t            0xd00: 0x202008,\n\t            0xe00: 0x2008,\n\t            0xf00: 0x10202000,\n\t            0x80: 0x10200000,\n\t            0x180: 0x10202008,\n\t            0x280: 0x8,\n\t            0x380: 0x200000,\n\t            0x480: 0x202008,\n\t            0x580: 0x10000008,\n\t            0x680: 0x10002000,\n\t            0x780: 0x2008,\n\t            0x880: 0x200008,\n\t            0x980: 0x2000,\n\t            0xa80: 0x10002008,\n\t            0xb80: 0x10200008,\n\t            0xc80: 0x0,\n\t            0xd80: 0x10202000,\n\t            0xe80: 0x202000,\n\t            0xf80: 0x10000000,\n\t            0x1000: 0x10002000,\n\t            0x1100: 0x10200008,\n\t            0x1200: 0x10202008,\n\t            0x1300: 0x2008,\n\t            0x1400: 0x200000,\n\t            0x1500: 0x10000000,\n\t            0x1600: 0x10000008,\n\t            0x1700: 0x202000,\n\t            0x1800: 0x202008,\n\t            0x1900: 0x0,\n\t            0x1a00: 0x8,\n\t            0x1b00: 0x10200000,\n\t            0x1c00: 0x2000,\n\t            0x1d00: 0x10002008,\n\t            0x1e00: 0x10202000,\n\t            0x1f00: 0x200008,\n\t            0x1080: 0x8,\n\t            0x1180: 0x202000,\n\t            0x1280: 0x200000,\n\t            0x1380: 0x10000008,\n\t            0x1480: 0x10002000,\n\t            0x1580: 0x2008,\n\t            0x1680: 0x10202008,\n\t            0x1780: 0x10200000,\n\t            0x1880: 0x10202000,\n\t            0x1980: 0x10200008,\n\t            0x1a80: 0x2000,\n\t            0x1b80: 0x202008,\n\t            0x1c80: 0x200008,\n\t            0x1d80: 0x0,\n\t            0x1e80: 0x10000000,\n\t            0x1f80: 0x10002008\n\t        },\n\t        {\n\t            0x0: 0x100000,\n\t            0x10: 0x2000401,\n\t            0x20: 0x400,\n\t            0x30: 0x100401,\n\t            0x40: 0x2100401,\n\t            0x50: 0x0,\n\t            0x60: 0x1,\n\t            0x70: 0x2100001,\n\t            0x80: 0x2000400,\n\t            0x90: 0x100001,\n\t            0xa0: 0x2000001,\n\t            0xb0: 0x2100400,\n\t            0xc0: 0x2100000,\n\t            0xd0: 0x401,\n\t            0xe0: 0x100400,\n\t            0xf0: 0x2000000,\n\t            0x8: 0x2100001,\n\t            0x18: 0x0,\n\t            0x28: 0x2000401,\n\t            0x38: 0x2100400,\n\t            0x48: 0x100000,\n\t            0x58: 0x2000001,\n\t            0x68: 0x2000000,\n\t            0x78: 0x401,\n\t            0x88: 0x100401,\n\t            0x98: 0x2000400,\n\t            0xa8: 0x2100000,\n\t            0xb8: 0x100001,\n\t            0xc8: 0x400,\n\t            0xd8: 0x2100401,\n\t            0xe8: 0x1,\n\t            0xf8: 0x100400,\n\t            0x100: 0x2000000,\n\t            0x110: 0x100000,\n\t            0x120: 0x2000401,\n\t            0x130: 0x2100001,\n\t            0x140: 0x100001,\n\t            0x150: 0x2000400,\n\t            0x160: 0x2100400,\n\t            0x170: 0x100401,\n\t            0x180: 0x401,\n\t            0x190: 0x2100401,\n\t            0x1a0: 0x100400,\n\t            0x1b0: 0x1,\n\t            0x1c0: 0x0,\n\t            0x1d0: 0x2100000,\n\t            0x1e0: 0x2000001,\n\t            0x1f0: 0x400,\n\t            0x108: 0x100400,\n\t            0x118: 0x2000401,\n\t            0x128: 0x2100001,\n\t            0x138: 0x1,\n\t            0x148: 0x2000000,\n\t            0x158: 0x100000,\n\t            0x168: 0x401,\n\t            0x178: 0x2100400,\n\t            0x188: 0x2000001,\n\t            0x198: 0x2100000,\n\t            0x1a8: 0x0,\n\t            0x1b8: 0x2100401,\n\t            0x1c8: 0x100401,\n\t            0x1d8: 0x400,\n\t            0x1e8: 0x2000400,\n\t            0x1f8: 0x100001\n\t        },\n\t        {\n\t            0x0: 0x8000820,\n\t            0x1: 0x20000,\n\t            0x2: 0x8000000,\n\t            0x3: 0x20,\n\t            0x4: 0x20020,\n\t            0x5: 0x8020820,\n\t            0x6: 0x8020800,\n\t            0x7: 0x800,\n\t            0x8: 0x8020000,\n\t            0x9: 0x8000800,\n\t            0xa: 0x20800,\n\t            0xb: 0x8020020,\n\t            0xc: 0x820,\n\t            0xd: 0x0,\n\t            0xe: 0x8000020,\n\t            0xf: 0x20820,\n\t            0x80000000: 0x800,\n\t            0x80000001: 0x8020820,\n\t            0x80000002: 0x8000820,\n\t            0x80000003: 0x8000000,\n\t            0x80000004: 0x8020000,\n\t            0x80000005: 0x20800,\n\t            0x80000006: 0x20820,\n\t            0x80000007: 0x20,\n\t            0x80000008: 0x8000020,\n\t            0x80000009: 0x820,\n\t            0x8000000a: 0x20020,\n\t            0x8000000b: 0x8020800,\n\t            0x8000000c: 0x0,\n\t            0x8000000d: 0x8020020,\n\t            0x8000000e: 0x8000800,\n\t            0x8000000f: 0x20000,\n\t            0x10: 0x20820,\n\t            0x11: 0x8020800,\n\t            0x12: 0x20,\n\t            0x13: 0x800,\n\t            0x14: 0x8000800,\n\t            0x15: 0x8000020,\n\t            0x16: 0x8020020,\n\t            0x17: 0x20000,\n\t            0x18: 0x0,\n\t            0x19: 0x20020,\n\t            0x1a: 0x8020000,\n\t            0x1b: 0x8000820,\n\t            0x1c: 0x8020820,\n\t            0x1d: 0x20800,\n\t            0x1e: 0x820,\n\t            0x1f: 0x8000000,\n\t            0x80000010: 0x20000,\n\t            0x80000011: 0x800,\n\t            0x80000012: 0x8020020,\n\t            0x80000013: 0x20820,\n\t            0x80000014: 0x20,\n\t            0x80000015: 0x8020000,\n\t            0x80000016: 0x8000000,\n\t            0x80000017: 0x8000820,\n\t            0x80000018: 0x8020820,\n\t            0x80000019: 0x8000020,\n\t            0x8000001a: 0x8000800,\n\t            0x8000001b: 0x0,\n\t            0x8000001c: 0x20800,\n\t            0x8000001d: 0x820,\n\t            0x8000001e: 0x20020,\n\t            0x8000001f: 0x8020800\n\t        }\n\t    ];\n\n\t    // Masks that select the SBOX input\n\t    var SBOX_MASK = [\n\t        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t    ];\n\n\t    /**\n\t     * DES block cipher algorithm.\n\t     */\n\t    var DES = C_algo.DES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Select 56 bits according to PC1\n\t            var keyBits = [];\n\t            for (var i = 0; i < 56; i++) {\n\t                var keyBitPos = PC1[i] - 1;\n\t                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t            }\n\n\t            // Assemble 16 subkeys\n\t            var subKeys = this._subKeys = [];\n\t            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t                // Create subkey\n\t                var subKey = subKeys[nSubKey] = [];\n\n\t                // Shortcut\n\t                var bitShift = BIT_SHIFTS[nSubKey];\n\n\t                // Select 48 bits according to PC2\n\t                for (var i = 0; i < 24; i++) {\n\t                    // Select from the left 28 key bits\n\t                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t                    // Select from the right 28 key bits\n\t                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t                }\n\n\t                // Since each subkey is applied to an expanded 32-bit input,\n\t                // the subkey can be broken into 8 values scaled to 32-bits,\n\t                // which allows the key to be used without expansion\n\t                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t                for (var i = 1; i < 7; i++) {\n\t                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t                }\n\t                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t            }\n\n\t            // Compute inverse subkeys\n\t            var invSubKeys = this._invSubKeys = [];\n\t            for (var i = 0; i < 16; i++) {\n\t                invSubKeys[i] = subKeys[15 - i];\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._subKeys);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._invSubKeys);\n\t        },\n\n\t        _doCryptBlock: function (M, offset, subKeys) {\n\t            // Get input\n\t            this._lBlock = M[offset];\n\t            this._rBlock = M[offset + 1];\n\n\t            // Initial permutation\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeLR.call(this, 1,  0x55555555);\n\n\t            // Rounds\n\t            for (var round = 0; round < 16; round++) {\n\t                // Shortcuts\n\t                var subKey = subKeys[round];\n\t                var lBlock = this._lBlock;\n\t                var rBlock = this._rBlock;\n\n\t                // Feistel function\n\t                var f = 0;\n\t                for (var i = 0; i < 8; i++) {\n\t                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t                }\n\t                this._lBlock = rBlock;\n\t                this._rBlock = lBlock ^ f;\n\t            }\n\n\t            // Undo swap from last round\n\t            var t = this._lBlock;\n\t            this._lBlock = this._rBlock;\n\t            this._rBlock = t;\n\n\t            // Final permutation\n\t            exchangeLR.call(this, 1,  0x55555555);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\n\t            // Set output\n\t            M[offset] = this._lBlock;\n\t            M[offset + 1] = this._rBlock;\n\t        },\n\n\t        keySize: 64/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    // Swap bits across the left and right words\n\t    function exchangeLR(offset, mask) {\n\t        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t        this._rBlock ^= t;\n\t        this._lBlock ^= t << offset;\n\t    }\n\n\t    function exchangeRL(offset, mask) {\n\t        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t        this._lBlock ^= t;\n\t        this._rBlock ^= t << offset;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.DES = BlockCipher._createHelper(DES);\n\n\t    /**\n\t     * Triple-DES block cipher algorithm.\n\t     */\n\t    var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Create DES instances\n\t            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));\n\t            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));\n\t            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._des1.encryptBlock(M, offset);\n\t            this._des2.decryptBlock(M, offset);\n\t            this._des3.encryptBlock(M, offset);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._des3.decryptBlock(M, offset);\n\t            this._des2.encryptBlock(M, offset);\n\t            this._des1.decryptBlock(M, offset);\n\t        },\n\n\t        keySize: 192/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * RC4 stream cipher algorithm.\n\t     */\n\t    var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            var keySigBytes = key.sigBytes;\n\n\t            // Init sbox\n\t            var S = this._S = [];\n\t            for (var i = 0; i < 256; i++) {\n\t                S[i] = i;\n\t            }\n\n\t            // Key setup\n\t            for (var i = 0, j = 0; i < 256; i++) {\n\t                var keyByteIndex = i % keySigBytes;\n\t                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t                j = (j + S[i] + keyByte) % 256;\n\n\t                // Swap\n\t                var t = S[i];\n\t                S[i] = S[j];\n\t                S[j] = t;\n\t            }\n\n\t            // Counters\n\t            this._i = this._j = 0;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            M[offset] ^= generateKeystreamWord.call(this);\n\t        },\n\n\t        keySize: 256/32,\n\n\t        ivSize: 0\n\t    });\n\n\t    function generateKeystreamWord() {\n\t        // Shortcuts\n\t        var S = this._S;\n\t        var i = this._i;\n\t        var j = this._j;\n\n\t        // Generate keystream word\n\t        var keystreamWord = 0;\n\t        for (var n = 0; n < 4; n++) {\n\t            i = (i + 1) % 256;\n\t            j = (j + S[i]) % 256;\n\n\t            // Swap\n\t            var t = S[i];\n\t            S[i] = S[j];\n\t            S[j] = t;\n\n\t            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t        }\n\n\t        // Update counters\n\t        this._i = i;\n\t        this._j = j;\n\n\t        return keystreamWord;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4 = StreamCipher._createHelper(RC4);\n\n\t    /**\n\t     * Modified RC4 stream cipher algorithm.\n\t     */\n\t    var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} drop The number of keystream words to drop. Default 192\n\t         */\n\t        cfg: RC4.cfg.extend({\n\t            drop: 192\n\t        }),\n\n\t        _doReset: function () {\n\t            RC4._doReset.call(this);\n\n\t            // Drop\n\t            for (var i = this.cfg.drop; i > 0; i--) {\n\t                generateKeystreamWord.call(this);\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\t/** @preserve\n\t * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTRGladman.Decryptor = Encryptor;\n\n\t    return CTRGladman;\n\t}());\n\n\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm\n\t     */\n\t    var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t    var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = CTR.Encryptor = CTR.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            var keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Increment counter\n\t            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTR.Decryptor = Encryptor;\n\n\t    return CTR;\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm.\n\t     *\n\t     * This is a legacy version that neglected to convert the key to little-endian.\n\t     * This error doesn't affect the cipher's security,\n\t     * but it does affect its compatibility with other implementations.\n\t     */\n\t    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Shortcut\n\t        var dataWords = data.words;\n\n\t        // Unpad\n\t        var i = data.sigBytes - 1;\n\t        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t            i--;\n\t        }\n\t        data.sigBytes = i + 1;\n\t    }\n\t};\n\n\n\treturn CryptoJS;\n\n}));"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/layer/layer.js",
    "content": "﻿/*! layer-v3.0.3 Web弹层组件 MIT License  http://layer.layui.com/  By 贤心 */\n \n;!function(e,t){\"use strict\";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute(\"merge\"))return i.substring(0,i.lastIndexOf(\"/\")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],type:[\"dialog\",\"page\",\"iframe\",\"loading\",\"tips\"]},r={v:\"3.0.3\",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||\"ActiveXObject\"in e)&&((t.match(/msie\\s(\\d+)/)||[])[1]||\"11\")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,\"string\"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss(\"modules/layer/\"+e.extend):r.link(\"skin/\"+e.extend),this):this},link:function(t,n,a){if(r.path){var o=i(\"head\")[0],s=document.createElement(\"link\");\"string\"==typeof n&&(a=n);var l=(a||t).replace(/\\.|\\//g,\"\"),f=\"layuicss-\"+l,c=0;s.rel=\"stylesheet\",s.href=r.path+t,s.id=f,i(\"#\"+f)[0]||o.appendChild(s),\"function\"==typeof n&&!function u(){return++c>80?e.console&&console.error(\"layer.css: Invalid\"):void(1989===parseInt(i(\"#\"+f).css(\"width\"))?n():setTimeout(u,100))}()}},ready:function(e){var t=\"skinlayercss\",i=\"303\";return a?layui.addcss(\"modules/layer/default/layer.css?v=\"+r.v+i,e,t):r.link(\"skin/default/layer.css?v=\"+r.v+i,e,t),this},alert:function(e,t,n){var a=\"function\"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s=\"function\"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s=\"function\"==typeof n,f=o.config.skin,c=(f?f+\" \"+f+\"-msg\":\"\")||\"layui-layer-msg\",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+\" layui-layer-hui\",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+\" \"+(n.skin||\"layui-layer-hui\")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=[\"layui-layer\",\".layui-layer-title\",\".layui-layer-main\",\".layui-layer-dialog\",\"layui-layer-iframe\",\"layui-layer-content\",\"layui-layer-btn\",\"layui-layer-close\"];l.anim=[\"layer-anim\",\"layer-anim-01\",\"layer-anim-02\",\"layer-anim-03\",\"layer-anim-04\",\"layer-anim-05\",\"layer-anim-06\"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:\"&#x4FE1;&#x606F;\",offset:\"auto\",area:\"auto\",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f=\"object\"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class=\"layui-layer-title\" style=\"'+(f?r.title[1]:\"\")+'\">'+(f?r.title[0]:r.title)+\"</div>\":\"\";return r.zIndex=s,t([r.shade?'<div class=\"layui-layer-shade\" id=\"layui-layer-shade'+a+'\" times=\"'+a+'\" style=\"'+(\"z-index:\"+(s-1)+\"; background-color:\"+(r.shade[1]||\"#000\")+\"; opacity:\"+(r.shade[0]||r.shade)+\"; filter:alpha(opacity=\"+(100*r.shade[0]||100*r.shade)+\");\")+'\"></div>':\"\",'<div class=\"'+l[0]+(\" layui-layer-\"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?\"\":\" layui-layer-border\")+\" \"+(r.skin||\"\")+'\" id=\"'+l[0]+a+'\" type=\"'+o.type[r.type]+'\" times=\"'+a+'\" showtime=\"'+r.time+'\" conType=\"'+(e?\"object\":\"string\")+'\" style=\"z-index: '+s+\"; width:\"+r.area[0]+\";height:\"+r.area[1]+(r.fixed?\"\":\";position:absolute;\")+'\">'+(e&&2!=r.type?\"\":u)+'<div id=\"'+(r.id||\"\")+'\" class=\"layui-layer-content'+(0==r.type&&r.icon!==-1?\" layui-layer-padding\":\"\")+(3==r.type?\" layui-layer-loading\"+r.icon:\"\")+'\">'+(0==r.type&&r.icon!==-1?'<i class=\"layui-layer-ico layui-layer-ico'+r.icon+'\"></i>':\"\")+(1==r.type&&e?\"\":r.content||\"\")+'</div><span class=\"layui-layer-setwin\">'+function(){var e=c?'<a class=\"layui-layer-min\" href=\"javascript:;\"><cite></cite></a><a class=\"layui-layer-ico layui-layer-max\" href=\"javascript:;\"></a>':\"\";return r.closeBtn&&(e+='<a class=\"layui-layer-ico '+l[7]+\" \"+l[7]+(r.title?r.closeBtn:4==r.type?\"1\":\"2\")+'\" href=\"javascript:;\"></a>'),e}()+\"</span>\"+(r.btn?function(){var e=\"\";\"string\"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class=\"'+l[6]+t+'\">'+r.btn[t]+\"</a>\";return'<div class=\"'+l[6]+\" layui-layer-btn-\"+(r.btnAlign||\"\")+'\">'+e+\"</div>\"}():\"\")+(r.resize?'<span class=\"layui-layer-resize\"></span>':\"\")+\"</div>\"],u,i('<div class=\"layui-layer-move\"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f=\"object\"==typeof s,c=i(\"body\");if(!t.id||!i(\"#\"+t.id)[0]){switch(\"string\"==typeof t.area&&(t.area=\"auto\"===t.area?[\"\",\"\"]:[t.area,\"\"]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn=\"btn\"in t?t.btn:o.btn[0],r.closeAll(\"dialog\");break;case 2:var s=t.content=f?t.content:[t.content,\"auto\"];t.content='<iframe scrolling=\"'+(t.content[1]||\"auto\")+'\" allowtransparency=\"true\" id=\"'+l[4]+a+'\" name=\"'+l[4]+a+'\" onload=\"this.className=\\'\\';\" class=\"layui-layer-load\" frameborder=\"0\" src=\"'+t.content[0]+'\"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll(\"loading\");break;case 4:f||(t.content=[t.content,\"body\"]),t.follow=t.content[1],t.content=t.content[0]+'<i class=\"layui-layer-TipsG\"></i>',delete t.title,t.tips=\"object\"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll(\"tips\")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i(\"body\").append(n[1])}():function(){s.parents(\".\"+l[0])[0]||(s.data(\"display\",s.css(\"display\")).show().addClass(\"layui-layer-wrap\").wrap(n[1]),i(\"#\"+l[0]+a).find(\".\"+l[5]).before(r))}()}():c.append(n[1]),i(\".layui-layer-move\")[0]||c.append(o.moveElem=u),e.layero=i(\"#\"+l[0]+a),t.scrollbar||l.html.css(\"overflow\",\"hidden\").attr(\"layer-full\",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find(\"iframe\").attr(\"src\",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on(\"resize\",function(){e.offset(),(/^\\d+%$/.test(t.area[0])||/^\\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]),t.isOutAnim&&e.layero.data(\"isOutAnim\",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css(\"padding-top\"))))}var a=this,o=a.config,s=i(\"#\"+l[0]+e);\"\"===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find(\".\"+l[6]).outerHeight()||0;switch(o.type){case 2:t(\"iframe\");break;default:\"\"===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t(\".\"+l[5])):t(\".\"+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o=\"object\"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):\"auto\"!==t.offset&&(\"t\"===t.offset?e.offsetTop=0:\"r\"===t.offset?e.offsetLeft=n.width()-a[0]:\"b\"===t.offset?e.offsetTop=n.height()-a[1]:\"l\"===t.offset?e.offsetLeft=0:\"lt\"===t.offset?(e.offsetTop=0,e.offsetLeft=0):\"lb\"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):\"rt\"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):\"rb\"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr(\"minLeft\")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css(\"left\")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i(\"body\"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(\".layui-layer-TipsG\"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:\"auto\"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass(\"layui-layer-TipsB\").addClass(\"layui-layer-TipsT\").css(\"border-right-color\",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass(\"layui-layer-TipsL\").addClass(\"layui-layer-TipsR\").css(\"border-bottom-color\",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass(\"layui-layer-TipsT\").addClass(\"layui-layer-TipsB\").css(\"border-right-color\",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass(\"layui-layer-TipsR\").addClass(\"layui-layer-TipsL\").css(\"border-bottom-color\",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find(\".\"+l[5]).css({\"background-color\":t.tips[1],\"padding-right\":t.closeBtn?\"30px\":\"\"}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(\".layui-layer-resize\"),c={};return t.move&&l.css(\"cursor\",\"move\"),l.on(\"mousedown\",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css(\"left\")),e.clientY-parseFloat(s.css(\"top\"))],o.moveElem.css(\"cursor\",\"move\").show())}),f.on(\"mousedown\",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css(\"cursor\",\"se-resize\").show()}),a.on(\"mousemove\",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l=\"fixed\"===s.css(\"position\");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on(\"mouseup\",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find(\"iframe\").on(\"load\",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find(\".\"+l[6]).children(\"a\").on(\"click\",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a[\"btn\"+(e+1)]&&a[\"btn\"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find(\".\"+l[7]).on(\"click\",e),a.shadeClose&&i(\"#layui-layer-shade\"+t.index).on(\"click\",function(){r.close(t.index)}),n.find(\".layui-layer-min\").on(\"click\",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(\".layui-layer-max\").on(\"click\",function(){i(this).hasClass(\"layui-layer-maxmin\")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i(\"select\"),function(e,t){var n=i(this);n.parents(\".\"+l[0])[0]||1==n.attr(\"layer\")&&i(\".\"+l[0]).length<1&&n.removeAttr(\"layer\").show(),n=null})},s.pt.IE6=function(e){i(\"select\").each(function(e,t){var n=i(this);n.parents(\".\"+l[0])[0]||\"none\"===n.css(\"display\")||n.attr({layer:\"1\"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css(\"z-index\",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on(\"mousedown\",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css(\"margin-left\"))];e.find(\".layui-layer-max\").addClass(\"layui-layer-maxmin\"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr(\"layer-full\")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty(\"overflow\"):l.html[0].style.removeAttribute(\"overflow\"),l.html.removeAttr(\"layer-full\"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i(\".\"+l[4]).attr(\"times\"),i(\"#\"+l[0]+t).find(\"iframe\").contents().find(e)},r.getFrameIndex=function(e){return i(\"#\"+e).parents(\".\"+l[4]).attr(\"times\")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame(\"html\",e).outerHeight(),n=i(\"#\"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find(\".\"+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find(\"iframe\").css({height:t})}},r.iframeSrc=function(e,t){i(\"#\"+l[0]+e).find(\"iframe\").attr(\"src\",t)},r.style=function(e,t,n){var a=i(\"#\"+l[0]+e),r=a.find(\".layui-layer-content\"),s=a.attr(\"type\"),f=a.find(l[1]).outerHeight()||0,c=a.find(\".\"+l[6]).outerHeight()||0;a.attr(\"minLeft\");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find(\".\"+l[6]).outerHeight(),s===o.type[2]?a.find(\"iframe\").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css(\"padding-top\"))-parseFloat(r.css(\"padding-bottom\"))}))},r.min=function(e,t){var a=i(\"#\"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr(\"minLeft\")||181*o.minIndex+\"px\",c=a.css(\"position\");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr(\"position\",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:\"fixed\",overflow:\"hidden\"},!0),a.find(\".layui-layer-min\").hide(),\"page\"===a.attr(\"type\")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr(\"minLeft\")||o.minIndex++,a.attr(\"minLeft\",f)},r.restore=function(e){var t=i(\"#\"+l[0]+e),n=t.attr(\"area\").split(\",\");t.attr(\"type\");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr(\"position\"),overflow:\"visible\"},!0),t.find(\".layui-layer-max\").removeClass(\"layui-layer-maxmin\"),t.find(\".layui-layer-min\").show(),\"page\"===t.attr(\"type\")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i(\"#\"+l[0]+e);o.record(a),l.html.attr(\"layer-full\")||l.html.css(\"overflow\",\"hidden\").attr(\"layer-full\",e),clearTimeout(t),t=setTimeout(function(){var t=\"fixed\"===a.css(\"position\");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(\".layui-layer-min\").hide()},100)},r.title=function(e,t){var n=i(\"#\"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i(\"#\"+l[0]+e),n=t.attr(\"type\"),a=\"layer-anim-close\";if(t[0]){var s=\"layui-layer-wrap\",f=function(){if(n===o.type[1]&&\"object\"===t.attr(\"conType\")){t.children(\":not(.\"+l[5]+\")\").remove();for(var a=t.find(\".\"+s),r=0;r<2;r++)a.unwrap();a.css(\"display\",a.data(\"display\")).removeClass(s)}else{if(n===o.type[2])try{var f=i(\"#\"+l[4]+e)[0];f.contentWindow.document.write(\"\"),f.contentWindow.close(),t.find(\".\"+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML=\"\",t.remove()}\"function\"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data(\"isOutAnim\")&&t.addClass(a),i(\"#layui-layer-moves, #layui-layer-shade\"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr(\"minLeft\")&&(o.minIndex--,o.minLeft.push(t.attr(\"minLeft\"))),r.ie&&r.ie<10||!t.data(\"isOutAnim\")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i(\".\"+l[0]),function(){var t=i(this),n=e?t.attr(\"type\")===e:1;n&&r.close(t.attr(\"times\")),n=null})};var f=r.cache||{},c=function(e){return f.skin?\" \"+f.skin+\" \"+f.skin+\"-\"+e:\"\"};r.prompt=function(e,t){var a=\"\";if(e=e||{},\"function\"==typeof e&&(t=e),e.area){var o=e.area;a='style=\"width: '+o[0]+\"; height: \"+o[1]+';\"',delete e.area}var s,l=2==e.formType?'<textarea class=\"layui-layer-input\"'+a+\">\"+(e.value||\"\")+\"</textarea>\":function(){return'<input type=\"'+(1==e.formType?\"password\":\"text\")+'\" class=\"layui-layer-input\" value=\"'+(e.value||\"\")+'\">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],content:l,skin:\"layui-layer-prompt\"+c(\"prompt\"),maxWidth:n.width(),success:function(e){s=e.find(\".layui-layer-input\"),s.focus(),\"function\"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();\"\"===n?s.focus():n.length>(e.maxlength||500)?r.tips(\"&#x6700;&#x591A;&#x8F93;&#x5165;\"+(e.maxlength||500)+\"&#x4E2A;&#x5B57;&#x6570;\",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:\"layui-layer-tab\"+c(\"tab\"),resize:!1,title:function(){var e=t.length,i=1,n=\"\";if(e>0)for(n='<span class=\"layui-layer-tabnow\">'+t[0].title+\"</span>\";i<e;i++)n+=\"<span>\"+t[i].title+\"</span>\";return n}(),content:'<ul class=\"layui-layer-tabmain\">'+function(){var e=t.length,i=1,n=\"\";if(e>0)for(n='<li class=\"layui-layer-tabli xubox_tab_layer\">'+(t[0].content||\"no content\")+\"</li>\";i<e;i++)n+='<li class=\"layui-layer-tabli\">'+(t[i].content||\"no  content\")+\"</li>\";return n}()+\"</ul>\",success:function(t){var a=t.find(\".layui-layer-title\").children(),o=t.find(\".layui-layer-tabmain\").children();a.on(\"mousedown\",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass(\"layui-layer-tabnow\").siblings().removeClass(\"layui-layer-tabnow\"),o.eq(a).show().siblings().hide(),\"function\"==typeof e.change&&e.change(a)}),\"function\"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||\"img\";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg(\"&#x6CA1;&#x6709;&#x56FE;&#x7247;\")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr(\"layer-index\",e),u.push({alt:t.attr(\"alt\"),pid:t.attr(\"layer-pid\"),src:t.attr(\"layer-src\")||t.attr(\"src\"),thumb:t.attr(\"src\")})})};if(h(),0===u.length)return;if(n||p.on(\"click\",t.img,function(){var e=i(this),n=e.attr(\"layer-index\");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(\".layui-layer-imgprev\").on(\"click\",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(\".layui-layer-imgnext\").on(\"click\",function(e){e.preventDefault(),s.imgnext()}),i(document).on(\"keyup\",s.keyup)},s.loadi=r.load(1,{shade:!(\"shade\"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:\"layui-layer-photos\",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+\"px\",a[1]+\"px\"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:\".layui-layer-phimg img\",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:\"layui-layer-photos\"+c(\"photos\"),content:'<div class=\"layui-layer-phimg\"><img src=\"'+u[d].src+'\" alt=\"'+(u[d].alt||\"\")+'\" layer-pid=\"'+u[d].pid+'\"><div class=\"layui-layer-imgsee\">'+(u.length>1?'<span class=\"layui-layer-imguide\"><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgprev\"></a><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgnext\"></a></span>':\"\")+'<div class=\"layui-layer-imgbar\" style=\"display:'+(a?\"block\":\"\")+'\"><span class=\"layui-layer-imgtit\"><a href=\"javascript:;\">'+(u[d].alt||\"\")+\"</a><em>\"+s.imgIndex+\"/\"+u.length+\"</em></span></div></div></div>\",success:function(e,i){s.bigimg=e.find(\".layui-layer-phimg\"),s.imgsee=e.find(\".layui-layer-imguide,.layui-layer-imgbar\"),s.event(e),t.tab&&t.tab(u[d],e),\"function\"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off(\"keyup\",s.keyup)}},t))},function(){r.close(s.loadi),r.msg(\"&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;\",{time:3e4,btn:[\"&#x4E0B;&#x4E00;&#x5F20;\",\"&#x4E0D;&#x770B;&#x4E86;\"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i(\"html\"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define(\"jquery\",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t(\"layer\",r)})):\"function\"==typeof define&&define.amd?define([\"jquery\"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);\n\n//一旦设定，所有弹层风格都采用此主题。\n//layer.config({\n//  skin: 'layui-layer-molv' \n//});"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/layer/mobile/layer.js",
    "content": "/*! layer mobile-v2.0.0 Web弹层组件 MIT License  http://layer.layui.com/mobile  By 贤心 */\n ;!function(e){\"use strict\";var t=document,n=\"querySelectorAll\",i=\"getElementsByClassName\",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:\"scale\"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener(\"click\",function(e){t.call(this,e)},!1)};var r=0,o=[\"layui-m-layer\"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement(\"div\");e.id=s.id=o[0]+r,s.setAttribute(\"class\",o[0]+\" \"+o[0]+(n.type||0)),s.setAttribute(\"index\",r);var l=function(){var e=\"object\"==typeof n.title;return n.title?'<h3 style=\"'+(e?n.title[1]:\"\")+'\">'+(e?n.title[0]:n.title)+\"</h3>\":\"\"}(),c=function(){\"string\"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type=\"1\">'+n.btn[0]+\"</span>\",2===t&&(e='<span no type=\"0\">'+n.btn[1]+\"</span>\"+e),'<div class=\"layui-m-layerbtn\">'+e+\"</div>\"):\"\"}();if(n.fixed||(n.top=n.hasOwnProperty(\"top\")?n.top:100,n.style=n.style||\"\",n.style+=\" top:\"+(t.body.scrollTop+n.top)+\"px\"),2===n.type&&(n.content='<i></i><i class=\"layui-m-layerload\"></i><i></i><p>'+(n.content||\"\")+\"</p>\"),n.skin&&(n.anim=\"up\"),\"msg\"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?\"<div \"+(\"string\"==typeof n.shade?'style=\"'+n.shade+'\"':\"\")+' class=\"layui-m-layershade\"></div>':\"\")+'<div class=\"layui-m-layermain\" '+(n.fixed?\"\":'style=\"position:static;\"')+'><div class=\"layui-m-layersection\"><div class=\"layui-m-layerchild '+(n.skin?\"layui-m-layer-\"+n.skin+\" \":\"\")+(n.className?n.className:\"\")+\" \"+(n.anim?\"layui-m-anim-\"+n.anim:\"\")+'\" '+(n.style?'style=\"'+n.style+'\"':\"\")+\">\"+l+'<div class=\"layui-m-layercont\">'+n.content+\"</div>\"+c+\"</div></div></div>\",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute(\"index\"))}document.body.appendChild(s);var u=e.elem=a(\"#\"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute(\"type\");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i](\"layui-m-layerbtn\")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i](\"layui-m-layershade\")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:\"2.0\",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a(\"#\"+o[0]+e)[0];n&&(n.innerHTML=\"\",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],\"function\"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute(\"index\"))}},\"function\"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf(\"/\")+1);n.getAttribute(\"merge\")||document.head.appendChild(function(){var e=t.createElement(\"link\");return e.href=a+\"need/layer.css?2.0\",e.type=\"text/css\",e.rel=\"styleSheet\",e.id=\"layermcss\",e}())}()}(window);"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/layer/mobile/need/layer.css",
    "content": ".layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/layer/skin/default/layer.css",
    "content": ".layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layui-layer{border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/js/mqttws31-min.js",
    "content": "/*******************************************************************************\n * Copyright (c) 2013, 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution. \n *\n * The Eclipse Public License is available at \n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at \n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n *******************************************************************************/\n\n\"undefined\"===typeof Paho&&(Paho={});\nPaho.MQTT=function(t){function x(a,b,c){b[c++]=a>>8;b[c++]=a%256;return c}function r(a,b,c,h){h=x(b,c,h);E(a,c,h);return h+b}function m(a){for(var b=0,c=0;c<a.length;c++){var h=a.charCodeAt(c);2047<h?(55296<=h&&56319>=h&&(c++,b++),b+=3):127<h?b+=2:b++}return b}function E(a,b,c){for(var h=0;h<a.length;h++){var e=a.charCodeAt(h);if(55296<=e&&56319>=e){var d=a.charCodeAt(++h);if(isNaN(d))throw Error(f(g.MALFORMED_UNICODE,[e,d]));e=(e-55296<<10)+(d-56320)+65536}127>=e?b[c++]=e:(2047>=e?b[c++]=e>>6&31|\n192:(65535>=e?b[c++]=e>>12&15|224:(b[c++]=e>>18&7|240,b[c++]=e>>12&63|128),b[c++]=e>>6&63|128),b[c++]=e&63|128)}return b}function F(a,b,c){for(var h=\"\",e,d=b;d<b+c;){e=a[d++];if(!(128>e)){var p=a[d++]-128;if(0>p)throw Error(f(g.MALFORMED_UTF,[e.toString(16),p.toString(16),\"\"]));if(224>e)e=64*(e-192)+p;else{var s=a[d++]-128;if(0>s)throw Error(f(g.MALFORMED_UTF,[e.toString(16),p.toString(16),s.toString(16)]));if(240>e)e=4096*(e-224)+64*p+s;else{var l=a[d++]-128;if(0>l)throw Error(f(g.MALFORMED_UTF,\n[e.toString(16),p.toString(16),s.toString(16),l.toString(16)]));if(248>e)e=262144*(e-240)+4096*p+64*s+l;else throw Error(f(g.MALFORMED_UTF,[e.toString(16),p.toString(16),s.toString(16),l.toString(16)]));}}}65535<e&&(e-=65536,h+=String.fromCharCode(55296+(e>>10)),e=56320+(e&1023));h+=String.fromCharCode(e)}return h}var z=function(a,b){for(var c in a)if(a.hasOwnProperty(c))if(b.hasOwnProperty(c)){if(typeof a[c]!==b[c])throw Error(f(g.INVALID_TYPE,[typeof a[c],c]));}else{var h=\"Unknown property, \"+c+\n\". Valid properties are:\";for(c in b)b.hasOwnProperty(c)&&(h=h+\" \"+c);throw Error(h);}},q=function(a,b){return function(){return a.apply(b,arguments)}},g={OK:{code:0,text:\"AMQJSC0000I OK.\"},CONNECT_TIMEOUT:{code:1,text:\"AMQJSC0001E Connect timed out.\"},SUBSCRIBE_TIMEOUT:{code:2,text:\"AMQJS0002E Subscribe timed out.\"},UNSUBSCRIBE_TIMEOUT:{code:3,text:\"AMQJS0003E Unsubscribe timed out.\"},PING_TIMEOUT:{code:4,text:\"AMQJS0004E Ping timed out.\"},INTERNAL_ERROR:{code:5,text:\"AMQJS0005E Internal error. Error Message: {0}, Stack trace: {1}\"},\nCONNACK_RETURNCODE:{code:6,text:\"AMQJS0006E Bad Connack return code:{0} {1}.\"},SOCKET_ERROR:{code:7,text:\"AMQJS0007E Socket error:{0}.\"},SOCKET_CLOSE:{code:8,text:\"AMQJS0008I Socket closed.\"},MALFORMED_UTF:{code:9,text:\"AMQJS0009E Malformed UTF data:{0} {1} {2}.\"},UNSUPPORTED:{code:10,text:\"AMQJS0010E {0} is not supported by this browser.\"},INVALID_STATE:{code:11,text:\"AMQJS0011E Invalid state {0}.\"},INVALID_TYPE:{code:12,text:\"AMQJS0012E Invalid type {0} for {1}.\"},INVALID_ARGUMENT:{code:13,text:\"AMQJS0013E Invalid argument {0} for {1}.\"},\nUNSUPPORTED_OPERATION:{code:14,text:\"AMQJS0014E Unsupported operation.\"},INVALID_STORED_DATA:{code:15,text:\"AMQJS0015E Invalid data in local storage key\\x3d{0} value\\x3d{1}.\"},INVALID_MQTT_MESSAGE_TYPE:{code:16,text:\"AMQJS0016E Invalid MQTT message type {0}.\"},MALFORMED_UNICODE:{code:17,text:\"AMQJS0017E Malformed Unicode string:{0} {1}.\"}},I={0:\"Connection Accepted\",1:\"Connection Refused: unacceptable protocol version\",2:\"Connection Refused: identifier rejected\",3:\"Connection Refused: server unavailable\",\n4:\"Connection Refused: bad user name or password\",5:\"Connection Refused: not authorized\"},f=function(a,b){var c=a.text;if(b)for(var h,e,d=0;d<b.length;d++)if(h=\"{\"+d+\"}\",e=c.indexOf(h),0<e)var g=c.substring(0,e),c=c.substring(e+h.length),c=g+b[d]+c;return c},A=[0,6,77,81,73,115,100,112,3],B=[0,4,77,81,84,84,4],n=function(a,b){this.type=a;for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c])};n.prototype.encode=function(){var a=(this.type&15)<<4,b=0,c=[],h=0;void 0!=this.messageIdentifier&&(b+=2);switch(this.type){case 1:switch(this.mqttVersion){case 3:b+=\nA.length+3;break;case 4:b+=B.length+3}b+=m(this.clientId)+2;if(void 0!=this.willMessage){var b=b+(m(this.willMessage.destinationName)+2),e=this.willMessage.payloadBytes;e instanceof Uint8Array||(e=new Uint8Array(g));b+=e.byteLength+2}void 0!=this.userName&&(b+=m(this.userName)+2);void 0!=this.password&&(b+=m(this.password)+2);break;case 8:for(var a=a|2,d=0;d<this.topics.length;d++)c[d]=m(this.topics[d]),b+=c[d]+2;b+=this.requestedQos.length;break;case 10:a|=2;for(d=0;d<this.topics.length;d++)c[d]=\nm(this.topics[d]),b+=c[d]+2;break;case 6:a|=2;break;case 3:this.payloadMessage.duplicate&&(a|=8);a=a|=this.payloadMessage.qos<<1;this.payloadMessage.retained&&(a|=1);var h=m(this.payloadMessage.destinationName),g=this.payloadMessage.payloadBytes,b=b+(h+2)+g.byteLength;g instanceof ArrayBuffer?g=new Uint8Array(g):g instanceof Uint8Array||(g=new Uint8Array(g.buffer))}var f=b,d=Array(1),l=0;do{var y=f%128,f=f>>7;0<f&&(y|=128);d[l++]=y}while(0<f&&4>l);f=d.length+1;b=new ArrayBuffer(b+f);l=new Uint8Array(b);\nl[0]=a;l.set(d,1);if(3==this.type)f=r(this.payloadMessage.destinationName,h,l,f);else if(1==this.type){switch(this.mqttVersion){case 3:l.set(A,f);f+=A.length;break;case 4:l.set(B,f),f+=B.length}a=0;this.cleanSession&&(a=2);void 0!=this.willMessage&&(a=a|4|this.willMessage.qos<<3,this.willMessage.retained&&(a|=32));void 0!=this.userName&&(a|=128);void 0!=this.password&&(a|=64);l[f++]=a;f=x(this.keepAliveInterval,l,f)}void 0!=this.messageIdentifier&&(f=x(this.messageIdentifier,l,f));switch(this.type){case 1:f=\nr(this.clientId,m(this.clientId),l,f);void 0!=this.willMessage&&(f=r(this.willMessage.destinationName,m(this.willMessage.destinationName),l,f),f=x(e.byteLength,l,f),l.set(e,f),f+=e.byteLength);void 0!=this.userName&&(f=r(this.userName,m(this.userName),l,f));void 0!=this.password&&r(this.password,m(this.password),l,f);break;case 3:l.set(g,f);break;case 8:for(d=0;d<this.topics.length;d++)f=r(this.topics[d],c[d],l,f),l[f++]=this.requestedQos[d];break;case 10:for(d=0;d<this.topics.length;d++)f=r(this.topics[d],\nc[d],l,f)}return b};var G=function(a,b,c){this._client=a;this._window=b;this._keepAliveInterval=1E3*c;this.isReset=!1;var h=(new n(12)).encode(),e=function(a){return function(){return d.apply(a)}},d=function(){this.isReset?(this.isReset=!1,this._client._trace(\"Pinger.doPing\",\"send PINGREQ\"),this._client.socket.send(h),this.timeout=this._window.setTimeout(e(this),this._keepAliveInterval)):(this._client._trace(\"Pinger.doPing\",\"Timed out\"),this._client._disconnected(g.PING_TIMEOUT.code,f(g.PING_TIMEOUT)))};\nthis.reset=function(){this.isReset=!0;this._window.clearTimeout(this.timeout);0<this._keepAliveInterval&&(this.timeout=setTimeout(e(this),this._keepAliveInterval))};this.cancel=function(){this._window.clearTimeout(this.timeout)}},C=function(a,b,c,f,e){this._window=b;c||(c=30);this.timeout=setTimeout(function(a,b,c){return function(){return a.apply(b,c)}}(f,a,e),1E3*c);this.cancel=function(){this._window.clearTimeout(this.timeout)}},k=function(a,b,c,h,e){if(!(\"WebSocket\"in t&&null!==t.WebSocket))throw Error(f(g.UNSUPPORTED,\n[\"WebSocket\"]));if(!(\"localStorage\"in t&&null!==t.localStorage))throw Error(f(g.UNSUPPORTED,[\"localStorage\"]));if(!(\"ArrayBuffer\"in t&&null!==t.ArrayBuffer))throw Error(f(g.UNSUPPORTED,[\"ArrayBuffer\"]));this._trace(\"Paho.MQTT.Client\",a,b,c,h,e);this.host=b;this.port=c;this.path=h;this.uri=a;this.clientId=e;this._localKey=b+\":\"+c+(\"/mqtt\"!=h?\":\"+h:\"\")+\":\"+e+\":\";this._msg_queue=[];this._sentMessages={};this._receivedMessages={};this._notify_msg_sent={};this._message_identifier=1;this._sequence=0;for(var d in localStorage)0!=\nd.indexOf(\"Sent:\"+this._localKey)&&0!=d.indexOf(\"Received:\"+this._localKey)||this.restore(d)};k.prototype.host;k.prototype.port;k.prototype.path;k.prototype.uri;k.prototype.clientId;k.prototype.socket;k.prototype.connected=!1;k.prototype.maxMessageIdentifier=65536;k.prototype.connectOptions;k.prototype.hostIndex;k.prototype.onConnectionLost;k.prototype.onMessageDelivered;k.prototype.onMessageArrived;k.prototype.traceFunction;k.prototype._msg_queue=null;k.prototype._connectTimeout;k.prototype.sendPinger=\nnull;k.prototype.receivePinger=null;k.prototype.receiveBuffer=null;k.prototype._traceBuffer=null;k.prototype._MAX_TRACE_ENTRIES=100;k.prototype.connect=function(a){var b=this._traceMask(a,\"password\");this._trace(\"Client.connect\",b,this.socket,this.connected);if(this.connected)throw Error(f(g.INVALID_STATE,[\"already connected\"]));if(this.socket)throw Error(f(g.INVALID_STATE,[\"already connected\"]));this.connectOptions=a;a.uris?(this.hostIndex=0,this._doConnect(a.uris[0])):this._doConnect(this.uri)};\nk.prototype.subscribe=function(a,b){this._trace(\"Client.subscribe\",a,b);if(!this.connected)throw Error(f(g.INVALID_STATE,[\"not connected\"]));var c=new n(8);c.topics=[a];c.requestedQos=void 0!=b.qos?[b.qos]:[0];b.onSuccess&&(c.onSuccess=function(a){b.onSuccess({invocationContext:b.invocationContext,grantedQos:a})});b.onFailure&&(c.onFailure=function(a){b.onFailure({invocationContext:b.invocationContext,errorCode:a})});b.timeout&&(c.timeOut=new C(this,window,b.timeout,b.onFailure,[{invocationContext:b.invocationContext,\nerrorCode:g.SUBSCRIBE_TIMEOUT.code,errorMessage:f(g.SUBSCRIBE_TIMEOUT)}]));this._requires_ack(c);this._schedule_message(c)};k.prototype.unsubscribe=function(a,b){this._trace(\"Client.unsubscribe\",a,b);if(!this.connected)throw Error(f(g.INVALID_STATE,[\"not connected\"]));var c=new n(10);c.topics=[a];b.onSuccess&&(c.callback=function(){b.onSuccess({invocationContext:b.invocationContext})});b.timeout&&(c.timeOut=new C(this,window,b.timeout,b.onFailure,[{invocationContext:b.invocationContext,errorCode:g.UNSUBSCRIBE_TIMEOUT.code,\nerrorMessage:f(g.UNSUBSCRIBE_TIMEOUT)}]));this._requires_ack(c);this._schedule_message(c)};k.prototype.send=function(a){this._trace(\"Client.send\",a);if(!this.connected)throw Error(f(g.INVALID_STATE,[\"not connected\"]));wireMessage=new n(3);wireMessage.payloadMessage=a;0<a.qos?this._requires_ack(wireMessage):this.onMessageDelivered&&(this._notify_msg_sent[wireMessage]=this.onMessageDelivered(wireMessage.payloadMessage));this._schedule_message(wireMessage)};k.prototype.disconnect=function(){this._trace(\"Client.disconnect\");\nif(!this.socket)throw Error(f(g.INVALID_STATE,[\"not connecting or connected\"]));wireMessage=new n(14);this._notify_msg_sent[wireMessage]=q(this._disconnected,this);this._schedule_message(wireMessage)};k.prototype.getTraceLog=function(){if(null!==this._traceBuffer){this._trace(\"Client.getTraceLog\",new Date);this._trace(\"Client.getTraceLog in flight messages\",this._sentMessages.length);for(var a in this._sentMessages)this._trace(\"_sentMessages \",a,this._sentMessages[a]);for(a in this._receivedMessages)this._trace(\"_receivedMessages \",\na,this._receivedMessages[a]);return this._traceBuffer}};k.prototype.startTrace=function(){null===this._traceBuffer&&(this._traceBuffer=[]);this._trace(\"Client.startTrace\",new Date,\"1.0.2\")};k.prototype.stopTrace=function(){delete this._traceBuffer};k.prototype._doConnect=function(a){this.connectOptions.useSSL&&(a=a.split(\":\"),a[0]=\"wss\",a=a.join(\":\"));this.connected=!1;this.socket=4>this.connectOptions.mqttVersion?new WebSocket(a,[\"mqttv3.1\"]):new WebSocket(a,[\"mqtt\"]);this.socket.binaryType=\n\"arraybuffer\";this.socket.onopen=q(this._on_socket_open,this);this.socket.onmessage=q(this._on_socket_message,this);this.socket.onerror=q(this._on_socket_error,this);this.socket.onclose=q(this._on_socket_close,this);this.sendPinger=new G(this,window,this.connectOptions.keepAliveInterval);this.receivePinger=new G(this,window,this.connectOptions.keepAliveInterval);this._connectTimeout=new C(this,window,this.connectOptions.timeout,this._disconnected,[g.CONNECT_TIMEOUT.code,f(g.CONNECT_TIMEOUT)])};k.prototype._schedule_message=\nfunction(a){this._msg_queue.push(a);this.connected&&this._process_queue()};k.prototype.store=function(a,b){var c={type:b.type,messageIdentifier:b.messageIdentifier,version:1};switch(b.type){case 3:b.pubRecReceived&&(c.pubRecReceived=!0);c.payloadMessage={};for(var h=\"\",e=b.payloadMessage.payloadBytes,d=0;d<e.length;d++)h=15>=e[d]?h+\"0\"+e[d].toString(16):h+e[d].toString(16);c.payloadMessage.payloadHex=h;c.payloadMessage.qos=b.payloadMessage.qos;c.payloadMessage.destinationName=b.payloadMessage.destinationName;\nb.payloadMessage.duplicate&&(c.payloadMessage.duplicate=!0);b.payloadMessage.retained&&(c.payloadMessage.retained=!0);0==a.indexOf(\"Sent:\")&&(void 0===b.sequence&&(b.sequence=++this._sequence),c.sequence=b.sequence);break;default:throw Error(f(g.INVALID_STORED_DATA,[key,c]));}localStorage.setItem(a+this._localKey+b.messageIdentifier,JSON.stringify(c))};k.prototype.restore=function(a){var b=localStorage.getItem(a),c=JSON.parse(b),h=new n(c.type,c);switch(c.type){case 3:for(var b=c.payloadMessage.payloadHex,\ne=new ArrayBuffer(b.length/2),e=new Uint8Array(e),d=0;2<=b.length;){var k=parseInt(b.substring(0,2),16),b=b.substring(2,b.length);e[d++]=k}b=new Paho.MQTT.Message(e);b.qos=c.payloadMessage.qos;b.destinationName=c.payloadMessage.destinationName;c.payloadMessage.duplicate&&(b.duplicate=!0);c.payloadMessage.retained&&(b.retained=!0);h.payloadMessage=b;break;default:throw Error(f(g.INVALID_STORED_DATA,[a,b]));}0==a.indexOf(\"Sent:\"+this._localKey)?(h.payloadMessage.duplicate=!0,this._sentMessages[h.messageIdentifier]=\nh):0==a.indexOf(\"Received:\"+this._localKey)&&(this._receivedMessages[h.messageIdentifier]=h)};k.prototype._process_queue=function(){for(var a=null,b=this._msg_queue.reverse();a=b.pop();)this._socket_send(a),this._notify_msg_sent[a]&&(this._notify_msg_sent[a](),delete this._notify_msg_sent[a])};k.prototype._requires_ack=function(a){var b=Object.keys(this._sentMessages).length;if(b>this.maxMessageIdentifier)throw Error(\"Too many messages:\"+b);for(;void 0!==this._sentMessages[this._message_identifier];)this._message_identifier++;\na.messageIdentifier=this._message_identifier;this._sentMessages[a.messageIdentifier]=a;3===a.type&&this.store(\"Sent:\",a);this._message_identifier===this.maxMessageIdentifier&&(this._message_identifier=1)};k.prototype._on_socket_open=function(){var a=new n(1,this.connectOptions);a.clientId=this.clientId;this._socket_send(a)};k.prototype._on_socket_message=function(a){this._trace(\"Client._on_socket_message\",a.data);a=this._deframeMessages(a.data);for(var b=0;b<a.length;b+=1)this._handleMessage(a[b])};\nk.prototype._deframeMessages=function(a){a=new Uint8Array(a);if(this.receiveBuffer){var b=new Uint8Array(this.receiveBuffer.length+a.length);b.set(this.receiveBuffer);b.set(a,this.receiveBuffer.length);a=b;delete this.receiveBuffer}try{for(var b=0,c=[];b<a.length;){var h;a:{var e=a,d=b,k=d,s=e[d],l=s>>4,y=s&15,d=d+1,u=void 0,D=0,m=1;do{if(d==e.length){h=[null,k];break a}u=e[d++];D+=(u&127)*m;m*=128}while(0!=(u&128));u=d+D;if(u>e.length)h=[null,k];else{var v=new n(l);switch(l){case 2:e[d++]&1&&(v.sessionPresent=\n!0);v.returnCode=e[d++];break;case 3:var k=y>>1&3,r=256*e[d]+e[d+1],d=d+2,t=F(e,d,r),d=d+r;0<k&&(v.messageIdentifier=256*e[d]+e[d+1],d+=2);var q=new Paho.MQTT.Message(e.subarray(d,u));1==(y&1)&&(q.retained=!0);8==(y&8)&&(q.duplicate=!0);q.qos=k;q.destinationName=t;v.payloadMessage=q;break;case 4:case 5:case 6:case 7:case 11:v.messageIdentifier=256*e[d]+e[d+1];break;case 9:v.messageIdentifier=256*e[d]+e[d+1],d+=2,v.returnCode=e.subarray(d,u)}h=[v,u]}}var w=h[0],b=h[1];if(null!==w)c.push(w);else break}b<\na.length&&(this.receiveBuffer=a.subarray(b))}catch(x){this._disconnected(g.INTERNAL_ERROR.code,f(g.INTERNAL_ERROR,[x.message,x.stack.toString()]));return}return c};k.prototype._handleMessage=function(a){this._trace(\"Client._handleMessage\",a);try{switch(a.type){case 2:this._connectTimeout.cancel();if(this.connectOptions.cleanSession){for(var b in this._sentMessages){var c=this._sentMessages[b];localStorage.removeItem(\"Sent:\"+this._localKey+c.messageIdentifier)}this._sentMessages={};for(b in this._receivedMessages){var h=\nthis._receivedMessages[b];localStorage.removeItem(\"Received:\"+this._localKey+h.messageIdentifier)}this._receivedMessages={}}if(0===a.returnCode)this.connected=!0,this.connectOptions.uris&&(this.hostIndex=this.connectOptions.uris.length);else{this._disconnected(g.CONNACK_RETURNCODE.code,f(g.CONNACK_RETURNCODE,[a.returnCode,I[a.returnCode]]));break}a=[];for(var e in this._sentMessages)this._sentMessages.hasOwnProperty(e)&&a.push(this._sentMessages[e]);a=a.sort(function(a,b){return a.sequence-b.sequence});\ne=0;for(var d=a.length;e<d;e++)if(c=a[e],3==c.type&&c.pubRecReceived){var k=new n(6,{messageIdentifier:c.messageIdentifier});this._schedule_message(k)}else this._schedule_message(c);if(this.connectOptions.onSuccess)this.connectOptions.onSuccess({invocationContext:this.connectOptions.invocationContext});this._process_queue();break;case 3:this._receivePublish(a);break;case 4:if(c=this._sentMessages[a.messageIdentifier])if(delete this._sentMessages[a.messageIdentifier],localStorage.removeItem(\"Sent:\"+\nthis._localKey+a.messageIdentifier),this.onMessageDelivered)this.onMessageDelivered(c.payloadMessage);break;case 5:if(c=this._sentMessages[a.messageIdentifier])c.pubRecReceived=!0,k=new n(6,{messageIdentifier:a.messageIdentifier}),this.store(\"Sent:\",c),this._schedule_message(k);break;case 6:h=this._receivedMessages[a.messageIdentifier];localStorage.removeItem(\"Received:\"+this._localKey+a.messageIdentifier);h&&(this._receiveMessage(h),delete this._receivedMessages[a.messageIdentifier]);var m=new n(7,\n{messageIdentifier:a.messageIdentifier});this._schedule_message(m);break;case 7:c=this._sentMessages[a.messageIdentifier];delete this._sentMessages[a.messageIdentifier];localStorage.removeItem(\"Sent:\"+this._localKey+a.messageIdentifier);if(this.onMessageDelivered)this.onMessageDelivered(c.payloadMessage);break;case 9:if(c=this._sentMessages[a.messageIdentifier]){c.timeOut&&c.timeOut.cancel();if(128===a.returnCode[0]){if(c.onFailure)c.onFailure(a.returnCode)}else if(c.onSuccess)c.onSuccess(a.returnCode);\ndelete this._sentMessages[a.messageIdentifier]}break;case 11:if(c=this._sentMessages[a.messageIdentifier])c.timeOut&&c.timeOut.cancel(),c.callback&&c.callback(),delete this._sentMessages[a.messageIdentifier];break;case 13:this.sendPinger.reset();break;case 14:this._disconnected(g.INVALID_MQTT_MESSAGE_TYPE.code,f(g.INVALID_MQTT_MESSAGE_TYPE,[a.type]));break;default:this._disconnected(g.INVALID_MQTT_MESSAGE_TYPE.code,f(g.INVALID_MQTT_MESSAGE_TYPE,[a.type]))}}catch(l){this._disconnected(g.INTERNAL_ERROR.code,\nf(g.INTERNAL_ERROR,[l.message,l.stack.toString()]))}};k.prototype._on_socket_error=function(a){this._disconnected(g.SOCKET_ERROR.code,f(g.SOCKET_ERROR,[a.data]))};k.prototype._on_socket_close=function(){this._disconnected(g.SOCKET_CLOSE.code,f(g.SOCKET_CLOSE))};k.prototype._socket_send=function(a){if(1==a.type){var b=this._traceMask(a,\"password\");this._trace(\"Client._socket_send\",b)}else this._trace(\"Client._socket_send\",a);this.socket.send(a.encode());this.sendPinger.reset()};k.prototype._receivePublish=\nfunction(a){switch(a.payloadMessage.qos){case \"undefined\":case 0:this._receiveMessage(a);break;case 1:var b=new n(4,{messageIdentifier:a.messageIdentifier});this._schedule_message(b);this._receiveMessage(a);break;case 2:this._receivedMessages[a.messageIdentifier]=a;this.store(\"Received:\",a);a=new n(5,{messageIdentifier:a.messageIdentifier});this._schedule_message(a);break;default:throw Error(\"Invaild qos\\x3d\"+wireMmessage.payloadMessage.qos);}};k.prototype._receiveMessage=function(a){if(this.onMessageArrived)this.onMessageArrived(a.payloadMessage)};\nk.prototype._disconnected=function(a,b){this._trace(\"Client._disconnected\",a,b);this.sendPinger.cancel();this.receivePinger.cancel();this._connectTimeout&&this._connectTimeout.cancel();this._msg_queue=[];this._notify_msg_sent={};this.socket&&(this.socket.onopen=null,this.socket.onmessage=null,this.socket.onerror=null,this.socket.onclose=null,1===this.socket.readyState&&this.socket.close(),delete this.socket);if(this.connectOptions.uris&&this.hostIndex<this.connectOptions.uris.length-1)this.hostIndex++,\nthis._doConnect(this.connectOptions.uris[this.hostIndex]);else if(void 0===a&&(a=g.OK.code,b=f(g.OK)),this.connected){if(this.connected=!1,this.onConnectionLost)this.onConnectionLost({errorCode:a,errorMessage:b})}else if(4===this.connectOptions.mqttVersion&&!1===this.connectOptions.mqttVersionExplicit)this._trace(\"Failed to connect V4, dropping back to V3\"),this.connectOptions.mqttVersion=3,this.connectOptions.uris?(this.hostIndex=0,this._doConnect(this.connectOptions.uris[0])):this._doConnect(this.uri);\nelse if(this.connectOptions.onFailure)this.connectOptions.onFailure({invocationContext:this.connectOptions.invocationContext,errorCode:a,errorMessage:b})};k.prototype._trace=function(){if(this.traceFunction){for(var a in arguments)\"undefined\"!==typeof arguments[a]&&(arguments[a]=JSON.stringify(arguments[a]));a=Array.prototype.slice.call(arguments).join(\"\");this.traceFunction({severity:\"Debug\",message:a})}if(null!==this._traceBuffer){a=0;for(var b=arguments.length;a<b;a++)this._traceBuffer.length==\nthis._MAX_TRACE_ENTRIES&&this._traceBuffer.shift(),0===a?this._traceBuffer.push(arguments[a]):\"undefined\"===typeof arguments[a]?this._traceBuffer.push(arguments[a]):this._traceBuffer.push(\"  \"+JSON.stringify(arguments[a]))}};k.prototype._traceMask=function(a,b){var c={},f;for(f in a)a.hasOwnProperty(f)&&(c[f]=f==b?\"******\":a[f]);return c};var H=function(a,b,c,h){var e;if(\"string\"!==typeof a)throw Error(f(g.INVALID_TYPE,[typeof a,\"host\"]));if(2==arguments.length){h=b;e=a;var d=e.match(/^(wss?):\\/\\/((\\[(.+)\\])|([^\\/]+?))(:(\\d+))?(\\/.*)$/);\nif(d)a=d[4]||d[2],b=parseInt(d[7]),c=d[8];else throw Error(f(g.INVALID_ARGUMENT,[a,\"host\"]));}else{3==arguments.length&&(h=c,c=\"/mqtt\");if(\"number\"!==typeof b||0>b)throw Error(f(g.INVALID_TYPE,[typeof b,\"port\"]));if(\"string\"!==typeof c)throw Error(f(g.INVALID_TYPE,[typeof c,\"path\"]));e=\"ws://\"+(-1!=a.indexOf(\":\")&&\"[\"!=a.slice(0,1)&&\"]\"!=a.slice(-1)?\"[\"+a+\"]\":a)+\":\"+b+c}for(var p=d=0;p<h.length;p++){var m=h.charCodeAt(p);55296<=m&&56319>=m&&p++;d++}if(\"string\"!==typeof h||65535<d)throw Error(f(g.INVALID_ARGUMENT,\n[h,\"clientId\"]));var l=new k(e,a,b,c,h);this._getHost=function(){return a};this._setHost=function(){throw Error(f(g.UNSUPPORTED_OPERATION));};this._getPort=function(){return b};this._setPort=function(){throw Error(f(g.UNSUPPORTED_OPERATION));};this._getPath=function(){return c};this._setPath=function(){throw Error(f(g.UNSUPPORTED_OPERATION));};this._getURI=function(){return e};this._setURI=function(){throw Error(f(g.UNSUPPORTED_OPERATION));};this._getClientId=function(){return l.clientId};this._setClientId=\nfunction(){throw Error(f(g.UNSUPPORTED_OPERATION));};this._getOnConnectionLost=function(){return l.onConnectionLost};this._setOnConnectionLost=function(a){if(\"function\"===typeof a)l.onConnectionLost=a;else throw Error(f(g.INVALID_TYPE,[typeof a,\"onConnectionLost\"]));};this._getOnMessageDelivered=function(){return l.onMessageDelivered};this._setOnMessageDelivered=function(a){if(\"function\"===typeof a)l.onMessageDelivered=a;else throw Error(f(g.INVALID_TYPE,[typeof a,\"onMessageDelivered\"]));};this._getOnMessageArrived=\nfunction(){return l.onMessageArrived};this._setOnMessageArrived=function(a){if(\"function\"===typeof a)l.onMessageArrived=a;else throw Error(f(g.INVALID_TYPE,[typeof a,\"onMessageArrived\"]));};this._getTrace=function(){return l.traceFunction};this._setTrace=function(a){if(\"function\"===typeof a)l.traceFunction=a;else throw Error(f(g.INVALID_TYPE,[typeof a,\"onTrace\"]));};this.connect=function(a){a=a||{};z(a,{timeout:\"number\",userName:\"string\",password:\"string\",willMessage:\"object\",keepAliveInterval:\"number\",\ncleanSession:\"boolean\",useSSL:\"boolean\",invocationContext:\"object\",onSuccess:\"function\",onFailure:\"function\",hosts:\"object\",ports:\"object\",mqttVersion:\"number\",mqttVersionExplicit:\"boolean\",uris:\"object\"});void 0===a.keepAliveInterval&&(a.keepAliveInterval=60);if(4<a.mqttVersion||3>a.mqttVersion)throw Error(f(g.INVALID_ARGUMENT,[a.mqttVersion,\"connectOptions.mqttVersion\"]));void 0===a.mqttVersion?(a.mqttVersionExplicit=!1,a.mqttVersion=4):a.mqttVersionExplicit=!0;if(void 0!==a.password&&void 0===\na.userName)throw Error(f(g.INVALID_ARGUMENT,[a.password,\"connectOptions.password\"]));if(a.willMessage){if(!(a.willMessage instanceof w))throw Error(f(g.INVALID_TYPE,[a.willMessage,\"connectOptions.willMessage\"]));a.willMessage.stringPayload;if(\"undefined\"===typeof a.willMessage.destinationName)throw Error(f(g.INVALID_TYPE,[typeof a.willMessage.destinationName,\"connectOptions.willMessage.destinationName\"]));}\"undefined\"===typeof a.cleanSession&&(a.cleanSession=!0);if(a.hosts){if(!(a.hosts instanceof\nArray))throw Error(f(g.INVALID_ARGUMENT,[a.hosts,\"connectOptions.hosts\"]));if(1>a.hosts.length)throw Error(f(g.INVALID_ARGUMENT,[a.hosts,\"connectOptions.hosts\"]));for(var b=!1,d=0;d<a.hosts.length;d++){if(\"string\"!==typeof a.hosts[d])throw Error(f(g.INVALID_TYPE,[typeof a.hosts[d],\"connectOptions.hosts[\"+d+\"]\"]));if(/^(wss?):\\/\\/((\\[(.+)\\])|([^\\/]+?))(:(\\d+))?(\\/.*)$/.test(a.hosts[d]))if(0==d)b=!0;else{if(!b)throw Error(f(g.INVALID_ARGUMENT,[a.hosts[d],\"connectOptions.hosts[\"+d+\"]\"]));}else if(b)throw Error(f(g.INVALID_ARGUMENT,\n[a.hosts[d],\"connectOptions.hosts[\"+d+\"]\"]));}if(b)a.uris=a.hosts;else{if(!a.ports)throw Error(f(g.INVALID_ARGUMENT,[a.ports,\"connectOptions.ports\"]));if(!(a.ports instanceof Array))throw Error(f(g.INVALID_ARGUMENT,[a.ports,\"connectOptions.ports\"]));if(a.hosts.length!=a.ports.length)throw Error(f(g.INVALID_ARGUMENT,[a.ports,\"connectOptions.ports\"]));a.uris=[];for(d=0;d<a.hosts.length;d++){if(\"number\"!==typeof a.ports[d]||0>a.ports[d])throw Error(f(g.INVALID_TYPE,[typeof a.ports[d],\"connectOptions.ports[\"+\nd+\"]\"]));var b=a.hosts[d],h=a.ports[d];e=\"ws://\"+(-1!=b.indexOf(\":\")?\"[\"+b+\"]\":b)+\":\"+h+c;a.uris.push(e)}}}l.connect(a)};this.subscribe=function(a,b){if(\"string\"!==typeof a)throw Error(\"Invalid argument:\"+a);b=b||{};z(b,{qos:\"number\",invocationContext:\"object\",onSuccess:\"function\",onFailure:\"function\",timeout:\"number\"});if(b.timeout&&!b.onFailure)throw Error(\"subscribeOptions.timeout specified with no onFailure callback.\");if(\"undefined\"!==typeof b.qos&&0!==b.qos&&1!==b.qos&&2!==b.qos)throw Error(f(g.INVALID_ARGUMENT,\n[b.qos,\"subscribeOptions.qos\"]));l.subscribe(a,b)};this.unsubscribe=function(a,b){if(\"string\"!==typeof a)throw Error(\"Invalid argument:\"+a);b=b||{};z(b,{invocationContext:\"object\",onSuccess:\"function\",onFailure:\"function\",timeout:\"number\"});if(b.timeout&&!b.onFailure)throw Error(\"unsubscribeOptions.timeout specified with no onFailure callback.\");l.unsubscribe(a,b)};this.send=function(a,b,c,d){var e;if(0==arguments.length)throw Error(\"Invalid argument.length\");if(1==arguments.length){if(!(a instanceof\nw)&&\"string\"!==typeof a)throw Error(\"Invalid argument:\"+typeof a);e=a;if(\"undefined\"===typeof e.destinationName)throw Error(f(g.INVALID_ARGUMENT,[e.destinationName,\"Message.destinationName\"]));}else e=new w(b),e.destinationName=a,3<=arguments.length&&(e.qos=c),4<=arguments.length&&(e.retained=d);l.send(e)};this.disconnect=function(){l.disconnect()};this.getTraceLog=function(){return l.getTraceLog()};this.startTrace=function(){l.startTrace()};this.stopTrace=function(){l.stopTrace()};this.isConnected=\nfunction(){return l.connected}};H.prototype={get host(){return this._getHost()},set host(a){this._setHost(a)},get port(){return this._getPort()},set port(a){this._setPort(a)},get path(){return this._getPath()},set path(a){this._setPath(a)},get clientId(){return this._getClientId()},set clientId(a){this._setClientId(a)},get onConnectionLost(){return this._getOnConnectionLost()},set onConnectionLost(a){this._setOnConnectionLost(a)},get onMessageDelivered(){return this._getOnMessageDelivered()},set onMessageDelivered(a){this._setOnMessageDelivered(a)},\nget onMessageArrived(){return this._getOnMessageArrived()},set onMessageArrived(a){this._setOnMessageArrived(a)},get trace(){return this._getTrace()},set trace(a){this._setTrace(a)}};var w=function(a){var b;if(\"string\"===typeof a||a instanceof ArrayBuffer||a instanceof Int8Array||a instanceof Uint8Array||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array)b=a;else throw f(g.INVALID_ARGUMENT,[a,\"newPayload\"]);\nthis._getPayloadString=function(){return\"string\"===typeof b?b:F(b,0,b.length)};this._getPayloadBytes=function(){if(\"string\"===typeof b){var a=new ArrayBuffer(m(b)),a=new Uint8Array(a);E(b,a,0);return a}return b};var c=void 0;this._getDestinationName=function(){return c};this._setDestinationName=function(a){if(\"string\"===typeof a)c=a;else throw Error(f(g.INVALID_ARGUMENT,[a,\"newDestinationName\"]));};var h=0;this._getQos=function(){return h};this._setQos=function(a){if(0===a||1===a||2===a)h=a;else throw Error(\"Invalid argument:\"+\na);};var e=!1;this._getRetained=function(){return e};this._setRetained=function(a){if(\"boolean\"===typeof a)e=a;else throw Error(f(g.INVALID_ARGUMENT,[a,\"newRetained\"]));};var d=!1;this._getDuplicate=function(){return d};this._setDuplicate=function(a){d=a}};w.prototype={get payloadString(){return this._getPayloadString()},get payloadBytes(){return this._getPayloadBytes()},get destinationName(){return this._getDestinationName()},set destinationName(a){this._setDestinationName(a)},get qos(){return this._getQos()},\nset qos(a){this._setQos(a)},get retained(){return this._getRetained()},set retained(a){this._setRetained(a)},get duplicate(){return this._getDuplicate()},set duplicate(a){this._setDuplicate(a)}};return{Client:H,Message:w}}(window);"
  },
  {
    "path": "SpringCloud-MQTT/src/main/webapp/WEB-INF/jsp/mqtt_client.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=utf-8\"\n\tpageEncoding=\"utf-8\"%>\n<!DOCTYPE>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<title>Insert title here</title>\n<script type=\"text/javascript\" src=\"/js/jquery-1.11.0.min.js\"></script>\n<script\n\tsrc=\"https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js\"\n\ttype=\"text/javascript\"></script>\n<script type=\"text/javascript\">\n\tvar imclient;\n\tvar topic = 'PTP/test';\n\t\n\t//  连接的是ws 协议的 端口。非mqtt端口，默认端口使用61614\n\t// var hostname = '192.168.206.210';\n\tvar port = 6164;\n\n\tvar conTimes = 0;\n\n\t//失去连接后 2S 再次连接\n\tvar reconnectTimeout = 2000;\n\n\t//mqtt ------ start ------\n\t//mqtt\n\tfunction initMQTT() {\n\t\tvar clientId = \"gourpId@@@ClientID_SYSTEM\" + Date.parse(new Date());\n\t\tvar username = 'admin';\n\t\tvar password = 'admin123';\n\n\t\timclient = new Paho.MQTT.Client(hostname, port, clientId);\n\t\toptions = {\n\t\t\ttimeout : 3,\n\t\t\t// useSSL: useTLS,  \n\t\t\tcleanSession : true,\n\t\t\tonSuccess : onConnect,\n\t\t\tonFailure : function(message) {\n\t\t\t\tsetTimeout(initMQTT, reconnectTimeout);\n\t\t\t}\n\t\t};\n\n\t\timclient.onConnectionLost = onConnectionLost;\n\t\timclient.onMessageArrived = onMessageArrived;\n\n\t\tif (username != null) {\n\t\t\toptions.userName = username;\n\t\t\toptions.password = password;\n\t\t}\n\t\timclient.connect(options);\n\t}\n\n\t//连接监听\n\tfunction onConnect() {\n\t\t// Connection succeeded; subscribe to our topic  \n\t\timclient.subscribe(topic, {\n\t\t\tqos : 0\n\t\t});\n\t\t//$('#topic').val(topic);  \n\t\tconsole.log('Connection success!');\n\t}\n\n\t// 失去连接\n\tfunction onConnectionLost(response) {\n\t\t//$('#status').val(\"connection lost: \" + response.errorMessage + \". Reconnecting\");  \n\n\t\tif (response.errorCode !== 0) {\n\t\t\tconsole.log(\"onConnectionLost:\" + response.errorMessage);\n\t\t}\n\n\t\t//setTimeout(initMQTT, reconnectTimeout);\n\t};\n\n\t//消息到达\n\tfunction onMessageArrived(message) {\n\t\t//var topic = message.destinationName;  \n\t\tvar payload = message.payloadString;\n\t\tconsole.log(payload);\n\t\tvar srcMsg = $('#resiveMsg').html();\n\t\tif(srcMsg){\n\t\t\tsrcMsg = srcMsg + ';<br>' + payload\n\t\t}else{\n\t\t\tsrcMsg = payload;\n\t\t}\n\t\t$('#resiveMsg').html(srcMsg);\n\t};\n\n\tfunction sendMessage() {\n\t\tvar message = $('#message').val();\n\t\tvar msg = new Paho.MQTT.Message(message);\n\t\tmsg.destinationName = topic;\n\t\timclient.send(msg);\n\t}\n\n\t$(document).ready(function() {\n\t\tinitMQTT();\n\t});\n\t// mqtt ----- end -------\n</script>\n</head>\n<body>\n\t<div>\n\t\t<div>\n\t\t\t输入发送消息：<input id=\"message\">\n\t\t</div>\n\t\t<div>\n\t\t\t<input type=\"button\" value=\"发送\" onclick=\"sendMessage()\">\n\t\t</div>\n\t</div>\n\t<div>\n\t\t<div id=\"resiveMsg\"></div>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "SpringCloud-Mybatis/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Mybatis</artifactId>\n\n    <properties>\n        <spring.version>4.2.1.RELEASE</spring.version>\n        <java.version>1.8</java.version>\n        <logback.version>1.1.7</logback.version>\n        <slf4j.version>1.7.5</slf4j.version>\n        <jackson_version>2.3.3</jackson_version>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>org.mybatis.generator</groupId>\n            <artifactId>mybatis-generator-core</artifactId>\n            <version>1.3.2</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis</artifactId>\n            <version>3.5.6</version>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis-spring</artifactId>\n            <version>1.2.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.16.18</version>\n            <optional>true</optional>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.1</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <encoding>${project.build.sourceEncoding}</encoding>\n                    <fork>true</fork>\n                    <meminitial>128m</meminitial>\n                    <maxmem>256m</maxmem>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <groupId>org.mybatis.generator</groupId>\n                <artifactId>mybatis-generator-maven-plugin</artifactId>\n                <version>1.3.2</version>\n                <configuration>\n                    <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>\n                    <verbose>true</verbose>\n                    <overwrite>true</overwrite>\n                </configuration>\n                <dependencies>\n                    <dependency>\n                        <groupId>mysql</groupId>\n                        <artifactId>mysql-connector-java</artifactId>\n                        <version>8.0.28</version>\n                    </dependency>\n                    <dependency>\n                        <groupId>com.purcotton</groupId>\n                        <version>0.0.1</version>\n                        <artifactId>purcotton-mybatis-generator</artifactId>\n                    </dependency>\n                </dependencies>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Mybatis/src/main/java/com/xiao/springcloud/mybatis/generator/plugin/LombokPlugin.java",
    "content": "package com.xiao.springcloud.mybatis.generator.plugin;\n\nimport org.mybatis.generator.api.IntrospectedColumn;\nimport org.mybatis.generator.api.IntrospectedTable;\nimport org.mybatis.generator.api.PluginAdapter;\nimport org.mybatis.generator.api.dom.java.Field;\nimport org.mybatis.generator.api.dom.java.Interface;\nimport org.mybatis.generator.api.dom.java.Method;\nimport org.mybatis.generator.api.dom.java.TopLevelClass;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.List;\n\npublic class LombokPlugin extends PluginAdapter\n{\n\n    @Override\n    public boolean validate(List<String> list)\n    {\n        return true;\n    }\n\n    @Override\n    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable)\n    {\n        //添加domain的import\n        topLevelClass.addImportedType(\"lombok.Data\");\n        topLevelClass.addImportedType(\"lombok.Builder\");\n        topLevelClass.addImportedType(\"lombok.NoArgsConstructor\");\n        topLevelClass.addImportedType(\"lombok.AllArgsConstructor\");\n\n        //添加domain的注解\n        topLevelClass.addAnnotation(\"@Data\");\n        topLevelClass.addAnnotation(\"@Builder\");\n        topLevelClass.addAnnotation(\"@NoArgsConstructor\");\n        topLevelClass.addAnnotation(\"@AllArgsConstructor\");\n\n        //添加domain的注释\n        topLevelClass.addJavaDocLine(\"/**\");\n        topLevelClass.addJavaDocLine(\"* Created by Mybatis Generator on \" + date2Str(new Date()));\n        topLevelClass.addJavaDocLine(\"*/\");\n        return true;\n    }\n\n    @Override\n    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass,\n            IntrospectedTable introspectedTable)\n    {\n        //Mapper文件的注释\n        interfaze.addJavaDocLine(\"/**\");\n        interfaze.addJavaDocLine(\"* Created by Mybatis Generator on \" + date2Str(new Date()));\n        interfaze.addJavaDocLine(\"*/\");\n        return true;\n    }\n\n    @Override\n    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass,\n            IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType)\n    {\n        //不生成getter\n        return false;\n    }\n\n    @Override\n    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass,\n            IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType)\n    {\n        //不生成setter\n        return false;\n    }\n\n    @Override\n    public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn,\n            IntrospectedTable introspectedTable, ModelClassType modelClassType)\n    {\n        field.addJavaDocLine(\"//\" + introspectedColumn.getRemarks());\n        return true;\n    }\n\n    private String date2Str(Date date)\n    {\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy/MM/dd\");\n        return sdf.format(date);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Mybatis/src/main/resources/generatorConfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE generatorConfiguration PUBLIC \"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd\">\n<generatorConfiguration>\n    <!-- 数据库驱动包位置 -->\n    <!-- mvn mybatis-generator:generate -->\n    <context id=\"mysqlTables\" targetRuntime=\"MyBatis3\">\n        <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->\n        <property name=\"javaFileEncoding\" value=\"UTF-8\"/>\n        <!-- 这里的type里写的是你的实现类的类全路径 -->\n        <plugin type=\"com.xiao.springcloud.mybatis.generator.plugin.LombokPlugin\">\n            <property name=\"hasLombok\" value=\"true\"/>\n        </plugin>\n        <commentGenerator>\n            <property name=\"suppressDate\" value=\"true\"/>\n            <property name=\"suppressAllComments\" value=\"true\"/>\n        </commentGenerator>\n        <!-- 数据库链接URL、用户名、密码 -->\n        <jdbcConnection driverClass=\"com.mysql.jdbc.Driver\"\n                        connectionURL=\"jdbcurl\"\n                        userId=\"username\"\n                        password=\"password\">\n        </jdbcConnection>\n        <javaTypeResolver>\n            <property name=\"forceBigDecimals\" value=\"false\"/>\n        </javaTypeResolver>\n        <!-- 生成实体类的包名和位置，这里配置将生成的实体类放在me.gacl.domain这个包下 -->\n        <javaModelGenerator targetPackage=\"pagecke.name\"\n                            targetProject=\"src\\main\\java\">\n            <property name=\"enableSubPackages\" value=\"true\"/>\n            <property name=\"trimStrings\" value=\"true\"/>\n        </javaModelGenerator>\n        <!-- 生成的SQL映射文件包名和位置，这里配置将生成的SQL映射文件放在me.gacl.mapping这个包下 -->\n        <sqlMapGenerator targetPackage=\"pagecke.name\"\n                         targetProject=\"src\\main\\resources\">\n            <property name=\"enableSubPackages\" value=\"true\"/>\n        </sqlMapGenerator>\n        <!-- 生成DAO的包名和位置，这里配置将生成的dao类放在me.gacl.dao这个包下 -->\n        <javaClientGenerator type=\"XMLMAPPER\"\n                             targetPackage=\"pagecke.name\" targetProject=\"src\\main\\java\">\n            <property name=\"enableSubPackages\" value=\"true\"/>\n        </javaClientGenerator>\n\n        <!-- 表对应实体类，多个表多个table标签 -->\n        <table tableName=\"t_brand\" domainObjectName=\"BrandEntity\"\n               enableCountByExample=\"false\" enableUpdateByExample=\"false\"\n               enableDeleteByExample=\"false\" enableSelectByExample=\"false\"\n               selectByExampleQueryId=\"false\"/>\n    </context>\n</generatorConfiguration>"
  },
  {
    "path": "SpringCloud-Provider/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n    <modelVersion>4.0.0</modelVersion>\r\n    <parent>\r\n        <groupId>com.xiao.skywalking.demo</groupId>\r\n        <artifactId>SpringCloud-Demo</artifactId>\r\n        <version>0.0.1-SNAPSHOT</version>\r\n    </parent>\r\n    <artifactId>SpringCloud-Provider</artifactId>\r\n\r\n    <dependencies>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-eureka</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-web</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-test</artifactId>\r\n            <scope>test</scope>\r\n        </dependency>\r\n\r\n        <!-- zipkin服务跟踪 -->\r\n        <!--<dependency>-->\r\n            <!--<groupId>org.springframework.cloud</groupId>-->\r\n            <!--<artifactId>spring-cloud-starter-zipkin</artifactId>-->\r\n        <!--</dependency>-->\r\n\r\n        <!-- zipkin服务 改造 sleuth stream + zipkin  + es + kafka -->\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-stream-binder-kafka</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-sleuth-stream</artifactId>\r\n        </dependency>\r\n\r\n        <!--guava本地缓存cache-->\r\n        <dependency>\r\n            <groupId>com.google.guava</groupId>\r\n            <artifactId>guava</artifactId>\r\n            <version>29.0-jre</version>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-cache</artifactId>\r\n        </dependency>\r\n\r\n        <!-- springboot-admin 1.5.6版本集合使用 -->\r\n        <!-- 监控数据 -->\r\n        <dependency>\r\n            <groupId>de.codecentric</groupId>\r\n            <artifactId>spring-boot-admin-starter-client</artifactId>\r\n            <version>1.5.6</version>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-actuator</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.jolokia</groupId>\r\n            <artifactId>jolokia-core</artifactId>\r\n        </dependency>\r\n\r\n    </dependencies>\r\n\r\n    <build>\r\n        <finalName>${artifactId}</finalName>\r\n        <resources>\r\n            <resource>\r\n                <targetPath>${project.build.directory}/classes</targetPath>\r\n                <directory>src/main/resources</directory>\r\n                <filtering>true</filtering>\r\n                <includes>\r\n                    <include>**/*.xml</include>\r\n                    <include>**/*.yml</include>\r\n                    <include>**/*.properties</include>\r\n                    <include>META-INF/**</include>\r\n                </includes>\r\n            </resource>\r\n        </resources>\r\n        <plugins>\r\n            <plugin>\r\n                <groupId>org.springframework.boot</groupId>\r\n                <artifactId>spring-boot-maven-plugin</artifactId>\r\n            </plugin>\r\n        </plugins>\r\n    </build>\r\n</project>"
  },
  {
    "path": "SpringCloud-Provider/src/main/java/com/xiao/skywalking/provider/ProviderApp.java",
    "content": "/*\r\n * Winner\r\n * 文件名  :ProviderApp.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n */\r\n\r\npackage com.xiao.skywalking.provider;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cache.annotation.EnableCaching;\r\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@SpringBootApplication\r\n// @EnableEurekaClient 表明自己是一个eurekaclient\r\n@EnableEurekaClient\r\n//开启springboot-cache\r\n@EnableCaching\r\npublic class ProviderApp\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(ProviderApp.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Provider/src/main/java/com/xiao/skywalking/provider/controller/SkywalkingController.java",
    "content": "/*\r\n * Winner\r\n * 文件名  :SkywalkingController.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年3月30日\r\n */\r\n\r\npackage com.xiao.skywalking.provider.controller;\r\n\r\nimport org.springframework.cache.annotation.Cacheable;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\nimport org.springframework.web.bind.annotation.RestController;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年3月30日\r\n */\r\n@RestController\r\npublic class SkywalkingController\r\n{\r\n\r\n    @RequestMapping(path = \"/skywalking\")\r\n    // cacheable注解，一般建议放在service层\r\n    @Cacheable(value = \"skywalking\", key = \"'skywalking'.concat({#hello})\", sync = true)\r\n    public String skywalking(@RequestParam(\"hello\") String hello)\r\n    {\r\n        return hello;\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-Provider/src/main/java/com/xiao/skywalking/provider/local/cache/SpringGuavaCacheConfig.java",
    "content": "package com.xiao.skywalking.provider.local.cache;\n\nimport com.google.common.cache.CacheBuilder;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.guava.GuavaCacheManager;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]: guava+springcache实现本地缓存\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/9/29 17:28\n * @since JDK 1.8\n */\n@Configuration\npublic class SpringGuavaCacheConfig\n{\n    @Bean\n    public CacheManager cacheManager()\n    {\n        GuavaCacheManager cacheManager = new GuavaCacheManager();\n        cacheManager\n                // 3S过期时间，初始容量1000个，最大10000个\n                .setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(3, TimeUnit.SECONDS).initialCapacity(1000)\n                        .maximumSize(10000));\n        return cacheManager;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Provider/src/main/resources/application.yml",
    "content": "#注册中心\r\neureka:\r\n  client:\r\n    serviceUrl:\r\n      defaultZone: http://localhost:1111/eureka/\r\nserver: \r\n  port: 1112\r\n\r\n#服务名称\r\nspring:\r\n  application:\r\n    name: provider-1112\r\n#  #服务链路跟踪到zipkin服务\r\n#  zipkin:\r\n#    base-url: http://localhost:1115\r\n  ##  zipkin 链路跟踪配置\r\n  sleuth:\r\n    enabled: true\r\n    #采样率，越高会有性能影响\r\n    sampler:\r\n      percentage: 1.0\r\n  cloud:\r\n    ## kafka zk配置 配合zipkin\r\n    stream:\r\n      kafka:\r\n        binder:\r\n          brokers: 192.168.206.203:9092\r\n          zkNodes: 192.168.206.203:2181\r\n  #springboot-admin 1.5.6集成使用\r\n  boot:\r\n    admin:\r\n      auto-registration: true\r\n      # springboot admin的地址\r\n      url: http://localhost:8080\r\n      api-path: instances\r\n      client:\r\n        prefer-ip: true\r\n#不使用鉴权\r\nmanagement:\r\n  security:\r\n    enabled: false"
  },
  {
    "path": "SpringCloud-Quartz-JobService/README.md",
    "content": "**SpringCloud + Quartz 实现任务调度，可配置，可通过API操作**\n\n1. 实现思路:<br>\n   主要是通过``SchedulerFactoryBean``将Quartz 集成到spring容器中,然后开放API，注册到eureka上<br>\n   [参考文章1](https://blog.csdn.net/pengjunlee/article/details/78965877)<br>\n   [参考文章2](https://blog.csdn.net/beliefer/article/details/51578546)<br>\n2. TaskSchedulerFactory 用于接入quartz到spring容器中<br>\n   JobConfig 初始化SchedulerFactoryBean和Scheduler<br>\n   JobManager 动态添加、删除、停止、恢复定时任务 <br>\n   ServiceTaskExecuteJob 主要业务逻辑实现，可在该实现类中调用定时调用远程方法 <br>\n   "
  },
  {
    "path": "SpringCloud-Quartz-JobService/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Quartz-JobService</artifactId>\n\n    <properties>\n        <quartz.version>2.3.2</quartz.version>\n        <jackson.version>2.13.4.1</jackson.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.6</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.quartz-scheduler</groupId>\n            <artifactId>quartz</artifactId>\n            <version>${quartz.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-cache</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.curator</groupId>\n            <artifactId>curator-framework</artifactId>\n            <version>2.8.0</version>\n        </dependency>\n\n        <!-- fast json -->\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.5.13</version>\n        </dependency>\n\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.dataformat</groupId>\n            <artifactId>jackson-dataformat-xml</artifactId>\n            <version>${jackson.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.datatype</groupId>\n            <artifactId>jackson-datatype-jsr310</artifactId>\n            <version>${jackson.version}</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/JobServiceApplication.java",
    "content": "package com.xiao.springcloud.job;\n\nimport org.springframework.boot.SpringApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/10 11:10\n * @since JDK 1.8\n */\npublic class JobServiceApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(JobServiceApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/config/JobConfig.java",
    "content": "package com.xiao.springcloud.job.config;\n\nimport org.quartz.Scheduler;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.quartz.SchedulerFactoryBean;\n\n@Configuration\npublic class JobConfig\n{\n\n    @Autowired\n    private TaskSchedulerFactory taskSchedulerFactory;\n\n    @Bean\n    public SchedulerFactoryBean schedulerFactoryBean()\n    {\n        SchedulerFactoryBean bean = new SchedulerFactoryBean();\n        bean.setJobFactory(taskSchedulerFactory);\n        return bean;\n    }\n\n    @Bean\n    public Scheduler scheduler()\n    {\n        return schedulerFactoryBean().getScheduler();\n    }\n\n//    @Bean\n//    public HttpClient httpClient()\n//    {\n//        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();\n//        return httpClientBuilder.build();\n//    }\n//\n//    @Bean\n//    public ClientHttpRequestFactory clientHttpRequestFactory()\n//    {\n//        return new HttpComponentsClientHttpRequestFactory(httpClient());\n//    }\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/config/TaskSchedulerFactory.java",
    "content": "package com.xiao.springcloud.job.config;\n\nimport org.quartz.spi.TriggerFiredBundle;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.config.AutowireCapableBeanFactory;\nimport org.springframework.scheduling.quartz.AdaptableJobFactory;\nimport org.springframework.stereotype.Component;\n\n/**\n * 自定义的 TaskSchedulerFactory\n * @Date: 2018/11/2 16:08\n * @Description:\n */\n@Component\npublic class TaskSchedulerFactory extends AdaptableJobFactory\n{\n\n    /**\n     * 需要使用这个BeanFactory对Qurartz创建好Job实例进行后续处理.\n     */\n    @Autowired\n    private AutowireCapableBeanFactory capableBeanFactory;\n\n    @Override\n    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception\n    {\n        // 首先，调用父类的方法创建好Quartz所需的Job实例\n        Object jobInstance = super.createJobInstance(bundle);\n        // 然后，使用BeanFactory为创建好的Job实例进行属性自动装配并将其纳入到Spring容器的管理之中，属于Spring的技术范畴.\n        capableBeanFactory.autowireBean(jobInstance);\n        return jobInstance;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/entity/TaskConfigDocument.java",
    "content": "package com.xiao.springcloud.job.entity;\n\nimport lombok.Data;\nimport lombok.ToString;\n\n@Data\n@ToString\npublic class TaskConfigDocument\n{\n\n\tprivate String id;\n\n\n\t/** 任务说明 **/\n\tprivate String description;\n\n\t/** 是否锁定(0:否;1:是) **/\n\tprivate Integer isLock = 0;\n\n\n\t/** 任务名称 **/\n\tprivate String name;\n\n\t/** 任务执行URL **/\n\tprivate String url;\n\n\t/** 模块 ModelEnum定义 **/\n\tprivate String module;\n\n\t/**\n\t * 运行状态: 0 停止 1运行 2删除\n\t */\n\tprivate Integer status;\n\n\t/** 创建人 **/\n\tprivate String creator;\n\n\t/** 创建时间 **/\n\tprivate String createTime;\n\n\t/** 更新时间 **/\n\tprivate String updateTime;\n\n\t/** 最后更新人 **/\n\tprivate String updater;\n\n\t/** 运行频次 **/\n\tprivate String cronExp;\n\n\t/** 是否自动启动：0否 1是 **/\n\n\tprivate Integer autoStart;\n\n\t/** 最新启动时间：启动时候设置**/\n\n\tprivate String latestStartTime;\n\n\t/** 最后运行时间：停止时候设置**/\n\tprivate String lastRunTime;\n \n\n}"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/job/ServiceTaskExecuteJob.java",
    "content": "package com.xiao.springcloud.job.job;\n\nimport com.xiao.springcloud.job.entity.TaskConfigDocument;\nimport com.xiao.springcloud.job.quartz.JobManager;\nimport org.quartz.*;\n\n/**\n * [简要描述]: 具体任务实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/12/10 11:53\n * @since JDK 1.8\n */\npublic class ServiceTaskExecuteJob implements Job\n{\n    /**\n     * <p>\n     * Called by the <code>{@link Scheduler}</code> when a <code>{@link Trigger}</code>\n     * fires that is associated with the <code>Job</code>.\n     * </p>\n     *\n     * <p>\n     * The implementation may wish to set a\n     * {@link JobExecutionContext#setResult(Object) result} object on the\n     * {@link JobExecutionContext} before this method exits.  The result itself\n     * is meaningless to Quartz, but may be informative to\n     * <code>{@link JobListener}s</code> or\n     * <code>{@link TriggerListener}s</code> that are watching the job's\n     * execution.\n     * </p>\n     *\n     * @param context\n     * @exception JobExecutionException if there is an exception while executing the job.\n     */\n    @Override\n    public void execute(JobExecutionContext context) throws JobExecutionException\n    {\n        TaskConfigDocument task = (TaskConfigDocument) context.getMergedJobDataMap().get(JobManager.JOB_KEY);\n        // 具体业务逻辑\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/quartz/JobManager.java",
    "content": "package com.xiao.springcloud.job.quartz;\n\nimport com.xiao.springcloud.job.entity.TaskConfigDocument;\nimport com.xiao.springcloud.job.job.ServiceTaskExecuteJob;\nimport com.xiao.springcloud.job.util.CronExpUtil;\nimport org.quartz.*;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.scheduling.quartz.SchedulerFactoryBean;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]:任务管理<br/>\n * [详细描述]:<br/>\n * llxiao  2018/12/10 - 13:47\n **/\n@Service\npublic class JobManager implements InitializingBean\n{\n\n    public static final String JOB_KEY = \"SCHEDULED_JOB\";\n\n    private static Logger logger = LoggerFactory.getLogger(JobManager.class);\n\n    @Autowired\n    private SchedulerFactoryBean schedulerFactoryBean;\n\n    /**\n     * 添加任务\n     *\n     * @param task\n     */\n    public void addJob(TaskConfigDocument task)\n    {\n        boolean cronExp = CronExpUtil.validator(task.getCronExp());\n        if (cronExp)\n        {\n            try\n            {\n                Scheduler scheduler = schedulerFactoryBean.getScheduler();\n                logger.info(\"add job \" + task.getName());\n                TriggerKey triggerKey = TriggerKey.triggerKey(task.getName(), task.getModule());\n                CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);\n\n                if (trigger == null)\n                {\n                    JobDetail jobDetail = JobBuilder.newJob(ServiceTaskExecuteJob.class)\n                            .withIdentity(task.getName(), task.getModule()).build();\n                    jobDetail.getJobDataMap().put(JOB_KEY, task);\n                    //表达式调度构建器\n                    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(task.getCronExp());\n                    //按新的cronExpression表达式构建一个新的trigger\n                    trigger = TriggerBuilder.newTrigger().withIdentity(task.getName(), task.getModule())\n                            .withSchedule(scheduleBuilder).build();\n                    scheduler.scheduleJob(jobDetail, trigger);\n                }\n                else\n                {\n                    //if (!trigger.getCronExpression().equals(task.getCronExp())) {\n                    // Trigger已存在，那么更新相应的定时设置\n                    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(task.getCronExp());\n                    // 按新的cronExpression表达式重新构建trigger\n                    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder)\n                            .build();\n                    // 按新的trigger重新设置job执行\n                    scheduler.rescheduleJob(triggerKey, trigger);\n\n                }\n                logger.info(\"add job \" + task.getName() + \" finished\");\n\n            }\n            catch (Exception e)\n            {\n                logger.error(\"add job '{}' error: {}\", task.getName(), e.getMessage());\n                throw new RuntimeException(e);\n            }\n        }\n        else\n        {\n            // 表达式非法或者已过期 直接停止or删除\n            this.pauseJob(task);\n            //            this.deleteJob(task);\n        }\n\n    }\n\n    /**\n     * 停止任务\n     *\n     * @param task\n     */\n    public void pauseJob(TaskConfigDocument task)\n    {\n        try\n        {\n            logger.info(\"stop job \" + task.getName());\n            Scheduler scheduler = schedulerFactoryBean.getScheduler();\n            JobKey jobKey = JobKey.jobKey(task.getName(), task.getModule());\n            scheduler.pauseJob(jobKey);\n            logger.info(\"stop job \" + task.getName() + \" finished\");\n        }\n        catch (SchedulerException e)\n        {\n            throw new RuntimeException(e);\n        }\n    }\n\n    /**\n     * 恢复任务\n     *\n     * @param task\n     */\n    public void resumeJob(TaskConfigDocument task)\n    {\n\n        try\n        {\n            Scheduler scheduler = schedulerFactoryBean.getScheduler();\n            JobKey jobKey = JobKey.jobKey(task.getName(), task.getModule());\n            scheduler.resumeJob(jobKey);\n        }\n        catch (Exception e)\n        {\n            throw new RuntimeException(e);\n        }\n    }\n\n    /**\n     * 删除任务\n     *\n     * @param task\n     */\n    public void deleteJob(TaskConfigDocument task)\n    {\n        try\n        {\n            Scheduler scheduler = schedulerFactoryBean.getScheduler();\n            JobKey jobKey = JobKey.jobKey(task.getName(), task.getModule());\n            scheduler.deleteJob(jobKey);\n        }\n        catch (Exception e)\n        {\n            throw new RuntimeException(e);\n        }\n    }\n\n    /**\n     * 立即执行\n     *\n     * @param task\n     */\n    public void runNow(TaskConfigDocument task)\n    {\n        try\n        {\n            Scheduler scheduler = schedulerFactoryBean.getScheduler();\n            JobKey jobKey = JobKey.jobKey(task.getName(), task.getModule());\n            scheduler.triggerJob(jobKey);\n        }\n        catch (Exception e)\n        {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public void afterPropertiesSet() throws Exception\n    {\n        // 系统启动读取所有待启动的，然后执行启动任务\n        //读取所有的taskConfig addJob\n        //        addJob(task);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/java/com/xiao/springcloud/job/util/CronExpUtil.java",
    "content": "package com.xiao.springcloud.job.util;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.quartz.CronExpression;\nimport org.quartz.CronTrigger;\nimport org.quartz.impl.triggers.CronTriggerImpl;\n\nimport java.text.ParseException;\nimport java.util.Date;\n\n/**\n * [简要描述]: quartz表达式校验\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/7/2 18:52\n * @since JDK 1.8\n */\npublic class CronExpUtil\n{\n    /**\n     * [简要描述]:Quartz 表达式校验<br/>\n     * [详细描述]:<br/>\n     * 1. 校验表达式格式</p>\n     * 2. 校验表达式合法性，以及是否可用</p>\n     *\n     * @param cronExp :\n     * @return boolean\n     * llxiao  2019/7/2 - 18:53\n     **/\n    public static boolean validator(String cronExp)\n    {\n        boolean flag = false;\n        if (StringUtils.isNotEmpty(cronExp))\n        {\n            // 校验表达式的格式是否正确\n            flag = CronExpression.isValidExpression(cronExp);\n            if (flag)\n            {\n                CronTrigger cronTrigger = new CronTriggerImpl();\n                try\n                {\n                    // 校验 表达式是否有效。比如过期的，失效的等\n                    ((CronTriggerImpl) cronTrigger).setCronExpression(cronExp);\n                    Date date = ((CronTriggerImpl) cronTrigger).computeFirstFireTime(null);\n                    flag = date != null && date.after(new Date());\n                }\n                catch (ParseException e)\n                {\n                    flag = false;\n                }\n            }\n        }\n        return flag;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/resources/application.yml",
    "content": "server:\n  port: 6666"
  },
  {
    "path": "SpringCloud-Quartz-JobService/src/main/resources/bootstrap.yml",
    "content": "spring:\n  #配置中心\n  #cloud:\n    #config:\n      #uri:\n      #profile: @env@\n      #label: master\n      #name: job-servcie\n  application:\n    name: job-servcie\n\n"
  },
  {
    "path": "SpringCloud-Redisson/README.md",
    "content": "spring data 集成redisson，使用redisTemplate<br>\n参考[Redisson官方文档](https://github.com/redisson/redisson/tree/master/redisson-spring-data)"
  },
  {
    "path": "SpringCloud-Redisson/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.purcotton.cache</groupId>\n    <artifactId>redisson-test</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.9.RELEASE</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.redisson</groupId>\n            <artifactId>redisson-spring-data-18</artifactId>\n            <version>3.10.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.redisson</groupId>\n            <artifactId>redisson</artifactId>\n            <version>3.10.0</version>\n        </dependency>\n\n    </dependencies>\n\n</project>"
  },
  {
    "path": "SpringCloud-Redisson/src/main/java/com/xiao/spring/cloud/redisson/SpringDataRedissonApplication.java",
    "content": "package com.xiao.spring.cloud.redisson;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/19 09:48\n * @since JDK 1.8\n */\n@SpringBootApplication\npublic class SpringDataRedissonApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(SpringDataRedissonApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Redisson/src/main/java/com/xiao/spring/cloud/redisson/config/SpringDataRedissonConfig.java",
    "content": "package com.xiao.spring.cloud.redisson.config;\n\nimport org.redisson.Redisson;\nimport org.redisson.api.RedissonClient;\nimport org.redisson.config.Config;\nimport org.redisson.spring.data.connection.RedissonConnectionFactory;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.Resource;\nimport org.springframework.data.redis.core.RedisTemplate;\n\nimport java.io.IOException;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/19 09:48\n * @since JDK 1.8\n */\n@Configuration\npublic class SpringDataRedissonConfig\n{\n    @Bean\n    public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson)\n    {\n        return new RedissonConnectionFactory(redisson);\n    }\n\n    @Bean(destroyMethod = \"shutdown\")\n    public RedissonClient redisson(@Value(\"classpath:/redisson.yml\") Resource configFile) throws IOException\n    {\n        Config config = Config.fromYAML(configFile.getInputStream());\n        return Redisson.create(config);\n    }\n\n    @Bean\n    public RedisTemplate redisTemplate(RedissonConnectionFactory redissonConnectionFactory)\n    {\n        RedisTemplate redisTemplate = new RedisTemplate();\n        redisTemplate.setConnectionFactory(redissonConnectionFactory);\n        // 自定义的各种序列化\n        //        redisTemplate.setKeySerializer(stringRedisSerializer);\n        //        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);\n        //        redisTemplate.setHashKeySerializer(stringRedisSerializer);\n        //        redisTemplate.setHashValueSerializer(stringRedisSerializer);\n        return redisTemplate;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Redisson/src/main/resources/application.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Redisson/src/main/resources/redisson.yml",
    "content": "# 线程池数量，默认值: 当前处理核数量 * 2\n##threads: 0\n# Netty线程池数量，默认值: 当前处理核数量 * 2\n##nettyThreads: 0\n# Redisson的对象编码类是用于将对象进行序列化和反序列化，默认：JsonJacksonCodec\n##codec: !<org.redisson.codec.JsonJacksonCodec> {}\n#  传输模式 默认NIO\n# 可选参数：\n# TransportMode.NIO,\n# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包（Linux）\n# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包（macOS）\n##transportMode: \"NIO\"\n# 监控锁的看门狗超时，单位：毫秒，默认3000ms.该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况\n##lockWatchdogTimeout: 3000\n# 保持订阅发布顺序\n##keepPubSubOrder: true\n# 单节点模式\nsingleServerConfig:\n  idleConnectionTimeout: 10000\n  pingTimeout: 1000\n  connectTimeout: 10000\n  timeout: 3000\n  retryAttempts: 3\n  retryInterval: 1500\n  reconnectionTimeout: 3000\n  failedAttempts: 3\n  subscriptionsPerConnection: 5\n  subscriptionConnectionMinimumIdleSize: 1\n  subscriptionConnectionPoolSize: 50\n  connectionMinimumIdleSize: 4\n  connectionPoolSize: 8\n  database: 12\n  address: redis://192.168.206.204:6379\n  dnsMonitoringInterval: 5000\n"
  },
  {
    "path": "SpringCloud-Redisson/src/test/java/com/xiao/spring/cloud/redisson/SpringDataRedissonApplicationTest.java",
    "content": "package com.xiao.spring.cloud.redisson;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.dao.DataAccessException;\nimport org.springframework.data.redis.connection.RedisConnection;\nimport org.springframework.data.redis.core.RedisCallback;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.serializer.RedisSerializer;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/1/19 09:50\n * @since JDK 1.8\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class SpringDataRedissonApplicationTest\n{\n    @Autowired\n    private RedisTemplate redisTemplate;\n\n    @Test\n    public void testSimple()\n    {\n        redisTemplate.opsForValue().set(\"test\", \"test11111\");\n        //        System.out.println(redisTemplate.opsForValue().get(\"test\"));\n        Assert.assertEquals(\"Spring data 集成Redisson测试失败!\", \"test11111\", redisTemplate.opsForValue().get(\"test\"));\n    }\n\n    @Test\n    public void testBatch()\n    {\n        RedisSerializer keySer = redisTemplate.getKeySerializer();\n        RedisSerializer valueSer = redisTemplate.getValueSerializer();\n        RedisSerializer hashKeySer = redisTemplate.getHashKeySerializer();\n        RedisSerializer hasValSer = redisTemplate.getHashValueSerializer();\n\n        // 不带返回值使用pipeline  关键是使用第三个参数 pipeline\n        redisTemplate.execute(redisConnection ->\n        {\n            redisConnection.set(keySer.serialize(\"test\"), valueSer.serialize(\"hello pipeline\"));\n            return null;\n        }, true, true);\n\n        // 带返回值的\n        List<String> list = redisTemplate.executePipelined((RedisCallback<String>) redisConnection ->\n        {\n            byte[] value = redisConnection.get(keySer.serialize(\"test\"));\n            return (String) valueSer.deserialize(value);\n        });\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-SearchService</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n        <!-- 配置中心 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-config</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n\n        <!-- logstash -->\n        <dependency>\n            <groupId>net.logstash.logback</groupId>\n            <artifactId>logstash-logback-encoder</artifactId>\n            <version>4.11</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.danielwegener</groupId>\n            <artifactId>logback-kafka-appender</artifactId>\n            <version>0.1.0</version>\n            <scope>runtime</scope>\n        </dependency>\n\n        <!-- fastjson -->\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>fastjson</artifactId>\n            <version>1.2.83</version>\n        </dependency>\n\n        <!-- es and depence -->\n        <dependency>\n            <groupId>org.elasticsearch.client</groupId>\n            <artifactId>transport</artifactId>\n            <version>${elasticsearch.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.logging.log4j</groupId>\n            <artifactId>log4j-api</artifactId>\n            <version>2.17.1</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.logging.log4j</groupId>\n            <artifactId>log4j-core</artifactId>\n            <version>2.17.1</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.6</version>\n        </dependency>\n\n        <!--guava缓存cache-->\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <version>29.0-jre</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-cache</artifactId>\n        </dependency>\n\n        <!--工具类 -->\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-core</artifactId>\n            <version>4.1.12</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xiao.skywalking.demo</groupId>\n            <artifactId>SpringCloud-Common</artifactId>\n            <version>0.0.1-SNAPSHOT</version>\n        </dependency>\n\n        <!-- test -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-all</artifactId>\n            <version>1.10.19</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/SearchApplication.java",
    "content": "package com.xiao.spring.cloud.search;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\n\n/**\n * [简要描述]:主启动类\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 15:07\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableEurekaClient\npublic class SearchApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(SearchApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/ElasticSearchDoc.java",
    "content": "/*\n * Winner\n * 文件名  :ElasticSearchDoc.java\n * 创建人  :llxiao\n * 创建时间:2018年1月11日\n */\n\npackage com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:Elastic search 存储文档<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月11日\n * @since Purcotton-Search B01\n */\n@Data\npublic class ElasticSearchDoc\n{\n    /**\n     * 文档id\n     */\n    private String id;\n\n    /**\n     * 关键字（商品表的卖点+货品表的商品标题+货品表的规格）\n     */\n    private String keyWords;\n\n    /**\n     * 商品全局唯一SPU\n     */\n    private String commodityNo;\n\n    /**\n     * 商品业务SPU编码\n     */\n    private String commodityCode;\n\n    /**\n     * 默认SKU编号(全局唯一)\n     */\n    private String defProdNo;\n\n    /**\n     * 默认SKU业务编码\n     */\n    private String defProdCode;\n\n    /**\n     * 品牌编号\n     */\n    private String brandNo;\n\n    /**\n     * 品牌名称\n     */\n    private String brandName;\n\n    /**\n     * 标题,商品标题，SKU名称\n     */\n    private String title;\n\n    /**\n     * 子标题（卖点）\n     */\n    private String subTitle;\n\n    private String skuTitle;\n\n    /**\n     * 扩展属性(JSON列表存储(组-名称-值))\n     */\n    private String extProps;\n\n    /**\n     * JSON列表存储(SKU规格属性)\n     */\n    private String skuProps;\n\n    /**\n     * 产地\n     */\n    private String productArea;\n\n    /**\n     * 牌价\n     */\n    private Double orgPrice;\n\n    /**\n     * 售价(售价由调价刷新)\n     */\n    private Double salePrice;\n\n    /**\n     * 商品运营分类编号（多个用逗号隔开）\n     */\n    private String oprtCatNo;\n\n    /**\n     * 运营分类名称(以\"-\"隔开，多个以\",\"隔开)\n     */\n    private String oprtCatName;\n\n    /**\n     * 标签集合\n     * JSON列表存储(名称-颜色)\n     */\n    private String labels;\n\n    /**\n     * 上架时间\n     */\n    private Date saleTime;\n\n    /**\n     * 商品首图\n     */\n    private String picUrl;\n\n    /**\n     * 库存(库存定时刷新)\n     */\n    private Long stock;\n\n    /**\n     * 是否海淘(0否，1是)\n     */\n    private Integer haitao;\n\n    /**\n     * 销量\n     */\n    private Long salesVolume;\n\n    /**\n     * 索引名称/或店铺名称\n     */\n    private String index;\n\n    //*****************************以下是预留字段****************************\n\n    /**\n     * 商品分类编号\n     */\n    private String commoCatNo;\n\n    /**\n     * 新品 1新品，0默认\n     */\n    private Integer newly = 0;\n\n    /**\n     * 评论数量\n     */\n    private Integer comments;\n\n    /**\n     * 活动属性 折扣信息\n     */\n    private String discountRate;\n\n    //****************************用来聚合的字段***********************************\n    //保存三级分类\n    private String categoryName;\n\n    //JSON列表存储\n    private String defSkuProp;\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/PaginationDo.java",
    "content": "/*\n * Winner\n * 文件名  :PaginationDo.java\n * 创建人  :llxiao\n * 创建时间:2018年1月12日\n */\n\npackage com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * [简要描述]:查询结果实体类<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月12日\n * @since Purcotton-Search B01\n */\n@Data\npublic class PaginationDo\n{\n    /**\n     * 查询数据结果\n     */\n    private List<SearchResultDo> results;\n\n    /**\n     * 总数\n     */\n    private int total;\n\n    /**\n     * 页显示数量\n     */\n    private int pageSize;\n\n    /**\n     * 当前页数\n     */\n    private int pageNo;\n\n    /**\n     * 查询所用时间(单位:毫秒)\n     */\n    private long took;\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchBrandDo.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: ES品牌\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-28 15:06\n * @since JDK 1.8\n */\n@Data\npublic class SearchBrandDo\n{\n    /**\n     * 品牌编号\n     */\n    private String brandNo;\n\n    /**\n     * 品牌名称\n     */\n    private String brandName;\n\n    /**\n     * 品牌图片URL\n     */\n    private String brandUrl;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchCategoryDo.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: 分类\n * [详细描述]: 聚合菜单使用\n *\n * @author mjye\n * @version 1.0, 2019-03-02 14:29\n * @since JDK 1.8\n */\n@Data\npublic class SearchCategoryDo\n{\n    private String categoryName;\n\n    private String categoryNo;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchCommoPropOptionDto.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]: 商品详情页规格\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-23 16:45\n * @since JDK 1.8\n */\n@Data\npublic class SearchCommoPropOptionDto\n{\n\n    //属性选项编号\n    private String optionNo;\n\n    //属性选项值名称\n    private String optionNoName;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchCommodityPropertyDo.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.Set;\n\n/**\n * [简要描述]: ES商品属性\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-23 14:45\n * @since JDK 1.8\n */\n@Data\npublic class SearchCommodityPropertyDo\n{\n    //属性编码\n    private String propertyNo;\n\n    //属性名称(颜色、尺码等)\n    private String propertyName;\n\n    //属性选项\n    private Set<SearchCommoPropOptionDto> setList;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchCommodityResultDo.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 查询商品返回组装结果\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-03-01 14:17\n * @since JDK 1.8\n */\n@Data\npublic class SearchCommodityResultDo\n{\n    private List<ElasticSearchDoc> commodityList;\n\n    /**\n     * 总数\n     */\n    private int total;\n\n    /**\n     * 页显示数量\n     */\n    private int pageSize;\n\n    /**\n     * 当前页数\n     */\n    private int pageNo;\n\n    /**\n     * 总页数\n     */\n    private int pageTotal;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchLogDo.java",
    "content": "/*\n * Winner \n * 文件名  :SearchLogDo.java\n * 创建人  :llxiao\n * 创建时间:2018年2月23日\n*/\n\npackage com.xiao.spring.cloud.search.dto;\n\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\n\nimport java.time.LocalDateTime;\n\n/**\n * [简要描述]:搜索日志数据<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月23日\n * @since Purcotton-Search B01\n */\npublic class SearchLogDo\n{\n    /**\n     * 正常搜索\n     */\n    public static final int SUCCESS_SEARCH = 0;\n\n    /**\n     * 没有结果的搜索\n     */\n    public static final int NOT_RESULT_SEARCH = 1;\n\n    /**\n     * 错误的搜索\n     */\n    public static final int ERROR_RESULT_SEARCH = 2;\n\n    /**\n     * 未分词\n     */\n    public static final int UN_PARTICIPLE = 0;\n\n    /**\n     * IK_SMART分词\n     */\n    public static final int IK_SMART = 1;\n\n    /**\n     * IK_MAX_WORD分词\n     */\n    public static final int IK_MAX_WORD = 2;\n\n    /**\n     * ES默认分词，全拆\n     */\n    public static final int ES_DEFAULT = 3;\n\n    /**\n     * 主键\n     */\n    private Long id;\n\n    /**\n     * 搜索关键字\n     */\n    private String keyWords;\n\n    /**\n     * 分词关键字\n     */\n    private String participle;\n\n    /**\n     * 分词状态，0未分词1标准分词2普通分词\n     */\n    private int participleStats;\n\n    /**\n     * 搜索查询语句\n     */\n    private String searchQueryDSL;\n\n    /**\n     * 搜索返回结果\n     */\n    private String result;\n\n    /**\n     * 搜索状态0成功1失败\n     */\n    private int searchStats;\n\n    /**\n     * 搜索开始时间\n     */\n    private LocalDateTime startTime;\n\n    /**\n     * 搜索结束时间\n     */\n    private LocalDateTime endTime;\n\n    /**\n     * 搜索花费时间\n     */\n    private Long costTime;\n\n    /**\n     * 异常信息\n     */\n    private String exceptionMsg;\n\n    /**\n     * 请求参数\n     */\n    private String request;\n\n    /**\n     * 返回id属性\n     * \n     * @return id属性\n     */\n    public Long getId()\n    {\n        return id;\n    }\n\n    /**\n     * 设置id属性\n     * \n     * @param id\n     *            id属性\n     */\n    public void setId(Long id)\n    {\n        this.id = id;\n    }\n\n    /**\n     * 返回keyWords属性\n     * \n     * @return keyWords属性\n     */\n    public String getKeyWords()\n    {\n        return keyWords;\n    }\n\n    /**\n     * 设置keyWords属性\n     * \n     * @param keyWords\n     *            keyWords属性\n     */\n    public void setKeyWords(String keyWords)\n    {\n        this.keyWords = keyWords;\n    }\n\n    /**\n     * 返回result属性\n     * \n     * @return result属性\n     */\n    public String getResult()\n    {\n        return result;\n    }\n\n    /**\n     * 设置result属性\n     * \n     * @param result\n     *            result属性\n     */\n    public void setResult(String result)\n    {\n        this.result = result;\n    }\n\n    /**\n     * 返回searchStats属性\n     * \n     * @return searchStats属性\n     */\n    public int getSearchStats()\n    {\n        return searchStats;\n    }\n\n    /**\n     * 设置searchStats属性\n     * \n     * @param searchStats\n     *            searchStats属性\n     */\n    public void setSearchStats(int searchStats)\n    {\n        this.searchStats = searchStats;\n    }\n\n    /**\n     * 返回startTime属性\n     * \n     * @return startTime属性\n     */\n    public LocalDateTime getStartTime()\n    {\n        return startTime;\n    }\n\n    /**\n     * 设置startTime属性\n     * \n     * @param startTime\n     *            startTime属性\n     */\n    public void setStartTime(LocalDateTime startTime)\n    {\n        this.startTime = startTime;\n    }\n\n    /**\n     * 返回endTime属性\n     * \n     * @return endTime属性\n     */\n    public LocalDateTime getEndTime()\n    {\n        return endTime;\n    }\n\n    /**\n     * 设置endTime属性\n     * \n     * @param endTime\n     *            endTime属性\n     */\n    public void setEndTime(LocalDateTime endTime)\n    {\n        this.endTime = endTime;\n    }\n\n    /**\n     * 返回costTime属性\n     * \n     * @return costTime属性\n     */\n    public Long getCostTime()\n    {\n        return costTime;\n    }\n\n    /**\n     * 设置costTime属性\n     * \n     * @param costTime\n     *            costTime属性\n     */\n    public void setCostTime(Long costTime)\n    {\n        this.costTime = costTime;\n    }\n\n    /**\n     * 返回searchQueryDSL属性\n     * \n     * @return searchQueryDSL属性\n     */\n    public String getSearchQueryDSL()\n    {\n        return searchQueryDSL;\n    }\n\n    /**\n     * 设置searchQueryDSL属性\n     * \n     * @param searchQueryDSL\n     *            searchQueryDSL属性\n     */\n    public void setSearchQueryDSL(String searchQueryDSL)\n    {\n        this.searchQueryDSL = searchQueryDSL;\n    }\n\n    /**\n     * 返回exceptionMsg属性\n     * \n     * @return exceptionMsg属性\n     */\n    public String getExceptionMsg()\n    {\n        return exceptionMsg;\n    }\n\n    /**\n     * 设置exceptionMsg属性\n     * \n     * @param exceptionMsg\n     *            exceptionMsg属性\n     */\n    public void setExceptionMsg(String exceptionMsg)\n    {\n        this.exceptionMsg = exceptionMsg;\n    }\n\n    /**\n     * 返回request属性\n     * \n     * @return request属性\n     */\n    public String getRequest()\n    {\n        return request;\n    }\n\n    /**\n     * 设置request属性\n     * \n     * @param request\n     *            request属性\n     */\n    public void setRequest(String request)\n    {\n        this.request = request;\n    }\n\n    /**\n     * 返回participle属性\n     * \n     * @return participle属性\n     */\n    public String getParticiple()\n    {\n        return participle;\n    }\n\n    /**\n     * 设置participle属性\n     * \n     * @param participle\n     *            participle属性\n     */\n    public void setParticiple(String participle)\n    {\n        this.participle = participle;\n    }\n\n    /**\n     * 返回participleStats属性\n     * \n     * @return participleStats属性\n     */\n    public int getParticipleStats()\n    {\n        return participleStats;\n    }\n\n    /**\n     * 设置participleStats属性\n     * \n     * @param participleStats\n     *            participleStats属性\n     */\n    public void setParticipleStats(int participleStats)\n    {\n        this.participleStats = participleStats;\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     * \n     * @author llxiao\n     * @return\n     * @see\n     *      Object#toString()\n     */\n    @Override\n    public String toString()\n    {\n\n        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchMenusDo.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * [简要描述]:C端筛选聚合菜单\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-23 10:46\n * @since JDK 1.8\n */\n@Data\npublic class SearchMenusDo\n{\n    /**\n     * 品牌\n     **/\n    private Set<SearchBrandDo> brandName;\n\n    /**\n     * 运营分类\n     */\n    private Set<SearchCategoryDo> oprtCatName;\n\n    /**\n     * 价格区间\n     */\n    private List<ShopPriceRangeDto> price;\n\n    /**\n     * SKU规格属性\n     */\n    private Set<SearchCommodityPropertyDo> skuProps;\n\n    /**\n     * 商品扩展属性\n     */\n    private Set<SearchCommodityPropertyDo> extProps;\n\n    /**\n     * 查询所用时间(单位:毫秒)\n     */\n    private long took;\n\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchRequestDo.java",
    "content": "/*\n * Winner\n * 文件名  :SearchRequestDo.java\n * 创建人  :llxiao\n * 创建时间:2018年1月15日\n */\n\npackage com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * [简要描述]:请求查询接口参数<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月15日\n * @since Purcotton-Search B01\n */\n@Data\npublic class SearchRequestDo\n{\n    /**\n     * 关键字\n     */\n    private String keyWords;\n\n    /**\n     * 页数，默认1\n     */\n    private Integer pageNo = 1;\n\n    /**\n     * 也显示条数 10条\n     */\n    private Integer pageSize = 10;\n\n    /**\n     * 排序字段0默认排序，1价格排序，2销量排序，3好评度排序，4上架时间排序\n     */\n    private Integer sortFeild = 0;\n\n    /**\n     * 新品 0否，1是 -1默认不处理\n     */\n    private Integer newly = -1;\n\n    /**\n     * 有货 0有，1无 -1默认不处理\n     */\n    private Integer hasStock = -1;\n\n    /**\n     * 运营分类编号\n     */\n    private List<String> categoryNo;\n\n    /**\n     * 分类编号\n     * 仅用于从前端分类进入时使用\n     */\n    private String oprtCatNo;\n\n    /**\n     * 排序类型，默认升序ASC\n     * 0: 升序\n     * 1：降序\n     */\n    private int sort = 0;\n\n    /**\n     * 价格区间\n     * 小-大，小-大\n     */\n    private List<String> rangesPrices;\n\n    /**\n     * 索引名称\n     */\n    private String index;\n\n    /**\n     * 品牌编码\n     **/\n    private List<String> brandNo;\n\n    /**\n     * SKU规格属性\n     */\n    private List<String> skuPropsNo;\n\n    /**\n     * 商品扩展属性\n     */\n    private List<String> extPropsNo;\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchResultDo.java",
    "content": "/*\n * Winner\n * 文件名  :SearchResponse.java\n * 创建人  :llxiao\n * 创建时间:2018年1月11日\n */\n\npackage com.xiao.spring.cloud.search.dto;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\n\n/**\n * [简要描述]:搜索结果<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月11日\n * @since Purcotton-Search B01\n */\npublic class SearchResultDo\n{\n    /**\n     * 返回文档\n     */\n    private ElasticSearchDoc doc;\n    /**\n     * 标题高亮字段\n     */\n    private String highlightTitle;\n    /**\n     * 子标题高亮字段\n     */\n    private String highlightSubTitle;\n\n    /**\n     * [简要描述]:替换返回的索引文档中高亮字段<br/>\n     * [详细描述]:<br/>\n     *\n     * @return\n     */\n    public SearchResultDo setHighlight()\n    {\n        if (StringUtils.isNotBlank(highlightTitle))\n        {\n            doc.setTitle(highlightTitle);\n        }\n        if (StringUtils.isNoneBlank(highlightSubTitle))\n        {\n            doc.setSubTitle(highlightSubTitle);\n        }\n        return this;\n    }\n\n    /**\n     * 返回doc属性\n     *\n     * @return doc属性\n     */\n    public ElasticSearchDoc getDoc()\n    {\n        return doc;\n    }\n\n    /**\n     * 设置doc属性\n     *\n     * @param doc doc属性\n     */\n    public void setDoc(ElasticSearchDoc doc)\n    {\n        this.doc = doc;\n    }\n\n    /**\n     * 返回highlightTitle属性\n     *\n     * @return highlightTitle属性\n     */\n    public String getHighlightTitle()\n    {\n        return highlightTitle;\n    }\n\n    /**\n     * 设置highlightTitle属性\n     *\n     * @param highlightTitle highlightTitle属性\n     */\n    public void setHighlightTitle(String highlightTitle)\n    {\n        this.highlightTitle = highlightTitle;\n    }\n\n    /**\n     * 返回highlightSubTitle属性\n     *\n     * @return highlightSubTitle属性\n     */\n    public String getHighlightSubTitle()\n    {\n        return highlightSubTitle;\n    }\n\n    /**\n     * 设置highlightSubTitle属性\n     *\n     * @param highlightSubTitle highlightSubTitle属性\n     */\n    public void setHighlightSubTitle(String highlightSubTitle)\n    {\n        this.highlightSubTitle = highlightSubTitle;\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @return\n     * @see Object#toString()\n     */\n    @Override\n    public String toString()\n    {\n        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/SearchShopWeightDto.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.Date;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-25 17:24\n * @since JDK 1.8\n */\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class SearchShopWeightDto\n{\n    // id主键\n    private long id;\n    // 店铺编码\n    private String shopCode;\n    // 权重因子\n    private Integer weightFactor;\n    // 权重因子名称\n    private String weightName;\n    private String englishName;\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/dto/ShopPriceRangeDto.java",
    "content": "package com.xiao.spring.cloud.search.dto;\n\nimport lombok.Data;\n\n/**\n * [简要描述]:ES店铺商品价格区间\n * [详细描述]:\n *\n * @author mjye\n * @version 1.0, 2019-02-23 18:45\n * @since JDK 1.8\n */\n@Data\npublic class ShopPriceRangeDto implements Comparable<ShopPriceRangeDto>\n{\n    private Long id;\n    //店铺编码\n    private String shopCode;\n    //最低价格\n    private String floorPrice;\n    //最高价格\n    private String highestPrice;\n    //价格区间\n    private String priceRange;\n    //状态  1：启用  2：禁用  默认禁用\n    private Integer status;\n    //店铺名称\n    private String shopName;\n\n    @Override\n    public int compareTo(ShopPriceRangeDto o)\n    {\n        return Integer.parseInt(this.getFloorPrice()) - Integer.parseInt(this.getFloorPrice());\n    }\n}"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/client/ElasticSearchClient.java",
    "content": "/*\n * Winner\n * 文件名  :ElasticSearchClient.java\n * 创建人  :llxiao\n * 创建时间:2018年1月11日\n */\n\npackage com.xiao.spring.cloud.search.es.client;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.elasticsearch.client.transport.TransportClient;\nimport org.elasticsearch.common.settings.Settings;\nimport org.elasticsearch.common.transport.TransportAddress;\nimport org.elasticsearch.transport.client.PreBuiltTransportClient;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.PostConstruct;\nimport javax.annotation.PreDestroy;\nimport java.net.InetAddress;\nimport java.net.InetSocketAddress;\nimport java.net.UnknownHostException;\n\n/**\n * [简要描述]:ElasticSearch client类<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月11日\n * @since Purcotton-Search B01\n */\n@Component\npublic class ElasticSearchClient\n{\n    /**\n     * 日志记录器\n     */\n    private static final Log LOG = LogFactory.getLog(ElasticSearchClient.class);\n\n    /**\n     * ip端口组成数组长度\n     */\n    private static final int IP_AND_PORT_ARRAY_LENGTH = 2;\n\n    /**\n     * 集群配置名称\n     */\n    private static final String ES_CLUSTER_NAME_CONF = \"cluster.name\";\n\n    /**\n     * 自动嗅探配置\n     */\n    private static final String ES_SNIFF_CONF = \"client.transport.sniff\";\n\n    /**\n     * es集群主机\n     */\n    @Value(\"${elastic.search.host}\")\n    private String esHosts;\n\n    /**\n     * 集群名称\n     */\n    @Value(\"${elastic.search.cluster.name}\")\n    private String clusterName;\n\n    /**\n     * es 客户端 Transport Client\n     */\n    private TransportClient transoportClient;\n\n    /**\n     * client初始化是否OK\n     */\n    private boolean isOk = false;\n\n    /**\n     * [简要描述]:服务停止，关闭客户端<br/>\n     * [详细描述]:<br/>\n     *\n     * @exception Exception\n     */\n    @PreDestroy\n    public void destroy()\n    {\n        LOG.warn(\"Close elastic search transoport Client beacuase purcotton search server stoped!\");\n        if (isOk)\n        {\n            transoportClient.close();\n        }\n\n    }\n\n    /**\n     * [简要描述]:初始化ES client<br/>\n     * [详细描述]:<br/>\n     *\n     * @exception UnknownHostException\n     */\n    @SuppressWarnings(\"resource\")\n    @PostConstruct\n    public void init() throws UnknownHostException\n    {\n        if (StringUtils.isNotBlank(esHosts) || esHosts.split(\":\").length == IP_AND_PORT_ARRAY_LENGTH)\n        {\n            if (LOG.isInfoEnabled())\n            {\n                LOG.info(\"ElasticSearch Host configuration:\" + esHosts);\n            }\n\n            String[] ipHost = esHosts.split(\":\");\n            // 设置ES实例的名称\n            Settings esSettings = Settings.builder().put(ES_CLUSTER_NAME_CONF, clusterName)\n                    // 自动嗅探整个集群的状态，把集群中其他ES节点的ip添加到本地的客户端列表中\n                    .put(ES_SNIFF_CONF, true).build();\n            TransportAddress transportAddress = new TransportAddress(new InetSocketAddress(InetAddress\n                    .getByName(ipHost[0]), Integer.parseInt(ipHost[1])));\n            transoportClient = new PreBuiltTransportClient(esSettings).addTransportAddress(transportAddress);\n            isOk = true;\n        }\n        else\n        {\n            LOG.error(\"Wrong Host configuration for ElasticSearch!\");\n        }\n    }\n\n    /**\n     * [简要描述]:get TransportClient<br/>\n     * [详细描述]:<br/>\n     *\n     * @return\n     */\n    public TransportClient getTransportClient()\n    {\n        return this.transoportClient;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/common/AnalyzeType.java",
    "content": "/*\n * Winner \n * 文件名  :AnalyzeType.java\n * 创建人  :llxiao\n * 创建时间:2018年1月13日\n*/\n\npackage com.xiao.spring.cloud.search.es.common;\n\n/**\n * [简要描述]:分析器类型<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月13日\n * @since Purcotton-Search B01\n */\npublic enum AnalyzeType\n{\n    /**\n     * IK中文标准分词器,eg:我是中国人 -->\"我\",\"是\",\"中国人\"\n     */\n    IK_SMART(\"ik_smart\"),\n    /**\n     * IM中文最大化分词,eg:我是中国人 --> \"我\",\"是\",\"中国\",\"中国人\"\n     */\n    IK_MAX_WORD(\"ik_max_word\"),\n\n    /**\n     * ES默认中文分词器，会将中文分词成一个一个。eg:中国 --> \"中\",\"国\"\n     */\n    STANDARD(\"standard\");\n\n    private String type;\n\n    private AnalyzeType(String type)\n    {\n        this.type = type;\n    }\n\n    /**\n     * 返回type属性\n     * \n     * @return type属性\n     */\n    public String getType()\n    {\n        return type;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/common/ESConstants.java",
    "content": "/*\n * Winner\n * 文件名  :ESConstants.java\n * 创建人  :llxiao\n * 创建时间:2018年1月11日\n */\n\npackage com.xiao.spring.cloud.search.es.common;\n\n/**\n * [简要描述]:ES常量池<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月11日\n * @since Purcotton-Search B01\n */\npublic interface ESConstants\n{\n\n    /**\n     * 集群配置名称\n     */\n    String ES_CLUSTER_NAME_CONF = \"cluster.name\";\n\n    /**\n     * 自动嗅探配置\n     */\n    String ES_SNIFF_CONF = \"client.transport.sniff\";\n\n    String IDNEX_DEV_TYPE = \"devType\";\n\n    /**\n     * 分页最大数量 100\n     */\n    int MAX_PAGE_SIZE = 100;\n\n    /**\n     * 获取所有的数量,最大值\n     */\n    int GET_ALL_SIZE = 2000;\n    /**\n     * 新品\n     */\n    int NEWLY_PRODUCT = 1;\n\n    /**\n     * 普通\n     */\n    int NORMAL_PRODUCT = 0;\n\n    /**\n     * 常量 0\n     */\n    int CONSTANT_ZERO = 0;\n\n    /**\n     * 常量 1\n     */\n    int CONSTANT_ONE = 1;\n\n    /**\n     * 常量 2\n     */\n    int CONSTANT_TWO = 2;\n\n    /**\n     * 无货\n     */\n    int NOT_HAVE_STOCK = 1;\n\n    /**\n     * 无效，不处理标志\n     */\n    int INVALID_FLAG = -1;\n\n    /**\n     * IK maxword分词器\n     */\n    int IK_ANALYZE_TYPE = 1;\n\n    /**\n     * ES 默认分词器\n     */\n    int STANDARD = 0;\n    /**\n     * 将序排序\n     */\n    int DESC_SORT = 1;\n\n    /****************************** ES 字段常量 start **************************/\n\n    /**\n     * 标题字段\n     */\n    String ES_TITLE_FEILD = \"title\";\n\n    /**\n     * 子标题字段\n     */\n    String ES_SUBTITLE_FEILD = \"subTitle\";\n\n    /**\n     * 运营类型\n     */\n    String ES_OPRTCATNO_FEILD = \"oprtCatName\";\n\n    /**\n     * 商品品牌\n     */\n    String ES_BRAND_NO = \"brandNo\";\n    String ES_BRAND_NAME=\"brandName\";\n\n    /**\n     * 商品（SPU）编码\n     */\n    String ES_COMMODITY_NO = \"commodityNo\";\n\n    /**\n     * 商品标题\n     */\n    String ES_TITLE = \"title\";\n\n    /**\n     * 商品卖点\n     */\n    String ES_SUB_TITLE = \"subTitle\";\n\n    /**\n     * 运营分类各层级名称\n     */\n    String ES_OPRT_CAT_NAME=\"oprtCatName\";\n\n    /**\n     * 商品标签\n     */\n    String ES_LABELS = \"labels\";\n\n    /**\n     * SKU规格属性\n     */\n    String ES_SKU_PROPS = \"skuProps\";\n\n    /**\n     * 商品扩展属性\n     */\n    String ES_EXT_PROPS = \"extProps\";\n\n    /**\n     * 货品产地\n     */\n    String ES_PRODUCT_AREA = \"productArea\";\n\n    /**\n     * 索引关键字\n     */\n    String ES_KEY_WORDS = \"keyWords\";\n\n    /**\n     * 商品分类名称\n     */\n    String ES_CATEGORY_NAME = \"categoryName\";\n\n    /**\n     * 商品分类编号\n     */\n    String ES_CATEGORY_NO = \"oprtCatNo\";\n\n    /**\n     * 商品编号\n     */\n    String COMMON_NO = \"commodityNo\";\n\n    /**\n     * 默认货品编码\n     */\n    String DEFPRODNO = \"defProdNo\";\n\n    /**\n     * 库存过滤字段\n     */\n    String HAS_STOCK = \"hasStock\";\n\n    /**\n     * 新品字段\n     */\n    String NEWLY = \"newly\";\n\n    /**\n     * 售价\n     */\n    String SALE_PRICE = \"salePrice\";\n\n    /**\n     * 原价\n     */\n    String OLD_PRICE = \"oldPrice\";\n\n    /**\n     * 销量字段\n     */\n    String SALES_VOLUME = \"salesVolume\";\n\n    /**\n     * 上架时间字段\n     */\n    String SALE_TIME = \"saleTime\";\n\n    /**\n     * 评论数字段\n     */\n    String COMMENTS = \"comments\";\n\n    /**\n     * 销售标签名称\n     */\n    String SALES_TAG_NAME = \"salesTagName\";\n\n    /****************************** ES 字段常量 end **************************/\n\n    /**\n     * 是否使用ES\n     * \"on\"表示使用ES\n     * \"off\"表示使用solr\n     */\n    String USE_ELASTIC_SEARCH = \"useElasticSearch\";\n\n    /**\n     * 分词阈值 搜索到指定值不进行拆词\n     */\n    String WORD_SEGMENTATION_THRESHOLD = \"thresholdTotal\";\n\n    /**\n     * ES热词 缓存key\n     */\n    String ES_IK_HOT_WORDS_KEY = \"esIKHotWords\";\n\n    /**\n     * 关闭elasticsearch 使用solr\n     */\n    String OFF_ELASTIC_SEARCH = \"off\";\n\n    /**\n     * 开启elasticsearch\n     */\n    String ON_ELASTIC_SEARCH = \"on\";\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/common/OrderField.java",
    "content": "/*\n * Winner \n * 文件名  :OrderField.java\n * 创建人  :llxiao\n * 创建时间:2018年1月15日\n*/\n\npackage com.xiao.spring.cloud.search.es.common;\n\n/**\n * [简要描述]:<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年1月15日\n * @since Purcotton-Search B01\n */\npublic enum OrderField\n{\n    /**\n     * 默认排序\n     */\n    DEFAULT(0),\n    /**\n     * 价格排序\n     */\n    PRICE(1),\n\n    /**\n     * 销售排序\n     */\n    SALES(2),\n    /**\n     * 好评度排序\n     */\n    COMMENTS(3),\n\n    /**\n     * 上架时间排序\n     */\n    SLAESTIME(4);\n\n    private int type;\n\n    private OrderField(int type)\n    {\n        this.type = type;\n    }\n\n    /**\n     * 返回type属性\n     * \n     * @return type属性\n     */\n    public int getType()\n    {\n        return type;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/common/SearchException.java",
    "content": "package com.xiao.spring.cloud.search.es.common;\n\nimport com.xiao.springcloud.demo.common.exception.AbstractServiceException;\n\n/**\n * [简要描述]: 搜索服务异常枚举\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/9 10:12\n * @since JDK 1.8\n */\npublic enum SearchException implements AbstractServiceException\n{\n    SUCCESS(0, \"成功!\"),\n    PARAM_IS_NULL(780000, \"参数为空\"),\n    NOT_FOUND_DOC(780001, \"商品找不到!\"),\n    ;\n\n    SearchException(Integer code, String message)\n    {\n        this.code = code;\n        this.message = message;\n    }\n\n    /**\n     * 错误码\n     */\n    private Integer code;\n\n    /**\n     * 错误消息\n     */\n    private String message;\n\n    /**\n     * 获取异常的状态码\n     */\n    @Override\n    public Integer getCode()\n    {\n        return code;\n    }\n\n    /**\n     * 获取异常的提示信息\n     */\n    @Override\n    public String getMessage()\n    {\n        return message;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/ISearchLogService.java",
    "content": "/*\n * Winner \n * 文件名  :SearchLogService.java\n * 创建人  :llxiao\n * 创建时间:2018年2月23日\n*/\n\npackage com.xiao.spring.cloud.search.es.log;\n\nimport com.xiao.spring.cloud.search.dto.SearchLogDo;\n\n/**\n * [简要描述]:搜索日志服务<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月23日\n * @since Purcotton-Search B01\n */\npublic interface ISearchLogService\n{\n    /**\n     * [简要描述]:添加一个搜索日志<br/>\n     * [详细描述]:<br/>\n     * \n     * @author llxiao\n     * @param searchLog\n     *            搜索日志\n     */\n    void addSearchLog(SearchLogDo searchLog);\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/impl/SearchLogServiceImpl.java",
    "content": "/*\n * Winner\n * 文件名  :SearchLogService.java\n * 创建人  :llxiao\n * 创建时间:2018年2月23日\n */\n\npackage com.xiao.spring.cloud.search.es.log.impl;\n\nimport com.xiao.spring.cloud.search.dto.SearchLogDo;\nimport com.xiao.spring.cloud.search.es.log.ISearchLogService;\nimport com.xiao.spring.cloud.search.es.log.thread.BatchSaveSearchLogThread;\nimport com.xiao.spring.cloud.search.es.log.thread.SearchThreadFactory;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.PostConstruct;\nimport javax.annotation.PreDestroy;\nimport java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ScheduledThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]:搜索日志服务实现类<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月23日\n * @since Purcotton-Search B01\n */\n@Service\npublic class SearchLogServiceImpl implements ISearchLogService\n{\n    /**\n     * 日志记录\n     */\n    private static final Log LOG = LogFactory.getLog(SearchLogServiceImpl.class);\n\n    /**\n     * 最大1千个有界队列\n     */\n    private final ArrayBlockingQueue<SearchLogDo> queue = new ArrayBlockingQueue<>(1000);\n\n    /**\n     * 批处理数量\n     */\n    private static final int BATCH_SIZE = 20;\n\n    /**\n     * 定时执行任务\n     */\n    private ScheduledExecutorService schedule = new ScheduledThreadPoolExecutor(5, new SearchThreadFactory());\n\n    @PostConstruct\n    public void init()\n    {\n        // 这个是按照固定的时间来执行，简单来说：到点执行\n        // initialDelay延迟时间 period周期时间 每个60秒 延迟10秒执行一个线程\n        schedule.scheduleAtFixedRate(new BatchSaveSearchLogThread(queue, BATCH_SIZE), 10, 60, TimeUnit.SECONDS);\n        // scheduleWithFixedDelay，执行完上一个任务后再执行\n    }\n\n    /**\n     * [简要描述]:添加一个搜索日志<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchLog\n     * @see\n     */\n    @Override\n    public void addSearchLog(SearchLogDo searchLog)\n    {\n        if (!queue.offer(searchLog))\n        {\n            // 饱和策略\n            LOG.warn(\"日志队列已满...................\");\n        }\n    }\n\n    /**\n     * [简要描述]:销毁线程池<br/>\n     * [详细描述]:<br/>\n     */\n    @PreDestroy\n    public void destroy()\n    {\n        schedule.shutdown();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/thread/BatchSaveSearchLogThread.java",
    "content": "/*\n * Winner\n * 文件名  :SaveSearchLogThread.java\n * 创建人  :llxiao\n * 创建时间:2018年2月23日\n */\n\npackage com.xiao.spring.cloud.search.es.log.thread;\n\nimport com.xiao.spring.cloud.search.dto.SearchLogDo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.ArrayBlockingQueue;\n\n/**\n * [简要描述]:批处理搜索日志<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月23日\n * @since Purcotton-Search B01\n */\npublic class BatchSaveSearchLogThread implements Runnable\n{\n    private static final Log LOG = LogFactory.getLog(BatchSaveSearchLogThread.class);\n    /**\n     * 搜索日志\n     */\n    private static final Log SEARCH_LOG = LogFactory.getLog(\"searchLog\");\n\n    private ArrayBlockingQueue<SearchLogDo> queue;\n    private int batchSize;\n\n    public BatchSaveSearchLogThread(ArrayBlockingQueue<SearchLogDo> queue, int batchSize)\n    {\n        this.queue = queue;\n        this.batchSize = batchSize;\n    }\n\n    @Override\n    public void run()\n    {\n        if (null != queue && !queue.isEmpty())\n        {\n            if (LOG.isInfoEnabled())\n            {\n                LOG.info(\"Batch process search log!..........\");\n            }\n\n            // 队里处理日志\n            processQueue();\n        }\n    }\n\n    /**\n     * [简要描述]:队里处理日志<br/>\n     * [详细描述]:<br/>\n     */\n    private void processQueue()\n    {\n        try\n        {\n            List<SearchLogDo> logs = new ArrayList<>(batchSize);\n            SearchLogDo log = queue.poll();\n            if (queue.size() <= batchSize)\n            {\n                while (null != log)\n                {\n                    logs.add(log);\n                    log = queue.poll();\n                }\n            }\n            else\n            {\n                int i = 0;\n                while (null != log && i < batchSize)\n                {\n                    logs.add(log);\n                    log = queue.poll();\n                    i++;\n                }\n            }\n            if (null != SEARCH_LOG)\n            {\n                processLog(logs);\n            }\n        }\n        catch (RuntimeException e)\n        {\n            // 线程内部捕获RuntimeException异常，记录异常日志\n            LOG.error(Thread.currentThread().getName() + \" RuntimeException\", e);\n        }\n    }\n\n    /**\n     * [简要描述]:批量日志处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param logs 批量日志\n     */\n    private void processLog(List<SearchLogDo> logs)\n    {\n        for (SearchLogDo searchLogDo : logs)\n        {\n            SEARCH_LOG.info(searchLogDo);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/thread/SearchLogThread.java",
    "content": "/*\n * Winner \n * 文件名  :SearchLogThread.java\n * 创建人  :llxiao\n * 创建时间:2018年2月24日\n*/\n\npackage com.xiao.spring.cloud.search.es.log.thread;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * [简要描述]:定制线程，指定线程名称，设置未捕获异常，维护一些统计信息<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月24日\n * @since Purcotton-Search B01\n */\npublic class SearchLogThread extends Thread\n{\n    private static final Log LOG = LogFactory.getLog(SearchLogThread.class);\n\n    /**\n     * 创建线程数\n     */\n    private static final AtomicInteger CREATED = new AtomicInteger();\n\n    /**\n     * 运行线程数\n     */\n    private static final AtomicInteger ALIVE = new AtomicInteger();\n\n    public SearchLogThread(Runnable r, String threadName)\n    {\n        super(r, threadName + '-' + CREATED.incrementAndGet());\n        setUncaughtExceptionHandler((t, e) -> LOG.error(t.getName() + \" UncaughtExceptionHandler\", e));\n    }\n\n    @Override\n    public void run()\n    {\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Create thread:\" + getName());\n        }\n        try\n        {\n            ALIVE.incrementAndGet();\n            super.run();\n        }\n        finally\n        {\n            ALIVE.decrementAndGet();\n            if (LOG.isDebugEnabled())\n            {\n                LOG.debug(\"Exit thread:\" + getName());\n            }\n        }\n    }\n\n    /**\n     * 返回created属性\n     * \n     * @return created属性\n     */\n    public static AtomicInteger getCreated()\n    {\n        return CREATED;\n    }\n\n    /**\n     * 返回alive属性\n     * \n     * @return alive属性\n     */\n    public static AtomicInteger getAlive()\n    {\n        return ALIVE;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/thread/SearchLogThreadPool.java",
    "content": "/*\n * Winner \n * 文件名  :SearchLogThreadPool.java\n * 创建人  :llxiao\n * 创建时间:2018年2月24日\n*/\n\npackage com.xiao.spring.cloud.search.es.log.thread;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * [简要描述]:定制线程池<br/>\n * [详细描述]:通过扩展beforeExcute、afterExcute、terminated方法添加线程池的统计和监控功能<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月24日\n * @since Purcotton-Search B01\n */\npublic class SearchLogThreadPool extends ThreadPoolExecutor\n{\n\n    /**\n     * 日志记录器\n     */\n    private static final Log LOG = LogFactory.getLog(SearchLogThreadPool.class);\n\n    /**\n     * 每个线程存储一个开始时间\n     */\n    private final ThreadLocal<Long> startTime = new ThreadLocal<>();\n\n    /**\n     * 已处理任务数量\n     */\n    private final AtomicLong numTasks = new AtomicLong();\n\n    /**\n     * 总处理时间\n     */\n    private final AtomicLong totalTime = new AtomicLong();\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @author llxiao\n     * @param corePoolSize\n     * @param maximumPoolSize\n     * @param keepAliveTime\n     * @param unit\n     * @param workQueue\n     */\n    public SearchLogThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,\n            BlockingQueue<Runnable> workQueue)\n    {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @author llxiao\n     * @param corePoolSize\n     * @param maximumPoolSize\n     * @param keepAliveTime\n     * @param unit\n     * @param workQueue\n     * @param threadFactory\n     */\n    public SearchLogThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,\n            BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)\n    {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @author llxiao\n     * @param corePoolSize\n     * @param maximumPoolSize\n     * @param keepAliveTime\n     * @param unit\n     * @param workQueue\n     * @param handler\n     */\n    public SearchLogThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,\n            BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)\n    {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);\n    }\n\n    /**\n     * [简要描述]:<br/>\n     * [详细描述]:<br/>\n     *\n     * @author llxiao\n     * @param corePoolSize\n     * @param maximumPoolSize\n     * @param keepAliveTime\n     * @param unit\n     * @param workQueue\n     * @param threadFactory\n     * @param handler\n     */\n    public SearchLogThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,\n            BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)\n    {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);\n    }\n\n    /**\n     * [简要描述]:线程执行之前调用方法<br/>\n     * [详细描述]:出现RuntimeException时不会调用此方法<br/>\n     * \n     * @author llxiao\n     * @param t\n     * @param r\n     * @see ThreadPoolExecutor#beforeExecute(Thread,\n     *      Runnable)\n     */\n    @Override\n    protected void beforeExecute(Thread t, Runnable r)\n    {\n        super.beforeExecute(t, r);\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(t.getName() + \" starting...\");\n        }\n        startTime.set(System.nanoTime());\n    }\n\n    /**\n     * [简要描述]:线程执行之后调用方法<br/>\n     * [详细描述]:run正常运行完成或抛出异常会调用该方法，但出现ERROR不会执行此方法<br/>\n     *\n     * @author llxiao\n     * @param r\n     * @param t\n     * @see ThreadPoolExecutor#afterExecute(Runnable,\n     *      Throwable)\n     */\n    @Override\n    protected void afterExecute(Runnable r, Throwable t)\n    {\n        try\n        {\n            long endTime = System.nanoTime();\n            long taskTime = endTime - startTime.get();\n            totalTime.addAndGet(taskTime);\n            numTasks.incrementAndGet();\n            if (LOG.isDebugEnabled())\n            {\n                LOG.debug(\"Thread \" + r + \" end and cost time:\" + taskTime);\n                LOG.debug(\"Throwable:\" + t);\n            }\n        }\n        finally\n        {\n            super.afterExecute(r, t);\n        }\n    }\n\n    /**\n     * [简要描述]:线程池完成关闭时调用方法<br/>\n     * [详细描述]:可用于统计、关闭资源、完成发送通知等，计算线程平均执行时间<br/>\n     *\n     * @author llxiao\n     * @see ThreadPoolExecutor#terminated()\n     */\n    @Override\n    protected void terminated()\n    {\n        try\n        {\n            LOG.info(\"Thread terminated: avg time=\" + (totalTime.get() / numTasks.get()));\n        }\n        finally\n        {\n            super.terminated();\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/log/thread/SearchThreadFactory.java",
    "content": "/*\n * Winner \n * 文件名  :SearchThreadFactory.java\n * 创建人  :llxiao\n * 创建时间:2018年2月23日\n*/\n\npackage com.xiao.spring.cloud.search.es.log.thread;\n\nimport java.util.concurrent.ThreadFactory;\n\n/**\n * [简要描述]:线程工厂<br/>\n * [详细描述]:<br/>\n *\n * @author llxiao\n * @version 1.0, 2018年2月23日\n * @since Purcotton-Search B01\n */\npublic class SearchThreadFactory implements ThreadFactory\n{\n    private static final String SEARCH_LOG_THRED = \"Search-log-thread-\";\n\n    @Override\n    public Thread newThread(Runnable r)\n    {\n        SearchLogThread t = new SearchLogThread(r, SEARCH_LOG_THRED);\n        return t;\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/service/SearchManagerEsImpl.java",
    "content": "package com.xiao.spring.cloud.search.es.service;\n\nimport com.alibaba.fastjson.JSON;\nimport com.xiao.springcloud.demo.common.exception.CommonException;\nimport com.xiao.spring.cloud.search.dto.ElasticSearchDoc;\nimport com.xiao.spring.cloud.search.es.client.ElasticSearchClient;\nimport com.xiao.spring.cloud.search.es.common.ESConstants;\nimport com.xiao.spring.cloud.search.es.common.SearchException;\nimport com.xiao.spring.cloud.search.service.SearchManangerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;\nimport org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder;\nimport org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;\nimport org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;\nimport org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;\nimport org.elasticsearch.action.bulk.BulkRequestBuilder;\nimport org.elasticsearch.action.bulk.BulkResponse;\nimport org.elasticsearch.action.delete.DeleteRequestBuilder;\nimport org.elasticsearch.action.get.GetRequestBuilder;\nimport org.elasticsearch.action.index.IndexRequestBuilder;\nimport org.elasticsearch.action.search.SearchRequestBuilder;\nimport org.elasticsearch.action.search.SearchResponse;\nimport org.elasticsearch.action.search.SearchType;\nimport org.elasticsearch.action.update.UpdateRequestBuilder;\nimport org.elasticsearch.client.transport.TransportClient;\nimport org.elasticsearch.common.xcontent.XContentBuilder;\nimport org.elasticsearch.common.xcontent.XContentFactory;\nimport org.elasticsearch.index.query.BoolQueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.search.SearchHit;\nimport org.elasticsearch.search.SearchHits;\nimport org.elasticsearch.search.sort.SortOrder;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.io.IOException;\nimport java.util.*;\n\n/**\n * [简要描述]: 搜索文档管理服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 13:57\n * @since JDK 1.8\n */\n@Slf4j\n@Service\npublic class SearchManagerEsImpl implements SearchManangerService, ESConstants\n{\n    /**\n     * es客户端\n     */\n    @Autowired\n    private ElasticSearchClient esClient;\n\n    /**\n     * [简要描述]:创建索引和默认mapping<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index : 索引名称\n     * @return true成功\n     * llxiao 2018/10/17 - 19:47\n     **/\n    @Override\n    public boolean createIndexMapping(String index)\n    {\n        if (StringUtils.isBlank(index))\n        {\n            log.error(\"Create index and mapping error! index name:{}\", index);\n            return false;\n        }\n        if (this.existsIndex(index))\n        {\n            this.deleteIndex(index);\n        }\n\n        TransportClient client = esClient.getTransportClient();\n        CreateIndexRequestBuilder cib = client.admin().indices().prepareCreate(index);\n        try\n        {\n            XContentBuilder mapping = createMapping();\n            cib.addMapping(index, mapping).execute().actionGet();\n            return true;\n        }\n        catch (Exception e)\n        {\n            log.error(\"Create index and mapping error! index name:{}\", index, e);\n        }\n        return false;\n    }\n\n    /**\n     * 创建mapping\n     *\n     * @return\n     * @exception IOException\n     */\n    private XContentBuilder createMapping() throws IOException\n    {\n        XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(\"properties\");\n        mapping.startObject(\"id\").field(\"type\", \"text\").endObject();\n        mapping.startObject(\"keyWords\").field(\"type\", \"text\").endObject();\n        mapping.startObject(\"commodityNo\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"commodityCode\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"defProdNo\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"defProdCode\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"brandNo\").field(\"type\", \"keyword\").endObject();\n        //fielddata 解决字段既可以聚合也可以分词查询问题\n        mapping.startObject(\"brandName\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").field(\"fielddata\", true)\n                .startObject(\"fields\").startObject(\"raw\").field(\"type\", \"keyword\").endObject().endObject().endObject();\n        mapping.startObject(\"title\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"subTitle\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"extProps\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"skuProps\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"orgPrice\").field(\"type\", \"double\").endObject();\n        mapping.startObject(\"salePrice\").field(\"type\", \"double\").endObject();\n        mapping.startObject(\"productArea\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"oprtCatNo\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"oprtCatName\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"labels\").field(\"type\", \"text\").field(\"analyzer\", \"ik_max_word\").endObject();\n        mapping.startObject(\"saleTime\").field(\"type\", \"date\").endObject();\n        mapping.startObject(\"picUrl\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"stock\").field(\"type\", \"integer\").endObject();\n        mapping.startObject(\"haitao\").field(\"type\", \"integer\").endObject();\n        mapping.startObject(\"salesVolume\").field(\"type\", \"long\").endObject();\n        mapping.startObject(\"commoCatNo\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"newly\").field(\"type\", \"integer\").endObject();\n        mapping.startObject(\"comments\").field(\"type\", \"long\").endObject();\n        mapping.startObject(\"discountRate\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"categoryName\").field(\"type\", \"keyword\").endObject();\n        mapping.startObject(\"defSkuProp\").field(\"type\", \"keyword\").endObject();\n        mapping.endObject().endObject();\n        return mapping;\n    }\n\n    /**\n     * [简要描述]:索引是否存在<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index : 索引名称\n     * @return boolean\n     * llxiao 2018/10/18 - 8:35\n     **/\n    @Override\n    public boolean existsIndex(String index)\n    {\n        IndicesExistsRequest inExistsRequest = new IndicesExistsRequest(index);\n        TransportClient client = esClient.getTransportClient();\n        IndicesExistsResponse inExistsResponse = client.admin().indices().exists(inExistsRequest).actionGet();\n        return inExistsResponse.isExists();\n    }\n\n    /**\n     * [简要描述]:删除索引<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index : 索引名称\n     * @return boolean\n     * llxiao 2018/10/18 - 8:35\n     **/\n    @Override\n    public boolean deleteIndex(String index)\n    {\n        boolean flag = false;\n        if (StringUtils.isNotBlank(index))\n        {\n            DeleteIndexRequestBuilder deleteIndexRequestBuilder = esClient.getTransportClient().admin().indices()\n                    .prepareDelete(index);\n            if (null != deleteIndexRequestBuilder)\n            {\n                DeleteIndexResponse dResponse = deleteIndexRequestBuilder.execute().actionGet();\n                flag = dResponse.isAcknowledged();\n            }\n        }\n        return flag;\n    }\n\n    /**\n     * [简要描述]:根据id查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 索引文档\n     */\n    @Override\n    public ElasticSearchDoc getEsDocById(String id, String index)\n    {\n        if (StringUtils.isBlank(id) || StringUtils.isBlank(index))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"查询失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        GetRequestBuilder prepareGet = client.prepareGet(index, IDNEX_DEV_TYPE, id);\n        Map<String, Object> map = prepareGet.get().getSourceAsMap();\n        return JSON.parseObject(JSON.toJSONString(map), ElasticSearchDoc.class);\n    }\n\n    /**\n     * [简要描述]:获取指定索引下的所有文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index 索引名称\n     * @return 所有文档\n     */\n    @Override\n    public List<ElasticSearchDoc> getAllDos(String index)\n    {\n        List<ElasticSearchDoc> esDocList = new ArrayList<>();\n        TransportClient client = esClient.getTransportClient();\n        long totalHits = client.prepareSearch(index).setTypes(IDNEX_DEV_TYPE).setQuery(QueryBuilders.matchAllQuery())\n                .get().getHits().getTotalHits();\n        int totalSize = (int) (totalHits / GET_ALL_SIZE) + 1;\n        SearchResponse searchResponse;\n        SearchHits hits;\n        SearchHit[] searchHits;\n        for (int i = 0; i < totalSize; i++)\n        {\n            searchResponse = client.prepareSearch(index).setTypes(IDNEX_DEV_TYPE)\n                    .setQuery(QueryBuilders.matchAllQuery()).setSearchType(SearchType.QUERY_THEN_FETCH)\n                    .setFrom(GET_ALL_SIZE * i).setSize(GET_ALL_SIZE).addSort(COMMON_NO, SortOrder.DESC).get();\n            hits = searchResponse.getHits();\n            searchHits = hits.getHits();\n            for (SearchHit searchHit : searchHits)\n            {\n                esDocList.add(JSON.parseObject(searchHit.getSourceAsString(), ElasticSearchDoc.class));\n            }\n        }\n        return esDocList;\n    }\n\n    /**\n     * [简要描述]:根据defProdNo查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param defProdNo 产品ID\n     * @param index 索引名称\n     * @return 产品信息\n     */\n    @Override\n    public ElasticSearchDoc getEsDocByDefProdNo(String defProdNo, String index)\n    {\n        if (StringUtils.isBlank(defProdNo) || StringUtils.isBlank(index))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"查询失败，索引名称和货品编号不能为空!\");\n        }\n        List<ElasticSearchDoc> esDocList = new ArrayList<>();\n        TransportClient client = esClient.getTransportClient();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n        QueryBuilder accurateQuery = QueryBuilders.matchQuery(ESConstants.DEFPRODNO, defProdNo);\n        searchBuilder.setQuery(queryBuilder.must(accurateQuery));\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        String searchSource;\n        for (SearchHit searchHit : hits)\n        {\n            searchSource = searchHit.getSourceAsString();\n            esDocList.add(JSON.parseObject(searchSource, ElasticSearchDoc.class));\n        }\n        if (esDocList.size() == 1)\n        {\n            return esDocList.get(0);\n        }\n        return new ElasticSearchDoc();\n    }\n\n    /**\n     * [简要描述]:根据商品编号查询出商品<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品ID\n     * @param index 索引名称\n     * @return 商品信息\n     */\n    @Override\n    public List<ElasticSearchDoc> getEsDocByCommoNo(String commoNo, String index)\n    {\n        List<ElasticSearchDoc> esDocList = new ArrayList<>();\n        if (StringUtils.isBlank(commoNo) || StringUtils.isBlank(index))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"查询失败，索引名称和商品编号不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n        QueryBuilder accurateQuery = QueryBuilders.matchQuery(ESConstants.COMMON_NO, commoNo);\n\n        searchBuilder.setQuery(queryBuilder.must(accurateQuery));\n\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        String searchSource;\n        for (SearchHit searchHit : hits)\n        {\n            searchSource = searchHit.getSourceAsString();\n            esDocList.add(JSON.parseObject(searchSource, ElasticSearchDoc.class));\n        }\n        return esDocList;\n    }\n\n    /**\n     * [简要描述]:添加单个<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 文档\n     * @return 添加状态\n     */\n    @Override\n    public boolean addData(ElasticSearchDoc doc)\n    {\n        if (doc == null || StringUtils.isBlank(doc.getId()) || StringUtils.isBlank(doc.getIndex()))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"添加失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        IndexRequestBuilder irb = client.prepareIndex(doc.getIndex(), IDNEX_DEV_TYPE, doc.getId());\n        irb.setSource(JSON.parseObject(JSON.toJSONString(doc), Map.class));\n        bulkRequest.add(irb);\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:批量添加数据<br/>\n     * [详细描述]:\n     *\n     * @param docs 索引文档集\n     * @return 更新结果状态\n     */\n    @Override\n    public boolean addDatas(List<ElasticSearchDoc> docs)\n    {\n        if (CollectionUtils.isEmpty(docs))\n        {\n            log.error(\"Parameter  is null  in ManagerService addDatas() method\");\n            return false;\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        String index;\n        IndexRequestBuilder irb;\n        for (ElasticSearchDoc esDoc : docs)\n        {\n            index = esDoc.getIndex();\n            if (StringUtils.isBlank(index) || StringUtils.isBlank(esDoc.getId()))\n            {\n                continue;\n            }\n            irb = client.prepareIndex(index, IDNEX_DEV_TYPE, esDoc.getId());\n            irb.setSource(JSON.parseObject(JSON.toJSONString(esDoc), Map.class));\n            bulkRequest.add(irb);\n        }\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:ID单个更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    @Override\n    public boolean updateData(ElasticSearchDoc doc)\n    {\n        if (doc == null || StringUtils.isBlank(doc.getId()) || StringUtils.isBlank(doc.getIndex()))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"更新失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        UpdateRequestBuilder urb = client.prepareUpdate(doc.getIndex(), IDNEX_DEV_TYPE, doc.getId());\n\n        urb.setDoc(JSON.parseObject(JSON.toJSONString(doc), Map.class));\n        bulkRequest.add(urb);\n\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:批量更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引文档集\n     * @return 更新状态\n     */\n    @Override\n    public boolean updateDatas(List<ElasticSearchDoc> docs)\n    {\n        if (CollectionUtils.isEmpty(docs))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"批量添加失败，商品不能为空\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        UpdateRequestBuilder urb;\n        String index;\n        for (ElasticSearchDoc esDoc : docs)\n        {\n            index = esDoc.getIndex();\n            if (StringUtils.isBlank(index) || StringUtils.isBlank(esDoc.getId()))\n            {\n                continue;\n            }\n            urb = client.prepareUpdate(index, IDNEX_DEV_TYPE, esDoc.getId());\n            urb.setDoc(JSON.parseObject(JSON.toJSONString(esDoc), Map.class));\n            bulkRequest.add(urb);\n        }\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:通过id修改单个文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    @Override\n    public boolean updateDataById(ElasticSearchDoc doc)\n    {\n        if (null == doc || StringUtils.isBlank(doc.getId()) || StringUtils.isBlank(doc.getIndex()))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"更新失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        if (null != client)\n        {\n            ElasticSearchDoc esDocById = getEsDocById(doc.getId(), doc.getIndex());\n            Map<String, Object> docMap = JSON.parseObject(JSON.toJSONString(doc), Map.class);\n            Map<String, Object> oldDoc = JSON.parseObject(JSON.toJSONString(esDocById), Map.class);\n            if (docMap.containsKey(ESConstants.SALES_TAG_NAME))\n            {\n                // 标签更新处理\n                updateTagNames(oldDoc, docMap);\n            }\n            else\n            {\n                oldDoc.putAll(docMap);\n            }\n            BulkRequestBuilder bulkRequest = client.prepareBulk();\n            UpdateRequestBuilder urb = client.prepareUpdate(doc.getIndex(), IDNEX_DEV_TYPE, doc.getId());\n\n            urb.setDoc(oldDoc);\n            bulkRequest.add(urb);\n\n            BulkResponse bulkResponse = bulkRequest.get();\n            if (bulkResponse.hasFailures())\n            {\n                log.error(bulkResponse.getTook() + \"\");\n                return false;\n            }\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * [简要描述]:根据默认货品编码修改<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    @Override\n    public boolean updateDataByDefProdNo(ElasticSearchDoc doc)\n    {\n        if (null == doc || StringUtils.isBlank(doc.getId()) || StringUtils.isBlank(doc.getIndex()))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"更新失败，索引名称和文档ID不能为空!\");\n        }\n        ElasticSearchDoc esDocById = getEsDocByDefProdNo(doc.getId(), doc.getIndex());\n        if (null == esDocById)\n        {\n            throw new CommonException(SearchException.NOT_FOUND_DOC.getCode(), \"更新失败，更新的文档不存在!\");\n        }\n        Map<String, Object> oldMap = JSON.parseObject(JSON.toJSONString(esDocById), Map.class);\n        oldMap.putAll(JSON.parseObject(JSON.toJSONString(doc), Map.class));\n        String keyId = doc.getId();\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        UpdateRequestBuilder urb = client.prepareUpdate(doc.getIndex(), IDNEX_DEV_TYPE, keyId);\n        urb.setDoc(oldMap);\n        bulkRequest.add(urb);\n\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:批量更新库存状态\n     * [详细描述]:<br/>\n     *\n     * @param allDocs 索引文档集\n     * @return 更新状态\n     */\n    @Override\n    public boolean updateHasStock(List<ElasticSearchDoc> allDocs)\n    {\n        if (CollectionUtils.isEmpty(allDocs))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"批量更新库存失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        UpdateRequestBuilder urb;\n        for (ElasticSearchDoc doc : allDocs)\n        {\n            urb = client.prepareUpdate(doc.getIndex(), IDNEX_DEV_TYPE, doc.getId());\n            urb.setDoc(doc);\n            bulkRequest.add(urb);\n        }\n\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:根据id单个删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    @Override\n    public boolean deleteData(String id, String index)\n    {\n        if (StringUtils.isBlank(id) || StringUtils.isBlank(index))\n        {\n            throw new CommonException(SearchException.PARAM_IS_NULL.getCode(), \"删除失败，索引名称和文档ID不能为空!\");\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        DeleteRequestBuilder drb = client.prepareDelete(index, IDNEX_DEV_TYPE, id);\n        bulkRequest.add(drb);\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"fail Id:\" + id);\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引ID和索引名称集\n     * @return 删除状态\n     */\n    @Override\n    public boolean deleteDatas(List<ElasticSearchDoc> docs)\n    {\n        if (CollectionUtils.isEmpty(docs))\n        {\n            log.error(\"Parameter  is null  in ManagerService deleteDatas() method\");\n            return false;\n        }\n        TransportClient client = esClient.getTransportClient();\n        BulkRequestBuilder bulkRequest = client.prepareBulk();\n        DeleteRequestBuilder drb;\n        for (ElasticSearchDoc doc : docs)\n        {\n            drb = client.prepareDelete(doc.getIndex(), IDNEX_DEV_TYPE, doc.getId());\n            bulkRequest.add(drb);\n        }\n        BulkResponse bulkResponse = bulkRequest.get();\n        if (bulkResponse.hasFailures())\n        {\n            log.error(bulkResponse.getTook() + \"\");\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * [简要描述]:根据商品编号删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品编号\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    @Override\n    public boolean deleteDatasByCommoNo(String commoNo, String index)\n    {\n        return false;\n    }\n\n    private void updateTagNames(Map<String, Object> esDocById, Map<String, Object> docMap)\n    {\n        String desTags = (String) docMap.remove(ESConstants.SALES_TAG_NAME);\n        if (StringUtils.isNotBlank(desTags))\n        {\n            List<String> desTagNames = JSON.parseArray(desTags, String.class);\n            Set<String> dts = new HashSet<>(desTagNames);\n            esDocById.put(ESConstants.SALES_TAG_NAME, JSON.toJSONString(dts));\n        }\n        else\n        {\n            esDocById.put(ESConstants.SALES_TAG_NAME, \"\");\n        }\n        esDocById.putAll(docMap);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/es/service/SearchServiceEsImpl.java",
    "content": "package com.xiao.spring.cloud.search.es.service;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.xiao.spring.cloud.search.dto.*;\nimport com.xiao.spring.cloud.search.es.client.ElasticSearchClient;\nimport com.xiao.spring.cloud.search.es.common.AnalyzeType;\nimport com.xiao.spring.cloud.search.es.common.ESConstants;\nimport com.xiao.spring.cloud.search.es.common.OrderField;\nimport com.xiao.spring.cloud.search.es.log.ISearchLogService;\nimport com.xiao.spring.cloud.search.service.SearchService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse;\nimport org.elasticsearch.action.search.SearchRequestBuilder;\nimport org.elasticsearch.action.search.SearchResponse;\nimport org.elasticsearch.client.transport.TransportClient;\nimport org.elasticsearch.common.lucene.search.function.CombineFunction;\nimport org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;\nimport org.elasticsearch.common.text.Text;\nimport org.elasticsearch.index.query.BoolQueryBuilder;\nimport org.elasticsearch.index.query.MultiMatchQueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;\nimport org.elasticsearch.index.query.functionscore.WeightBuilder;\nimport org.elasticsearch.search.SearchHit;\nimport org.elasticsearch.search.SearchHits;\nimport org.elasticsearch.search.aggregations.AggregationBuilders;\nimport org.elasticsearch.search.aggregations.BucketOrder;\nimport org.elasticsearch.search.aggregations.bucket.terms.Terms;\nimport org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;\nimport org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;\nimport org.elasticsearch.search.fetch.subphase.highlight.HighlightField;\nimport org.elasticsearch.search.sort.SortOrder;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\n\nimport java.time.Duration;\nimport java.time.LocalDateTime;\nimport java.util.*;\n\n/**\n * [简要描述]: 搜索服务ES实现\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 11:01\n * @since JDK 1.8\n */\n@Service\n@Slf4j\npublic class SearchServiceEsImpl implements SearchService, ESConstants\n{\n\n    /**\n     * 日志记录器\n     */\n    private static final Log LOG = LogFactory.getLog(SearchServiceEsImpl.class);\n\n    @Autowired\n    private ElasticSearchClient esClient;\n\n    @Autowired\n    private ISearchLogService searchLogService;\n\n    @Value(\"${elasticsearch.highlight.pretags}\")\n    private String preTags;\n\n    @Value(\"${elasticsearch.highlight.posttags}\")\n    private String postTags;\n\n    @Value(\"${elasticsearch.total}\")\n    private int searchTotal;\n\n    /**\n     * [简要描述]: 因子的权重默认值\n     * [详细描述]: 当后台对因子未设置权重时，该因子的权重设置为默认值0\n     **/\n    private static int weight = 0;\n\n    /**\n     * 日志返回结果最大长度取值\n     */\n    private static final int RESULT_MAX_LENGTH = 5;\n\n    /**\n     * 分析器 0ES默认分词器，1IK中文分词器\n     */\n    @Value(\"${elasticsearch.analyze.type}\")\n    private int analyzeType = 0;\n\n    /**\n     * [简要描述]:搜索<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchRequestDo :\n     * @return PaginationDo\n     * llxiao  2018/10/8 - 11:07\n     **/\n    @Override\n    public SearchCommodityResultDo search(SearchRequestDo searchRequestDo)\n    {\n        if (LOG.isDebugEnabled() && null != searchRequestDo)\n        {\n            LOG.debug(\"Start search data for ES with search params:\" + searchRequestDo);\n        }\n        // 对空值置为null\n\n        LocalDateTime startTime = LocalDateTime.now();\n        SearchLogDo searchLog = new SearchLogDo();\n        searchLog.setStartTime(startTime);\n\n        PaginationDo page = new PaginationDo();\n        TransportClient client = esClient.getTransportClient();\n        if (null != searchRequestDo && StringUtils.isNotBlank(searchRequestDo.getIndex()) && null != client)\n        {\n            // 处理查询\n            processSearch(searchRequestDo, page, client);\n        }\n        else\n        {\n            // 防止调用者空指针\n            page.setResults(new ArrayList<>());\n            LOG.error(\"搜索失败，请求参数及索引及EsClient不能为空!\");\n        }\n        processSearchLog(startTime, searchLog, page);\n\n        return this.paginationDo2CommdityList(page);\n    }\n\n    @Override\n    @Cacheable(value = \"searchMenu\", key = \"'searchMenu'.concat({#searchRequestDo.index}).concat({#searchRequestDo.keyWords}).concat({#searchRequestDo.oprtCatNo})\")\n    public SearchMenusDo searchMenu(SearchRequestDo searchRequestDo)\n    {\n        if (LOG.isDebugEnabled() && null != searchRequestDo)\n        {\n            LOG.debug(\"Start search data for ES with search params:\" + searchRequestDo);\n        }\n\n        SearchMenusDo menu = new SearchMenusDo();\n        TransportClient client = esClient.getTransportClient();\n        if (null != searchRequestDo && StringUtils.isNotBlank(searchRequestDo.getIndex()) && null != client)\n        {\n            // 处理查询\n            processMenu(searchRequestDo, menu, client);\n        }\n        else\n        {\n            LOG.error(\"搜索失败，请求参数及索引及EsClient不能为空!\");\n        }\n        return menu;\n    }\n\n    @Override\n    public long commodityTotal(SearchRequestDo searchRequestDo)\n    {\n        if (LOG.isDebugEnabled() && null != searchRequestDo)\n        {\n            LOG.debug(\"Start search data for ES with search params:\" + searchRequestDo);\n        }\n        LocalDateTime startTime = LocalDateTime.now();\n        SearchLogDo searchLog = new SearchLogDo();\n        searchLog.setStartTime(startTime);\n\n        TransportClient client = esClient.getTransportClient();\n        Long commodityTotal;\n        // 对空值置为null\n        if (null != searchRequestDo && StringUtils.isNotBlank(searchRequestDo.getIndex()) && null != client)\n        {\n            // 处理查询\n            commodityTotal = processCommodityTotal(searchRequestDo, client);\n        }\n        else\n        {\n            commodityTotal = 0L;\n            LOG.error(\"搜索失败，请求参数及索引及EsClient不能为空!\");\n        }\n        processSearchLog(startTime, searchLog, null);\n\n        return commodityTotal;\n    }\n\n    private SearchCommodityResultDo paginationDo2CommdityList(PaginationDo page)\n    {\n        SearchCommodityResultDo searchCommodityResultDo = null;\n        List<ElasticSearchDoc> commodityList;\n        if (null != page)\n        {\n            commodityList = new ArrayList<>();\n            searchCommodityResultDo = new SearchCommodityResultDo();\n            searchCommodityResultDo.setPageNo(page.getPageNo());\n            searchCommodityResultDo.setPageSize(page.getPageSize());\n            searchCommodityResultDo.setTotal(page.getTotal());\n            for (SearchResultDo result : page.getResults())\n            {\n                result.getDoc().setExtProps(\"\");\n                result.getDoc().setSkuProps(\"\");\n                commodityList.add(result.getDoc());\n            }\n            searchCommodityResultDo.setCommodityList(commodityList);\n        }\n\n        searchCommodityResultDo.setPageTotal(\n                (searchCommodityResultDo.getTotal() / searchCommodityResultDo.getPageSize()) + CONSTANT_ONE);\n        return searchCommodityResultDo;\n    }\n\n    private void processSearchLog(LocalDateTime startTime, SearchLogDo searchLog, PaginationDo page)\n    {\n        try\n        {\n            // 日志数据处理\n            LocalDateTime endTime = LocalDateTime.now();\n            searchLog.setEndTime(endTime);\n            searchLog.setResult(resultProcess(page).toString());\n            // 搜索消耗的时间\n            Duration duration = Duration.between(startTime, endTime);\n            searchLog.setCostTime(duration.toMillis());\n            // 日志处理\n            saveLog(searchLog);\n        }\n        catch (Exception e)\n        {\n            // 日志保存处理异常 不能影响到主流程的查询\n            LOG.error(\"Save log error!\", e);\n        }\n    }\n\n    /**\n     * [简要描述]:搜索日志处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchLog\n     */\n    private void saveLog(SearchLogDo searchLog)\n    {\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Search log info:\" + searchLog.toString());\n        }\n        searchLogService.addSearchLog(searchLog);\n    }\n\n    /**\n     * [简要描述]:返回结果处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param page\n     * @return\n     */\n    private PaginationDo resultProcess(PaginationDo page)\n    {\n        PaginationDo pd = new PaginationDo();\n        pd.setPageNo(page.getPageNo());\n        pd.setPageSize(page.getPageSize());\n        pd.setTook(page.getTook());\n        pd.setTotal(page.getTotal());\n        List<SearchResultDo> result = page.getResults();\n\n        if (null != result && result.size() > RESULT_MAX_LENGTH)\n        {\n            pd.setResults(result.subList(0, RESULT_MAX_LENGTH));\n        }\n        else\n        {\n            pd.setResults(result);\n        }\n        return pd;\n    }\n\n    /**\n     * [简要描述]: 处理聚和菜单\n     * [详细描述]:<br/>\n     *\n     * @return void\n     * mjye  2019-02-28 - 16:45\n     **/\n    private void processMenu(SearchRequestDo request, SearchMenusDo menu, TransportClient client)\n    {\n        String index = request.getIndex();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        // 设置是否按查询匹配度排序\n        searchBuilder.setExplain(true);\n\n        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();\n        //权重\n        QueryBuilder functionScoreQueryBuilder = this.getFunctionScoreQueryBuilder(request);\n        boolQuery.must(functionScoreQueryBuilder);\n        // 设置过滤条件\n        setFilters(request, boolQuery);\n        searchBuilder.setFetchSource(new String[] { ES_EXT_PROPS, ES_SKU_PROPS }, null);\n\n        // 设置菜单的品牌、价格、分类\n        this.setMenuInBrandCategorySale(request, boolQuery, menu);\n\n        // 设置查询\n        searchBuilder.setQuery(boolQuery);\n        // 设置排序\n        setOrder(searchBuilder, request);\n        // 执行搜索\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        long took = response.getTook().getMillis();\n        // 普通查询\n        this.processSearchMenu(hits, menu);\n        menu.setTook(took);\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Search result:\" + menu);\n        }\n    }\n\n    /**\n     * [简要描述]:查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request 查询请求\n     * @param page 分页组装数据\n     * 搜索日志\n     * @param client esClient\n     */\n    private void processSearch(SearchRequestDo request, PaginationDo page, TransportClient client)\n    {\n        Integer pageNo = request.getPageNo();\n        Integer pageSize = request.getPageSize();\n        pageNo = null == pageNo ? 1 : pageNo;\n        page.setPageNo(pageNo);\n        pageSize = null == pageSize ? 1 : pageSize;\n        pageSize = pageSize > MAX_PAGE_SIZE ? MAX_PAGE_SIZE : pageSize;\n        page.setPageSize(pageSize);\n\n        String index = request.getIndex();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        // 设置是否按查询匹配度排序\n        searchBuilder.setExplain(true);\n        // 分页信息\n        searchBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize);\n\n        //        FunctionScoreQueryBuilder functionScoreQueryBuilder = this.getFunctionScoreQueryBuilder(request);\n\n        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();\n        //权重\n        QueryBuilder functionScoreQueryBuilder = this.getFunctionScoreQueryBuilder(request);\n        boolQuery.must(functionScoreQueryBuilder);\n        // 设置过滤条件\n        setFilters(request, boolQuery);\n        // 设置查询\n        searchBuilder.setQuery(boolQuery);\n\n        // 设置高亮\n        searchBuilder.highlighter(setHighlightBuilder());\n        // 设置排序\n        setOrder(searchBuilder, request);\n\n        // 执行搜索\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        long took = response.getTook().getMillis();\n        long total = hits.getTotalHits();\n        // 普通查询\n        processSearchResult(page, hits, total);\n        page.setTook(took);\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Search result:\" + page);\n        }\n    }\n\n    /**\n     * [简要描述]: 获取商品总数\n     * [详细描述]:<br/>\n     *\n     * @return int\n     * mjye  2019-03-05 - 14:42\n     **/\n    private long processCommodityTotal(SearchRequestDo request, TransportClient client)\n    {\n        String index = request.getIndex();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();\n        //权重\n        QueryBuilder functionScoreQueryBuilder = this.getFunctionScoreQueryBuilder(request);\n        boolQuery.must(functionScoreQueryBuilder);\n        // 设置过滤条件\n        setFilters(request, boolQuery);\n        // 设置查询\n        searchBuilder.setQuery(boolQuery);\n\n        // 执行搜索\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        return hits.getTotalHits();\n\n    }\n\n    /**\n     * [简要描述]: 设置菜单的品牌名称，分类，价格\n     * [详细描述]: 聚合<br/>\n     *\n     * @return void\n     * mjye  2019-02-26 - 9:58\n     **/\n    private void setMenuInBrandCategorySale(SearchRequestDo request, QueryBuilder query, SearchMenusDo menus)\n    {\n        // 品牌、价格、分类聚合\n        List<String> brandlist = aggregationFunction(request.getIndex(), query, ES_BRAND_NO);\n        List<String> pricelist = aggregationFunction(request.getIndex(), query, SALE_PRICE);\n        List<String> catelist = aggregationFunction(request.getIndex(), query, ES_CATEGORY_NAME);\n        this.getThreeOprtCat(catelist, menus);\n\n    }\n\n    /**\n     * [简要描述]: 对品牌，分类，价格区间进行聚和\n     * [详细描述]:<br/>\n     *\n     * @param index : 索引\n     * @param query : 查询条件\n     * @param column : 聚合字段\n     * @return java.util.List<java.lang.String>\n     * mjye  2019-02-28 - 15:29\n     **/\n    private List<String> aggregationFunction(String index, QueryBuilder query, String column)\n    {\n        TransportClient client = esClient.getTransportClient();\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n\n        if (query == null)\n        {\n            query = QueryBuilders.matchAllQuery();\n        }\n\n        //        if (\"brandName\".equals(column))\n        //        {\n        //            column = column + \".raw\";\n        //        }\n        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms(column).field(column)\n                .order(BucketOrder.key(true)).size((1 << 31) - 1);\n        searchBuilder.setQuery(query).addAggregation(termsAggregationBuilder);\n\n        SearchResponse response = searchBuilder.execute().actionGet();\n\n        Terms terms = response.getAggregations().get(column);\n\n        List<String> list = new ArrayList<>();\n        for (Terms.Bucket bucket : terms.getBuckets())\n        {\n            list.add(bucket.getKey().toString());\n        }\n        return list;\n    }\n\n    /**\n     * [简要描述]:分词查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request 查询请求\n     * @param page 响应数据\n     * @param client ES客户端\n     * @param searchBuilder 查询builder\n     * @return took\n     */\n    private long segmentQuery(SearchRequestDo request, PaginationDo page, TransportClient client,\n            SearchRequestBuilder searchBuilder, SearchMenusDo menus)\n    {\n\n        // IK_SMART-标准分词 IK_MAX_WORD-最大分词 STANDARD-ES默认分词全拆\n        // IK_SMART拆词\n        List<String> openKeywords = this.openedWords(AnalyzeType.IK_SMART, client, request.getKeyWords());\n\n        // 拆词查询\n        searchBuilder.setQuery(setQueryBuilder(openKeywords, request));\n\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        long total = hits.getTotalHits();\n        long took = response.getTook().getMillis();\n        if (total > 0 && total >= searchTotal)\n        {\n            // 数据处理\n            processSearchResult(page, hits, total);\n        }\n        else\n        {\n            // IK MAX WORD拆词\n            openKeywords = this.openedWords(AnalyzeType.IK_MAX_WORD, client, request.getKeyWords());\n            // 拆词查询\n            searchBuilder.setQuery(setQueryBuilder(openKeywords, request));\n\n            response = searchBuilder.execute().actionGet();\n            hits = response.getHits();\n            total = hits.getTotalHits();\n            took = response.getTook().getMillis();\n            if (total > 0 && total >= searchTotal)\n            {\n                // 普通拆词查询\n                processSearchResult(page, hits, total);\n            }\n            else if (STANDARD == this.analyzeType)\n            {\n                // ES默认拆词，全拆\n                openKeywords = this.openedWords(AnalyzeType.STANDARD, client, request.getKeyWords());\n                // 拆词查询\n                searchBuilder.setQuery(setQueryBuilder(openKeywords, request));\n\n                response = searchBuilder.execute().actionGet();\n                hits = response.getHits();\n                total = hits.getTotalHits();\n                took = response.getTook().getMillis();\n                if (total > 0)\n                {\n                    // 处理结果\n                    processSearchResult(page, hits, total);\n                }\n            }\n        }\n\n        return took;\n    }\n\n    /**\n     * [简要描述]:设置排序<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchBuilder SearchRequestBuilder\n     * @param request SearchRequestDo\n     */\n    private void setOrder(SearchRequestBuilder searchBuilder, SearchRequestDo request)\n    {\n        int orderType = request.getSortFeild();\n\n        SortOrder sortOrder = SortOrder.ASC;\n        int sort = request.getSort();\n        if (DESC_SORT == sort)\n        {\n            sortOrder = SortOrder.DESC;\n        }\n\n        if (OrderField.PRICE.getType() == orderType)\n        {\n            // 价格\n            searchBuilder.addSort(SALE_PRICE, sortOrder);\n        }\n        else if (OrderField.SALES.getType() == orderType)\n        {\n            // 销量\n            searchBuilder.addSort(SALES_VOLUME, sortOrder);\n        }\n        else if (OrderField.SLAESTIME.getType() == orderType)\n        {\n            // 上架时间\n            searchBuilder.addSort(SALE_TIME, sortOrder);\n        }\n        else if (OrderField.COMMENTS.getType() == orderType)\n        {\n            // 好评度\n            searchBuilder.addSort(COMMENTS, sortOrder);\n        }\n\n    }\n\n    /**\n     * [简要描述]:分词查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param analyze 分词器类型\n     * @param client ES客户端\n     * @param content 分词内容\n     * @return 拆分后的词\n     */\n    private List<String> openedWords(AnalyzeType analyze, TransportClient client, String content)\n    {\n        List<String> allWorlds = new ArrayList<>();\n        if (StringUtils.isNotBlank(content))\n        {\n            // 指定分词器\n            AnalyzeResponse response = client.admin().indices().prepareAnalyze(content).setAnalyzer(analyze.getType())\n                    .execute().actionGet();\n            List<AnalyzeResponse.AnalyzeToken> tokens = response.getTokens();\n            if (LOG.isDebugEnabled())\n            {\n                LOG.debug(\"ElasticSearch excute analyzeToken result:\" + JSON.toJSONString(tokens));\n            }\n            for (AnalyzeResponse.AnalyzeToken token : tokens)\n            {\n                allWorlds.add(token.getTerm());\n            }\n        }\n\n        return allWorlds;\n    }\n\n    /**\n     * [简要描述]:设置高亮信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchResultDo SearchResultDo\n     * @param searchHit SearchHit\n     */\n    private void setHighlight(SearchResultDo searchResultDo, SearchHit searchHit)\n    {\n        Text[] text;\n        Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();\n        if (highlightFields.containsKey(ES_TITLE_FEILD))\n        {\n            text = highlightFields.get(ES_TITLE_FEILD).getFragments();\n            if (text.length > 0)\n            {\n                searchResultDo.setHighlightTitle(text[0].string());\n            }\n        }\n        if (highlightFields.containsKey(ES_SUBTITLE_FEILD))\n        {\n            text = highlightFields.get(ES_SUBTITLE_FEILD).getFragments();\n            if (text.length > 0)\n            {\n                searchResultDo.setHighlightSubTitle(text[0].string());\n            }\n        }\n    }\n\n    /**\n     * [简要描述]: 处理聚和菜单查询\n     * [详细描述]:<br/>\n     *\n     * @return void\n     * mjye  2019-02-28 - 16:57\n     **/\n    private void processSearchMenu(SearchHits hits, SearchMenusDo menu)\n    {\n        // 数据结果\n        List<SearchResultDo> searchResponses = new ArrayList<>();\n        List<String> searchStrs = new ArrayList<>();\n        SearchResultDo searchResultDo;\n        String searchSource;\n        ElasticSearchDoc esd;\n        // 迭代查询结果\n        for (SearchHit searchHit : hits)\n        {\n            searchResultDo = new SearchResultDo();\n            searchSource = searchHit.getSourceAsString();\n            if (StringUtils.isNotBlank(searchSource))\n            {\n                searchStrs.add(searchSource);\n                esd = JSON.parseObject(searchSource, ElasticSearchDoc.class);\n                esd.setId(searchHit.getId());\n                searchResultDo.setDoc(esd);\n                searchResponses.add(searchResultDo);\n            }\n        }\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Search resource:\" + searchStrs);\n        }\n        this.getMenus(searchResponses, menu);\n    }\n\n    /**\n     * [简要描述]:查询结果处理<br/>\n     * [详细描述]:<br/>\n     *\n     * @param page 分页数据\n     * @param hits 查询数据\n     * @param total 查询总数\n     */\n    private void processSearchResult(PaginationDo page, SearchHits hits, long total)\n    {\n        page.setTotal((int) total);\n        // 数据结果\n        List<SearchResultDo> searchResponses = new ArrayList<>();\n        List<String> searchStrs = new ArrayList<>();\n        SearchResultDo searchResultDo;\n        String searchSource;\n        ElasticSearchDoc esd;\n        // 迭代查询结果\n        for (SearchHit searchHit : hits)\n        {\n            searchResultDo = new SearchResultDo();\n            searchSource = searchHit.getSourceAsString();\n            if (StringUtils.isNotBlank(searchSource))\n            {\n                searchStrs.add(searchSource);\n                esd = JSON.parseObject(searchSource, ElasticSearchDoc.class);\n                esd.setId(searchHit.getId());\n                searchResultDo.setDoc(esd);\n                // 高亮字段\n                setHighlight(searchResultDo, searchHit);\n                searchResponses.add(searchResultDo);\n            }\n        }\n        if (LOG.isDebugEnabled())\n        {\n            LOG.debug(\"Search resource:\" + searchStrs);\n        }\n        page.setResults(searchResponses);\n    }\n\n    /**\n     * [简要描述]:设置高亮信息<br/>\n     * [详细描述]:<br/>\n     *\n     * @return 高亮huilder\n     */\n    private HighlightBuilder setHighlightBuilder()\n    {\n        HighlightBuilder highlightBuilder = new HighlightBuilder().field(\"*\").requireFieldMatch(false);\n        highlightBuilder.preTags(preTags);\n        highlightBuilder.postTags(postTags);\n        //        highlightBuilder.field(\"subTitle\");\n        //        highlightBuilder.field(\"title\");\n        return highlightBuilder;\n    }\n\n    /**\n     * [简要描述]:设置拆词查询条件<br/>\n     * [详细描述]:<br/>\n     *\n     * @param openKeywords 拆词后的关键词\n     * @param request 查询条件\n     * @return QueryBuilder\n     */\n    private QueryBuilder setQueryBuilder(List<String> openKeywords, SearchRequestDo request)\n    {\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n        if (CollectionUtil.isNotEmpty(openKeywords))\n        {\n            QueryBuilder multiMatch;\n            for (String word : openKeywords)\n            {\n                // 关键字 标签 中多字段查询\n                multiMatch = QueryBuilders.multiMatchQuery(word, ESConstants.ES_KEY_WORDS, ESConstants.SALES_TAG_NAME)\n                        .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX).slop(1).tieBreaker(0.3f);\n                queryBuilder.should(multiMatch);\n            }\n            setFilters(request, queryBuilder);\n            return queryBuilder;\n        }\n        return setQueryBuilder(request);\n    }\n\n    /**\n     * [简要描述]:设置查询条件<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request 搜索请求\n     * @return QueryBuilder\n     */\n    private QueryBuilder setQueryBuilder(SearchRequestDo request)\n    {\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n\n        String keyWords = request.getKeyWords();\n        // 匹配多个字段\n        if (StringUtils.isNotBlank(keyWords))\n        {\n            // 关键字和标签匹配查询\n            QueryBuilder multiMatch = QueryBuilders\n                    .multiMatchQuery(keyWords, ES_BRAND_NO, ES_COMMODITY_NO, ES_TITLE, ES_SUB_TITLE, ES_OPRT_CAT_NAME, ES_LABELS, ES_EXT_PROPS, ES_SKU_PROPS, ES_PRODUCT_AREA)\n                    .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);\n            queryBuilder.should(multiMatch);\n        }\n        // 设置过滤条件\n        setFilters(request, queryBuilder);\n\n        return queryBuilder;\n    }\n\n    /**\n     * [简要描述]:设置过滤查询<br/>\n     * [详细描述]:<br/>\n     *\n     * @param request 搜索请求\n     * @param queryBuilder BoolQueryBuilder\n     */\n    private void setFilters(SearchRequestDo request, BoolQueryBuilder queryBuilder)\n    {\n        // 新品不为-1，即有过滤选择\n        if (INVALID_FLAG != request.getNewly())\n        {\n            // 新品过滤\n            queryBuilder.must(QueryBuilders.matchQuery(NEWLY, request.getNewly()));\n        }\n\n        // 分类编号过滤\n        // 仅对从分类入口进入商品列表是有效\n        if (StringUtils.isBlank(request.getKeyWords()) && StringUtils.isNotBlank(request.getOprtCatNo()))\n        {\n            queryBuilder.must(QueryBuilders.matchQuery(ES_CATEGORY_NO, request.getOprtCatNo()));\n        }\n\n        // 是否有货过滤\n        if (INVALID_FLAG != request.getHasStock())\n        {\n            // 无货\n            queryBuilder.must(QueryBuilders.matchQuery(HAS_STOCK, request.getHasStock()));\n        }\n\n        // 商品分类过滤查询\n        if (CollectionUtil.isNotEmpty(request.getCategoryNo()))\n        {\n            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();\n            for (String s : request.getCategoryNo())\n            {\n                boolQueryBuilder.should(QueryBuilders.matchQuery(ES_CATEGORY_NO, s));\n            }\n            queryBuilder.must(boolQueryBuilder);\n        }\n\n        // 商品品牌过滤查询\n        if (CollectionUtil.isNotEmpty(request.getBrandNo()))\n        {\n            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();\n            for (String s : request.getBrandNo())\n            {\n                boolQueryBuilder.should(QueryBuilders.matchQuery(ES_BRAND_NO, s));\n            }\n            queryBuilder.must(boolQueryBuilder);\n        }\n\n        // sku规格属性过滤\n        if (CollectionUtil.isNotEmpty(request.getSkuPropsNo()))\n        {\n            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();\n            for (String s : request.getSkuPropsNo())\n            {\n                boolQueryBuilder.should(QueryBuilders.matchQuery(ES_SKU_PROPS, s));\n            }\n            queryBuilder.must(boolQueryBuilder);\n        }\n\n        // 商品扩展属性过滤\n        if (CollectionUtil.isNotEmpty(request.getExtPropsNo()))\n        {\n            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();\n            for (String s : request.getExtPropsNo())\n            {\n                boolQueryBuilder.should(QueryBuilders.matchQuery(ES_EXT_PROPS, s));\n            }\n            queryBuilder.must(boolQueryBuilder);\n        }\n\n        // 价格区间过滤\n        if (CollectionUtil.isNotEmpty(request.getRangesPrices()))\n        {\n            BoolQueryBuilder priceBoolQuery = QueryBuilders.boolQuery();\n            for (String rangesPrice : request.getRangesPrices())\n            {\n                String[] split = rangesPrice.trim().split(\"-\");\n                Double minPrice = Double.parseDouble(split[CONSTANT_ZERO]);\n                Double maxPrice = Double.parseDouble(split[split.length - CONSTANT_ONE]);\n                if (CONSTANT_TWO == split.length && minPrice < maxPrice)\n                {\n                    priceBoolQuery.should(QueryBuilders.rangeQuery(ESConstants.SALE_PRICE).from(minPrice).to(maxPrice));\n                }\n            }\n            queryBuilder.must(priceBoolQuery);\n        }\n    }\n\n    /**\n     * [简要描述]: 根绝查询到的结果聚合出筛选菜单\n     * [详细描述]:<br/>\n     *\n     * @param searchResponses : 查询到的结果\n     * @return com.purcotton.omni.search.dto.SearchMenusDo\n     * mjye  2019-02-23 - 11:12\n     **/\n    private SearchMenusDo getMenus(List<SearchResultDo> searchResponses, SearchMenusDo menus)\n    {\n        if (CollectionUtil.isNotEmpty(searchResponses))\n        {\n\n            Set<String> brandName = new HashSet<>();\n            Set<String> oprtCatName = new HashSet<>();\n            Set<SearchCommodityPropertyDo> skuProps = new HashSet<>();\n            Set<SearchCommodityPropertyDo> extProps = new HashSet();\n            Set<ShopPriceRangeDto> price = new HashSet();\n            // 业务逻辑代码聚合部分\n            menus.setSkuProps(skuProps);\n            menus.setExtProps(extProps);\n        }\n        return menus;\n    }\n\n    /**\n     * [简要描述]: 获取商品的三级运营分类\n     * [详细描述]:<br/>\n     *\n     * @param catelist : 商品的运营分类\n     * @return java.lang.String\n     * mjye  2019-02-23 - 12:00\n     **/\n    private void getThreeOprtCat(List<String> catelist, SearchMenusDo menus)\n    {\n        Set<SearchCategoryDo> threeOprtCat = null;\n        if (CollectionUtil.isNotEmpty(catelist))\n        {\n            threeOprtCat = new HashSet<>();\n            SearchCategoryDo searchCategoryDo;\n            for (String cate : catelist)\n            {\n                List<String> strings1 = Arrays.asList(cate.split(\",\"));\n                for (String s : strings1)\n                {\n                    searchCategoryDo = new SearchCategoryDo();\n                    String[] split = s.split(\"-\");\n                    searchCategoryDo.setCategoryName(split[CONSTANT_ZERO]);\n                    searchCategoryDo.setCategoryNo(split[split.length - CONSTANT_ONE]);\n                    threeOprtCat.add(searchCategoryDo);\n                }\n            }\n        }\n        menus.setOprtCatName(threeOprtCat);\n    }\n\n    /**\n     * [简要描述]: 根据权重因子查询\n     * [详细描述]:<br/>\n     *\n     * @return org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder\n     * mjye  2019-02-23 - 18:14\n     **/\n    private QueryBuilder getFunctionScoreQueryBuilder(SearchRequestDo request)\n    {\n        //        List<SearchShopWeightDto> searchShopWeightDtos = shopRestService.queryShopWeight(shopWeightDto);\n        // 业务查询权重配置\n        List<SearchShopWeightDto> searchShopWeightDtos = new ArrayList<>();\n        String searchContent = request.getKeyWords();\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n        FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[0];\n\n        // 匹配多个字段\n        if (StringUtils.isNotBlank(request.getKeyWords()))\n        {\n            // 关键字和标签匹配查询\n            QueryBuilder multiMatch = QueryBuilders\n                    .multiMatchQuery(searchContent, ES_TITLE, ES_BRAND_NAME, ES_COMMODITY_NO, ES_SUB_TITLE, ES_OPRT_CAT_NAME, ES_LABELS, ES_EXT_PROPS, ES_SKU_PROPS, ES_PRODUCT_AREA)\n                    .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);\n            queryBuilder.should(multiMatch);\n\n            if (CollectionUtil.isNotEmpty(searchShopWeightDtos))\n            {\n                filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[9];\n                for (int i = 0; i < searchShopWeightDtos.size(); i++)\n                {\n                    queryBuilder.should(QueryBuilders\n                            .matchQuery(searchShopWeightDtos.get(i).getEnglishName(), searchContent));\n                    if (ESConstants.CONSTANT_ZERO <= searchShopWeightDtos.get(i).getWeightFactor())\n                    {\n                        weight = searchShopWeightDtos.get(i).getWeightFactor();\n                    }\n                    filterFunctionBuilders[i] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders\n                            .termQuery(searchShopWeightDtos.get(i).getEnglishName(), searchContent), new WeightBuilder()\n                            .setWeight(weight));\n                }\n                return QueryBuilders.functionScoreQuery(queryBuilder, filterFunctionBuilders)\n                        .scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.MULTIPLY);\n            }\n        }\n        return queryBuilder;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/rest/SearchManagerRestService.java",
    "content": "package com.xiao.spring.cloud.search.rest;\n\nimport com.xiao.springcloud.demo.common.logaspect.LogAnnotation;\nimport com.xiao.spring.cloud.search.dto.ElasticSearchDoc;\nimport com.xiao.spring.cloud.search.service.SearchManangerService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 搜索服务数据管理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 16:22\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/search/manager\")\n@Slf4j\npublic class SearchManagerRestService\n{\n    /*\n     * 搜索管理服务\n     */\n    @Autowired\n    private SearchManangerService searchManangerService;\n\n    /**\n     * [简要描述]:根据id查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 索引文档\n     */\n    @RequestMapping(\"/getById\")\n    @LogAnnotation\n    public ElasticSearchDoc getEsDocById(String id, String index)\n    {\n        return searchManangerService.getEsDocById(id, index);\n    }\n\n    /**\n     * [简要描述]:获取指定索引下所有文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index 索引名称\n     * @return 所有文档\n     */\n    @RequestMapping(\"/getAll\")\n    @LogAnnotation\n    public List<ElasticSearchDoc> getAllDos(String index)\n    {\n        return searchManangerService.getAllDos(index);\n    }\n\n    /**\n     * [简要描述]:根据defProdNo查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param defProdNo 产品ID\n     * @return 产品信息\n     */\n    @RequestMapping(\"/getByProdNo\")\n    @LogAnnotation\n    public ElasticSearchDoc getEsDocByDefProdNo(String defProdNo, String index)\n    {\n        return searchManangerService.getEsDocByDefProdNo(defProdNo, index);\n    }\n\n    /**\n     * [简要描述]:根据商品id查询出商品<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品ID\n     * @return 商品信息\n     */\n    @RequestMapping(\"/getByCommodityNo\")\n    public List<ElasticSearchDoc> getEsDocByCommoNo(String commoNo, String index)\n    {\n        return searchManangerService.getEsDocByCommoNo(commoNo, index);\n    }\n\n    /**\n     * [简要描述]:添加单个<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 文档\n     * @return 添加状态\n     */\n    @RequestMapping(\"/addData\")\n    @LogAnnotation\n    public boolean addData(@RequestBody ElasticSearchDoc doc)\n    {\n        return this.searchManangerService.addData(doc);\n    }\n\n    /**\n     * [简要描述]:批量添加数据<br/>\n     * [详细描述]:\n     *\n     * @param docs 索引文档集\n     * @return 更新结果状态\n     */\n    @RequestMapping(\"/batchAdd\")\n    @LogAnnotation\n    public boolean addDatas(@RequestBody List<ElasticSearchDoc> docs)\n    {\n        return this.searchManangerService.addDatas(docs);\n    }\n\n    /**\n     * [简要描述]:单个更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    @RequestMapping(\"/update\")\n    @LogAnnotation\n    public boolean updateData(ElasticSearchDoc doc)\n    {\n        return this.searchManangerService.updateData(doc);\n    }\n\n    /**\n     * [简要描述]:批量更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引文档集\n     * @return 更新状态\n     */\n    @RequestMapping(\"/batchUpdate\")\n    @LogAnnotation\n    public boolean updateDatas(List<ElasticSearchDoc> docs)\n    {\n        return this.searchManangerService.updateDatas(docs);\n    }\n\n    /**\n     * [简要描述]:通过id修改单个文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    @RequestMapping(\"/updateById\")\n    @LogAnnotation\n    public boolean updateDataById(ElasticSearchDoc doc)\n    {\n        return this.searchManangerService.updateDataById(doc);\n    }\n\n    /**\n     * [简要描述]:批量更新库存状态\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引文档集\n     * @return 更新状态\n     */\n    @RequestMapping(\"/batchUpdateStock\")\n    @LogAnnotation()\n    public boolean updateHasStock(List<ElasticSearchDoc> docs)\n    {\n        return this.searchManangerService.updateHasStock(docs);\n    }\n\n    /**\n     * [简要描述]:根据id单个删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    @RequestMapping(\"/deleteById\")\n    @LogAnnotation\n    public boolean deleteData(String id, String index)\n    {\n        return this.searchManangerService.deleteData(id, index);\n    }\n\n    /**\n     * [简要描述]:ID批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引ID和索引集，主要包含id和Index\n     * @return 删除状态\n     */\n    @RequestMapping(\"/batchDeleteById\")\n    public boolean deleteDatas(List<ElasticSearchDoc> docs)\n    {\n        return this.searchManangerService.deleteDatas(docs);\n    }\n\n    /**\n     * [简要描述]:根据商品编号删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品编号\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    @RequestMapping(\"/deleteByCommoNo\")\n    @LogAnnotation\n    public boolean deleteDataByCommoNo(String commoNo, String index)\n    {\n        return this.searchManangerService.deleteDatasByCommoNo(commoNo, index);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/rest/SearchRestService.java",
    "content": "package com.xiao.spring.cloud.search.rest;\n\nimport com.xiao.spring.cloud.search.dto.SearchCommodityResultDo;\nimport com.xiao.spring.cloud.search.dto.SearchMenusDo;\nimport com.xiao.spring.cloud.search.dto.SearchRequestDo;\nimport com.xiao.spring.cloud.search.service.SearchService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]: 基于springcloud提供搜索rest服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 16:15\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/search\")\n@Slf4j\npublic class SearchRestService\n{\n    @Autowired\n    private SearchService searchService;\n\n    @RequestMapping(\"/keywords\")\n    public SearchCommodityResultDo search(@RequestBody SearchRequestDo searchRequestDo)\n    {\n        //索引为必填\n        if (StringUtils.isBlank(searchRequestDo.getIndex()) || (StringUtils.isBlank(searchRequestDo.getKeyWords())\n                && StringUtils.isBlank(searchRequestDo.getOprtCatNo())))\n        {\n            log.error(\"搜索的index或者keyWords不能为空!\");\n            return new SearchCommodityResultDo();\n        }\n        return searchService.search(searchRequestDo);\n    }\n\n    @RequestMapping(\"/searchMenu\")\n    public SearchMenusDo searchMenu(@RequestBody SearchRequestDo searchRequestDo)\n    {\n        //索引为必填\n        if (StringUtils.isBlank(searchRequestDo.getIndex()) || (StringUtils.isBlank(searchRequestDo.getKeyWords())\n                && StringUtils.isBlank(searchRequestDo.getOprtCatNo())))\n        {\n            log.error(\"搜索的index或者keyWords不能为空!\");\n            return new SearchMenusDo();\n        }\n        return searchService.searchMenu(searchRequestDo);\n    }\n\n    /**\n     * [简要描述]: 根据查询条件获取商品总数\n     * [详细描述]:\n     * @param searchRequestDo : 查询条件\n     * @return int\n     * mjye  2019-03-05 - 14:35\n     **/\n    @RequestMapping(\"/commodityTotal\")\n    public Long commodityTotal(@RequestBody SearchRequestDo searchRequestDo)\n    {\n        //索引为必填\n        if (StringUtils.isBlank(searchRequestDo.getIndex()) || (StringUtils.isBlank(searchRequestDo.getKeyWords())\n                && StringUtils.isBlank(searchRequestDo.getOprtCatNo())))\n        {\n            log.error(\"搜索的index或者keyWords不能为空!\");\n            return 0L;\n        }\n        return searchService.commodityTotal(searchRequestDo);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/service/SearchManangerService.java",
    "content": "package com.xiao.spring.cloud.search.service;\n\nimport com.xiao.spring.cloud.search.dto.ElasticSearchDoc;\n\nimport java.util.List;\n\n/**\n * [简要描述]: 搜索服务管理\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 09:58\n * @since JDK 1.8\n */\npublic interface SearchManangerService\n{\n    /**\n     * [简要描述]:创建索引和默认mapping<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index\n     *            : 索引名称\n     * @return true成功\n     *         llxiao 2018/10/17 - 19:47\n     **/\n    boolean createIndexMapping(String index);\n\n    /**\n     * [简要描述]:索引是否存在<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index\n     *            : 索引名称\n     * @return boolean\n     *         llxiao 2018/10/18 - 8:35\n     **/\n    boolean existsIndex(String index);\n\n    /**\n     * [简要描述]:删除索引<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index\n     *            : 索引名称\n     * @return boolean\n     *         llxiao 2018/10/18 - 8:35\n     **/\n    boolean deleteIndex(String index);\n\n    /**\n     * [简要描述]:根据id查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 索引文档\n     */\n    ElasticSearchDoc getEsDocById(String id, String index);\n\n    /**\n     * [简要描述]:获取指定索引下所有文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param index\n     * @return 所有文档\n     */\n    List<ElasticSearchDoc> getAllDos(String index);\n\n    /**\n     * [简要描述]:根据defProdNo查找doc<br/>\n     * [详细描述]:<br/>\n     *\n     * @param defProdNo 产品ID\n     * @return 产品信息\n     */\n    ElasticSearchDoc getEsDocByDefProdNo(String defProdNo, String index);\n\n    /**\n     * [简要描述]:根据商品id查询出商品<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品ID\n     * @return 商品信息\n     */\n    List<ElasticSearchDoc> getEsDocByCommoNo(String commoNo, String index);\n\n    /**\n     * [简要描述]:添加单个<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 文档\n     * @return 添加状态\n     */\n    boolean addData(ElasticSearchDoc doc);\n\n    /**\n     * [简要描述]:批量添加数据<br/>\n     * [详细描述]:\n     *\n     * @param docs 索引文档集\n     * @return 更新结果状态\n     */\n    boolean addDatas(List<ElasticSearchDoc> docs);\n\n    /**\n     * [简要描述]:单个更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    boolean updateData(ElasticSearchDoc doc);\n\n    /**\n     * [简要描述]:批量更新<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引文档集\n     * @return 更新状态\n     */\n    boolean updateDatas(List<ElasticSearchDoc> docs);\n\n    /**\n     * [简要描述]:通过id修改单个文档<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    boolean updateDataById(ElasticSearchDoc doc);\n\n    /**\n     * [简要描述]:根据默认货品编码修改<br/>\n     * [详细描述]:<br/>\n     *\n     * @param doc 索引文档\n     * @return 更新状态\n     */\n    boolean updateDataByDefProdNo(ElasticSearchDoc doc);\n\n    /**\n     * [简要描述]:批量更新库存状态\n     * [详细描述]:<br/>\n     *\n     * @param allDocs 索引文档集\n     * @return 更新状态\n     */\n    boolean updateHasStock(List<ElasticSearchDoc> allDocs);\n\n    /**\n     * [简要描述]:根据id单个删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param id 索引ID\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    boolean deleteData(String id, String index);\n\n    /**\n     * [简要描述]:ID批量删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param docs 索引ID和索引集\n     * @return 删除状态\n     */\n    boolean deleteDatas(List<ElasticSearchDoc> docs);\n\n    /**\n     * [简要描述]:根据商品编号删除<br/>\n     * [详细描述]:<br/>\n     *\n     * @param commoNo 商品编号\n     * @param index 索引名称\n     * @return 删除状态\n     */\n    boolean deleteDatasByCommoNo(String commoNo, String index);\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/java/com/xiao/spring/cloud/search/service/SearchService.java",
    "content": "package com.xiao.spring.cloud.search.service;\n\nimport com.xiao.spring.cloud.search.dto.SearchCommodityResultDo;\nimport com.xiao.spring.cloud.search.dto.SearchMenusDo;\nimport com.xiao.spring.cloud.search.dto.SearchRequestDo;\n\n/**\n * [简要描述]: 搜索服务\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/8 09:58\n * @since JDK 1.8\n */\npublic interface SearchService\n{\n    /**\n     * [简要描述]:搜索<br/>\n     * [详细描述]:<br/>\n     *\n     * @param searchRequestDo :\n     * @return PaginationDo\n     * llxiao  2018/10/13 - 9:29\n     **/\n    SearchCommodityResultDo search(SearchRequestDo searchRequestDo);\n\n    /**\n     * [简要描述]: 查询聚和菜单\n     * [详细描述]:<br/>\n     * @param searchRequestDo : 查询条件\n     * @return com.purcotton.omni.search.dto.SearchMenusDo\n     * mjye  2019-02-28 - 16:41\n     **/\n    SearchMenusDo searchMenu(SearchRequestDo searchRequestDo);\n\n    /**\n     * [简要描述]: 根据查询条件获取商品总数\n     * [详细描述]:<br/>\n     * @param searchRequestDo : 查询条件\n     * @return int\n     * mjye  2019-03-05 - 14:38\n     **/\n    long commodityTotal(SearchRequestDo searchRequestDo);\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/main/resources/application.yml",
    "content": "server:\n  port: 7770\nelastic:\n  search:\n    #配置集群中的一个节点即可，通过集群名称自动连接其他节点，注意此处的端口为tcp端口不是http的端口，默认会绑定9300\n    host: 172.16.250.52:9300\n    cluster:\n      name: purcotton-test-es\n    total: 2\n    highlight:\n      pretags: <span style=\\\"color:red\\\">\n      posttags: </span>\n    analyze:\n      #0默认分词器，1中文分词器\n      type: 0\neureka:\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n  client:\n    serviceUrl:\n      defaultZone: http://120.77.46.245:8888/eureka/"
  },
  {
    "path": "SpringCloud-SearchService/src/main/resources/bootstrap.yml",
    "content": "spring:\n  #cloud:\n    #config:\n      #uri: http://120.77.46.245:8808/omni-config-server/\n      #profile: @env@\n      #label: master\n      #name: omni-search-service\n  application:\n    name: omni-search-service\n  logstash:\n    kafka-servers: @kafkaServer@\n    logs-topic: @kafkaLogTopic@\nredisson.fileName: redisson-cluster"
  },
  {
    "path": "SpringCloud-SearchService/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration scan=\"true\">\n    <include\n            resource=\"org/springframework/boot/logging/logback/defaults.xml\"/>\n\n    <!-- logback加载优先于application.yml文件，因此需要从bootstrap.yml文件中读取spring.application.name信息 -->\n    <springProperty scope=\"context\" name=\"springAppName\"\n                    source=\"spring.application.name\"/>\n\n    <!-- kafka配置 -->\n    <springProperty scope=\"context\" name=\"kafkaServer\"\n                    source=\"spring.logstash.kafka-servers\"/>\n    <springProperty scope=\"context\" name=\"kafkaLogTopic\"\n                    source=\"spring.logstash.logs-topic\"/>\n\n    <!-- 日志在工程中的输出位置 -->\n    <property name=\"LOG_FILE\"\n              value=\"${BUILD_FOLDER:-build}/${springAppName}\"/>\n\n    <!-- 控制台的日志输出样式 -->\n    <property name=\"CONSOLE_LOG_PATTERN\"\n              value=\"%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\"/>\n\n    <!-- 控制台Appender -->\n    <appender name=\"console\"\n              class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n            <charset>utf8</charset>\n        </encoder>\n    </appender>\n\n    <!-- 发送kafka -->\n    <appender name=\"kafkaAppender\"\n              class=\"com.github.danielwegener.logback.kafka.KafkaAppender\">\n        <encoder\n                class=\"com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder\">\n            <layout class=\"net.logstash.logback.layout.LogstashLayout\">\n                <includeContext>true</includeContext>\n                <includeCallerData>false</includeCallerData>\n                <includeMdc>true</includeMdc>\n                <!-- 自定义属性 -->\n                <!-- <customFields>{\"serverName\":\"${springAppName}\"}</customFields> -->\n                <fieldNames\n                        class=\"net.logstash.logback.fieldnames.ShortenedFieldNames\"/>\n            </layout>\n            <charset>UTF-8</charset>\n        </encoder>\n        <!--kafka topic 需要与配置文件里面的topic一致 否则kafka会沉默并鄙视你 -->\n        <topic>${kafkaLogTopic}</topic>\n        <!-- 路由分区策略，可依据HostName、ContextName、ThreadName、LoggerName，默认NoKey -->\n        <!-- <keyingStrategy -->\n        <!-- class=\"com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy\"\n            /> -->\n        <!-- 交付策略 一种熔断策略(连接不是上默认发送到控制台/AsynchronousDeliveryStrategy)，一种阻塞策略(直到发送成功/BlockingDeliveryStrategy) -->\n        <deliveryStrategy\n                class=\"com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy\"/>\n        <!-- kafka连接地址 -->\n        <producerConfig>bootstrap.servers=${kafkaServer}</producerConfig>\n        <!-- 开启后所有不能快速通过网络抵达kafka集群的消息都会被分发到appender -->\n        <producerConfig>block.on.buffer.full=false</producerConfig>\n\n        <!--  备胎appender,当消息不能发送时，发送到默认控制台，不阻塞主线程 -->\n        <appender-ref ref=\"console\"/>\n    </appender>\n\n    <!-- 使用异步来记录其他信息-->\n    <appender name=\"async\" class=\"ch.qos.logback.classic.AsyncAppender\">\n        <discardingThreshold>0</discardingThreshold>\n        <queueSize>1000</queueSize>\n        <includeCallerData>true</includeCallerData>\n        <appender-ref ref=\"kafkaAppender\"/>\n    </appender>\n\n    <!-- <logger name=\"org.springframework.web\" level=\"ERROR\" /> -->\n    <logger name=\"org.apache.http\" level=\"ERROR\"/>\n    <logger name=\"com.netflix.discovery\" level=\"ERROR\"/>\n    <logger name=\"org.apache.tomcat\" level=\"ERROR\"/>\n    <logger name=\"org.apache.zookeeper\" level=\"ERROR\"/>\n\n    <!-- basis日志输出 -->\n    <logger name=\"com.purcotton.omni\" level=\"info\"\n            additivity=\"false\">\n        <!-- 异步输出到kafka，不能阻塞流程 -->\n        <!--<appender-ref ref=\"async\"/>-->\n        <appender-ref ref=\"console\"/>\n    </logger>\n\n    <root level=\"info\">\n        <appender-ref ref=\"console\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/SearchApplicationTest.java",
    "content": "package com.xiao.springcloud.test;\n\nimport com.xiao.spring.cloud.search.SearchApplication;\nimport org.apache.commons.collections.MapUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.junit.Before;\nimport org.junit.runner.RunWith;\nimport org.mockito.MockitoAnnotations;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport org.springframework.test.context.web.WebAppConfiguration;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.ResultActions;\nimport org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;\nimport org.springframework.test.web.servlet.request.MockMvcRequestBuilders;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\nimport org.springframework.test.web.servlet.setup.MockMvcBuilders;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport java.util.Iterator;\nimport java.util.Map;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/9 11:05\n * @since JDK 1.8\n */\n@RunWith(SpringRunner.class)\n// 单个controller测试\n//@SpringBootTest(classes = MockServletContext.class)\n// 全局 api测试\n@SpringBootTest(classes = SearchApplication.class)\n@WebAppConfiguration\npublic class SearchApplicationTest\n{\n    protected MockMvc mockMvc;\n\n    // 是否打印请求信息\n    protected boolean isPrint;\n\n    // 全局api测试\n    @Autowired\n    private WebApplicationContext context;\n\n    @Before\n    public void setUp() throws Exception\n    {\n        MockitoAnnotations.initMocks(this);\n        // 全局api测试\n        this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();\n        isPrint = false;\n    }\n\n    /**\n     * [简要描述]:post请求<br/>\n     * [详细描述]:KV和JSON参数二者都存在是优先取KV参数<br/>\n     *\n     * @param url : 请求地址\n     * @param params :  请求参数 KV\n     * @param jsonParams :  请求JSON参数\n     * @return org.springframework.test.web.servlet.ResultActions\n     * llxiao  2018/10/9 - 16:44\n     **/\n    protected ResultActions testBasePostApi(String url, Map<String, String> params, String jsonParams) throws Exception\n    {\n        //构建请求\n        MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(url);\n\n        if (MapUtils.isNotEmpty(params))\n        {\n            // 参数请求\n            MultiValueMap<String, String> paramMap = new LinkedMultiValueMap();\n            Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();\n            Map.Entry<String, String> entry;\n            while (iterator.hasNext())\n            {\n                entry = iterator.next();\n                paramMap.add(entry.getKey(), entry.getValue());\n            }\n            request.params(paramMap);\n        }\n        else if (StringUtils.isNotBlank(jsonParams))\n        {\n            request.contentType(MediaType.APPLICATION_JSON_UTF8).content(jsonParams)\n                    .accept(MediaType.APPLICATION_JSON_UTF8);\n        }\n\n        // 发起http请求\n        ResultActions actions = mockMvc.perform(request);\n        if (isPrint)\n        {\n            // 打印出request和response的详细信息，便于调试。\n            actions.andDo(MockMvcResultHandlers.print());\n        }\n        // 期望返回 200\n        actions.andExpect(MockMvcResultMatchers.status().isOk());\n        if (MapUtils.isEmpty(params) && StringUtils.isNotBlank(jsonParams))\n        {\n            // JSON返回处理\n            actions.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8));\n        }\n        return actions;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/SearchManagerTest.java",
    "content": "package com.xiao.springcloud.test;\n\nimport com.xiao.spring.cloud.search.dto.ElasticSearchDoc;\nimport com.xiao.spring.cloud.search.es.client.ElasticSearchClient;\nimport com.xiao.spring.cloud.search.service.SearchManangerService;\nimport org.elasticsearch.action.search.SearchRequestBuilder;\nimport org.elasticsearch.action.search.SearchResponse;\nimport org.elasticsearch.client.transport.TransportClient;\nimport org.elasticsearch.common.lucene.search.function.CombineFunction;\nimport org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;\nimport org.elasticsearch.index.query.BoolQueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilder;\nimport org.elasticsearch.index.query.QueryBuilders;\nimport org.elasticsearch.index.query.functionscore.*;\nimport org.elasticsearch.search.SearchHit;\nimport org.elasticsearch.search.SearchHits;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/9 11:07\n * @since JDK 1.8\n */\npublic class SearchManagerTest extends SearchApplicationTest\n{\n    @Autowired\n    private SearchManangerService searchManangerService;\n\n    @Autowired\n    private ElasticSearchClient esClient;\n\n    @Test\n    public void testGetByCommoNo() throws Exception\n    {\n        this.isPrint = true;\n        String url = \"/search/manager/getById\";\n        Map<String, String> params = new HashMap<>(1);\n        params.put(\"id\", \"002000000662\");\n        params.put(\"index\", \"purcotton\");\n        // 字符串包含Contains\n        //        this.testBasePostApi(url, params, null)\n        //                .andExpect(MockMvcResultMatchers.content().string(new Contains(\"002000000662\")));\n        // json ID处理\n        this.testBasePostApi(url, params, null).andExpect(MockMvcResultMatchers.jsonPath(\"$.id\").value(\"002000000662\"));\n    }\n\n    @Test\n    public void testDel()\n    {\n        searchManangerService.deleteData(\"50101001\", \"10000\");\n        searchManangerService.deleteData(\"50101002\", \"10000\");\n        searchManangerService.deleteData(\"50101003\", \"10000\");\n        searchManangerService.deleteData(\"50101004\", \"10000\");\n    }\n\n    /**\n     * [简要描述]:在Index为10000下查找标题包含“IPhone”,优先取“品牌手机”这个分类，销量越高越前，结果随机给用户展示<br/>\n     * [详细描述]:<br/>\n     * <p>\n     * llxiao  2019/1/31 - 15:44\n     **/\n    @Test\n    public void testFilterQuery()\n    {\n        String searchContent = \"IPhone\";\n        TransportClient client = esClient.getTransportClient();\n        String index = \"10000\";\n        SearchRequestBuilder searchBuilder = client.prepareSearch(index);\n        //分页\n        searchBuilder.setFrom(0).setSize(10);\n        //explain为true表示根据数据相关度排序，和关键字匹配最高的排在前面\n        searchBuilder.setExplain(true);\n\n        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();\n        // 搜索 title字段包含IPhone的数据\n        queryBuilder.must(QueryBuilders.matchQuery(\"title\", searchContent));\n\n        FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[3];\n\n        //过滤条件1：分类为：品牌手机最重要 -- 权重查询Weight\n        ScoreFunctionBuilder<WeightBuilder> scoreFunctionBuilder = new WeightBuilder();\n        scoreFunctionBuilder.setWeight(2);\n        QueryBuilder termQuery = QueryBuilders.termQuery(\"categoryName\", \"品牌手机\");\n        FunctionScoreQueryBuilder.FilterFunctionBuilder category = new FunctionScoreQueryBuilder.FilterFunctionBuilder(termQuery, scoreFunctionBuilder);\n        filterFunctionBuilders[0] = category;\n\n        // 过滤条件2：销量越高越排前 --计分查询 FieldValueFactor\n        ScoreFunctionBuilder<FieldValueFactorFunctionBuilder> fieldValueScoreFunction = new FieldValueFactorFunctionBuilder(\"salesVolume\");\n        ((FieldValueFactorFunctionBuilder) fieldValueScoreFunction).factor(1.2f);\n        FunctionScoreQueryBuilder.FilterFunctionBuilder sales = new FunctionScoreQueryBuilder.FilterFunctionBuilder(fieldValueScoreFunction);\n        filterFunctionBuilders[1] = sales;\n\n        // 给定每个用户随机展示：  --random_score\n        ScoreFunctionBuilder<RandomScoreFunctionBuilder> randomScoreFilter = new RandomScoreFunctionBuilder();\n        ((RandomScoreFunctionBuilder) randomScoreFilter).seed(2);\n        FunctionScoreQueryBuilder.FilterFunctionBuilder random = new FunctionScoreQueryBuilder.FilterFunctionBuilder(randomScoreFilter);\n        filterFunctionBuilders[2] = random;\n\n        // 多条件查询 FunctionScore\n        FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(queryBuilder, filterFunctionBuilders)\n                .scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM);\n        searchBuilder.setQuery(query);\n\n        SearchResponse response = searchBuilder.execute().actionGet();\n        SearchHits hits = response.getHits();\n        String searchSource;\n        for (SearchHit hit : hits)\n        {\n            searchSource = hit.getSourceAsString();\n            System.out.println(searchSource);\n        }\n        //        long took = response.getTook().getMillis();\n        long total = hits.getTotalHits();\n        System.out.println(total);\n\n    }\n\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/SearchTest.java",
    "content": "package com.xiao.springcloud.test;\n\nimport org.junit.Test;\nimport org.springframework.test.web.servlet.ResultActions;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/9 11:07\n * @since JDK 1.8\n */\npublic class SearchTest extends SearchApplicationTest\n{\n\n    @Test\n    public void testSearch() throws Exception\n    {\n        this.isPrint = true;\n        String json = \"{\\\"index\\\":\\\"purcotton\\\",\\\"keyWords\\\":\\\"棉柔巾\\\"}\";\n        ResultActions actions = this.testBasePostApi(\"/search/keywords\", null, json)\n                .andExpect(MockMvcResultMatchers.jsonPath(\"$.pageNo\")\n                        .value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/\n    }\n}\n"
  },
  {
    "path": "SpringCloud-SearchService/src/test/java/com/xiao/springcloud/test/cache/RedisCacheTest.java",
    "content": "package com.xiao.springcloud.test.cache;\n\nimport com.xiao.springcloud.demo.common.cache.service.CacheService;\nimport com.xiao.springcloud.demo.common.cache.service.DistributedService;\nimport com.xiao.springcloud.test.SearchApplicationTest;\nimport org.junit.Test;\nimport org.redisson.api.RLock;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/10/11 20:55\n * @since JDK 1.8\n */\npublic class RedisCacheTest extends SearchApplicationTest\n{\n\n    @Autowired\n    private CacheService cacheService;\n\n    @Autowired\n    private DistributedService distributedService;\n\n    @Test\n    public void testSet()\n    {\n        //cacheService.set(\"cacheTest\", \"hello redisson\");\n        //        System.out.println(cacheService.get(\"cacheTest\"));\n        //        cacheService.set(\"testLock\", \"100\");\n        System.out.println(cacheService.get(\"testLock\"));\n    }\n\n    // 上一步设置 testLock的值为100，两台机器或者两个项目 同时执行该分布式测试方法。确定最终结果不会为负数则锁正常\n    @Test\n    public void testDistributed()\n    {\n        String key = \"lock\";\n        //执行的业务代码\n        for (int i = 0; i < 55; i++)\n        {\n            RLock rLock = this.distributedService.tryLockAutoRelease(key, 60, 60, TimeUnit.SECONDS);\n            int stock = Integer.parseInt(cacheService.get(\"testLock\"));\n            if (stock > 0)\n            {\n                cacheService.set(\"testLock\", (stock - 1) + \"\");\n                System.out.println(\"test2_:lockkey:\" + key + \",stock:\" + (stock - 1) + \"\");\n            }\n            rLock.unlock();\n        }\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/Readme.MD",
    "content": "**SpringBoot + SpringCloud + Feign + Sentinel 集成实现接口限流监控**\n\nSpringBoot版本：1.5.13.RELEASE <br>\nSpringCloud版本：Edgware.SR4 <br>\nSentinel[详情介绍](https://github.com/alibaba/Sentinel)版本：0.1.2.RELEASE 是集成了[spring-cloud-alibaba](https://github.com/alibaba/spring-cloud-alibaba)<br>\n\n[注册中心-eureka](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Sentinel/SpringCloud-Sentinel-Eureka) <br>\n[服务提供-producer](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Sentinel/SpringCloud-Sentinel-Producer) <br>\n[服务消费-consumer](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer) <br>\n[Sentinel Dashbord](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Sentinel/dashbord)<br>\n\nDemo使用说明：\n1. Dashboard启动：\njava -Dserver.port=8080 -jar sentinel-dashboard.jar\n[官网参考](https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0)\n2. 启动erueka --> 启动Producer --> 启动Consumer\n3. 展示图片:\n![Producer](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Sentinel/img/sentinel-dashbord-producer.png)\n![Consumer](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Sentinel/img/sentinel-dashbord-consumer.png)\n\n简要配置说明：\n1. dashboard启动后，客户端接入：<br>\n    ```html\n     properties配置：\n     # Sentinel dashbord 数据交互端口，注意单机多服务部署端口冲突\n     spring.cloud.sentinel.transport.port=8729\n     # sentinel  dashbord地址\n     spring.cloud.sentinel.transport.dashboard=192.168.206.212:8880\n     \n     pom文件引入(自动引入相关依赖包)：\n     <dependency>\n         <groupId>org.springframework.cloud</groupId>\n         <artifactId>spring-cloud-alibaba-sentinel</artifactId>\n         <version>0.1.2.RELEASE</version>\n     </dependency>\n  \n    ```\n2. producer和consumer使用sentinel仅引入 上一步中的**pom**文件即可\n3. feign的支持：\n   ```html\n    pom引入：\n    <dependency>\n        <groupId>org.springframework.cloud</groupId>\n        <artifactId>spring-cloud-starter-openfeign</artifactId>\n        <version>1.4.7.RELEASE</version>\n    </dependency>\n \n    开启sentinel支持\n    # 使用阿里 sentinel监控\n    feign.sentinel.enabled=true\n \n   ```\n\n重要提示：\n1. Sentinel版本要与springboot和springcloud大版本一致，否则会出现不可预见的异常\n2. 接入到dashbord后，要请求下url，然后稍等等个1分钟左右才能到控制台，不要着急\n\n\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/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>SpringCloud-Sentinel</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Sentinel-Consumer</artifactId>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n        <!-- feign 默认集成hystrix ribbon -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-feign</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-hystrix</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-ribbon</artifactId>\n        </dependency>\n\n        <!-- sentinel -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-alibaba-sentinel</artifactId>\n            <version>0.1.2.RELEASE</version>\n        </dependency>\n        <!-- sentinel feign支持 -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-openfeign</artifactId>\n            <version>1.4.7.RELEASE</version>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Edgware.SR4</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n\n</project>"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/java/com/xiao/springcloud/sentinel/consumer/ConsumerApplication.java",
    "content": "package com.xiao.springcloud.sentinel.consumer;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.alibaba.sentinel.annotation.SentinelRestTemplate;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\nimport org.springframework.cloud.netflix.feign.EnableFeignClients;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:27\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableEurekaClient\n@EnableFeignClients\npublic class ConsumerApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ConsumerApplication.class, args);\n    }\n\n    @Bean\n    @SentinelRestTemplate\n    public RestTemplate restTemplate()\n    {\n        return new RestTemplate();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/java/com/xiao/springcloud/sentinel/consumer/api/ConsumerRestService.java",
    "content": "package com.xiao.springcloud.sentinel.consumer.api;\n\nimport com.xiao.springcloud.sentinel.consumer.feign.ProducerFeign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:29\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/consumer\")\npublic class ConsumerRestService\n{\n    @Autowired\n    private ProducerFeign producerFeign;\n\n    @RequestMapping(\"/timeout\")\n    public String timeout(String input)\n    {\n        return producerFeign.timeout(input);\n    }\n\n    @RequestMapping(\"/normal\")\n    public String normal(String input)\n    {\n        return producerFeign.normal(input);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/java/com/xiao/springcloud/sentinel/consumer/config/FeignConfiguration.java",
    "content": "package com.xiao.springcloud.sentinel.consumer.config;\n\nimport com.xiao.springcloud.sentinel.consumer.feign.fallback.ProducerFeignFallBack;\nimport org.springframework.context.annotation.Bean;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 16:11\n * @since JDK 1.8\n */\n//@Configuration\npublic class FeignConfiguration\n{\n    @Bean\n    public ProducerFeignFallBack feignFallBack()\n    {\n        return new ProducerFeignFallBack();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/java/com/xiao/springcloud/sentinel/consumer/feign/ProducerFeign.java",
    "content": "package com.xiao.springcloud.sentinel.consumer.feign;\n\nimport com.xiao.springcloud.sentinel.consumer.config.FeignConfiguration;\nimport com.xiao.springcloud.sentinel.consumer.feign.fallback.ProducerFeignFallBack;\nimport org.springframework.cloud.netflix.feign.FeignClient;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:29\n * @since JDK 1.8\n */\n@Component\n@FeignClient(name = \"sentinel-producer-service\", fallback = ProducerFeignFallBack.class, configuration = FeignConfiguration.class)\n@RequestMapping(\"/api\")\npublic interface ProducerFeign\n{\n    @RequestMapping(\"/timeout\")\n    String timeout(@RequestParam(\"input\") String input);\n\n    @RequestMapping(\"/normal\")\n    String normal(@RequestParam(\"input\") String input);\n}"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/java/com/xiao/springcloud/sentinel/consumer/feign/fallback/ProducerFeignFallBack.java",
    "content": "package com.xiao.springcloud.sentinel.consumer.feign.fallback;\n\nimport com.xiao.springcloud.sentinel.consumer.feign.ProducerFeign;\n\n/**\n * [简要描述]: fallback\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 10:31\n * @since JDK 1.8\n */\npublic class ProducerFeignFallBack implements ProducerFeign\n{\n    @Override\n    public String timeout(String input)\n    {\n        return \"Time out fall back!\";\n    }\n\n    @Override\n    public String normal(String input)\n    {\n        return \"Normal fall back!\";\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/resources/application.properties",
    "content": "### sentinel\nspring.cloud.sentinel.transport.port=8730\n# sentinel  dashbordַ\nspring.cloud.sentinel.transport.dashboard=192.168.206.212:8880\n# ʹð sentinel\nfeign.sentinel.enabled=true\n## رhystrix\n#feign.hystrix.enabled=false"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/resources/application.yml",
    "content": "eureka:\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    lease-expiration-duration-in-seconds: 10\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    lease-renewal-interval-in-seconds: 2\n  client:\n    serviceUrl:\n      defaultZone: http://localhost:8888/eureka/\n      #开启健康检查（需要spring-boot-starter-actuator依赖）\n      #healthcheck:\n       #enable: true\nfeign:\n  #请求和响应进行GZIP压缩，以提高通信效率\n  compression:\n    request:\n      #配置请求GZIP压缩\n      enable: true\n      #配置压缩支持的MIME TYPE\n      mime-types: text/xml,application/xml,application/json\n      #配置压缩数据大小的下限\n      min-request-size: 208\n    #配置响应GZIP压缩\n    response:\n      enable: true\n\nribbon:\n  #设置连接超时时间\n  ConnectTimeout: 600\n  #设置读取超时时间\n  ReadTimeout: 2000\n  #对所有操作请求都进行重试\n  OkToRetryOnAllOperations: true\n  #切换实例的重试次数\n  MaxAutoRetriesNextServer: 2\n  #对当前实例的重试次数\n  MaxAutoRetries: 1\n\n# 设置针对hello-service服务的连接超时时间\n#hello-service.ribbon.ConnectTimeout=600\n# 设置针对hello-service服务的读取超时时间\n#hello-service.ribbon.ReadTimeout=6000\n# 设置针对hello-service服务所有操作请求都进行重试\n#hello-service.ribbon.OkToRetryOnAllOperations=true\n# 设置针对hello-service服务切换实例的重试次数\n#hello-service.ribbon.MaxAutoRetriesNextServer=2\n# 设置针对hello-service服务的当前实例的重试次数\n#hello-service.ribbon.MaxAutoRetries=1\n\nhystrix:\n  # 线程池\n  threadpool:\n    default:\n      coreSize: 10\n  command:\n    default:\n      #fallback:\n        # 是否关闭回退方法\n        #enable: true\n      execution:\n        #关闭超时熔断功能\n        #timeout:\n         #enable: false\n        isolation:\n          thread:\n            #设置熔断超时时间，默认1S，容易出现 fallback available 异常\n            timeoutInMilliseconds: 5000\n# 设置熔断超时时间，针对接口设置，比如/hello接口\n#hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=10000\n# 关闭熔断功能\n#hystrix.command.hello.execution.timeout.enabled=false\n\n\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Consumer/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8082\nspring:\n  application:\n    name: sentinel-consumer-service"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Eureka/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>SpringCloud-Sentinel</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Sentinel-Eureka</artifactId>\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka-server</artifactId>\n        </dependency>\n    </dependencies>\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Edgware.SR4</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Eureka/src/main/java/com.xiao.springcloud.sentinel.eureka/EurekaApplication.java",
    "content": "package com.xiao.springcloud.sentinel.eureka;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:40\n * @since JDK 1.8\n */\n@SpringBootApplication\n@EnableEurekaServer\npublic class EurekaApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(EurekaApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Eureka/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8888\nspring:\n  application:\n    name: sentinel-eureka-server\neureka:\n  instance:\n    hostname: localhost\n    prefer-ip-address: true\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n  client:\n    register-with-eureka: true\n    fetch-registry: false\n    service-url:\n      defaultZone: http://localhost:8888/eureka/\n  server:\n    ##以下配置，生产环境不建议使用\n    ###自我保护机制关闭\n    enable-self-preservation: false\n    ## 清理间隔（单位毫秒，默认是60*1000）\n    eviction-interval-timer-in-ms: 2000\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/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>SpringCloud-Sentinel</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Sentinel-Producer</artifactId>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <maven.compiler.target>1.8</maven.compiler.target>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <!--排除这个slf4j-log4j12-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-eureka</artifactId>\n        </dependency>\n\n        <!-- sentinel -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-alibaba-sentinel</artifactId>\n            <version>0.1.2.RELEASE</version>\n        </dependency>\n    </dependencies>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.cloud</groupId>\n                <artifactId>spring-cloud-dependencies</artifactId>\n                <version>Edgware.SR4</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/java/com/xiao/springcloud/sentinel/producer/ProducerApplication.java",
    "content": "package com.xiao.springcloud.sentinel.producer;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:46\n * @since JDK 1.8\n */\n@SpringBootApplication()\n@EnableEurekaClient\npublic class ProducerApplication\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(ProducerApplication.class, args);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/java/com/xiao/springcloud/sentinel/producer/api/ProducerRestService.java",
    "content": "package com.xiao.springcloud.sentinel.producer.api;\n\nimport com.xiao.springcloud.sentinel.producer.service.ProducerService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:55\n * @since JDK 1.8\n */\n@RestController\n@RequestMapping(\"/api\")\npublic class ProducerRestService\n{\n    @Autowired\n    private ProducerService producerService;\n\n    @RequestMapping(\"/timeout\")\n    public String timeout(String input)\n    {\n        return this.producerService.timeout(input);\n    }\n\n    @RequestMapping(\"/normal\")\n    public String normal(String input)\n    {\n        return this.producerService.normal(input);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/java/com/xiao/springcloud/sentinel/producer/service/ProducerService.java",
    "content": "package com.xiao.springcloud.sentinel.producer.service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:56\n * @since JDK 1.8\n */\npublic interface ProducerService\n{\n    /**\n     * [简要描述]:超时APi模拟<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:57\n     **/\n    String timeout(String input);\n\n    /**\n     * [简要描述]:正常APi<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:59\n     **/\n    String normal(String input);\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/java/com/xiao/springcloud/sentinel/producer/service/impl/ProducerServiceImpl.java",
    "content": "package com.xiao.springcloud.sentinel.producer.service.impl;\n\nimport com.xiao.springcloud.sentinel.producer.service.ProducerService;\nimport org.springframework.stereotype.Service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2019/8/1 09:57\n * @since JDK 1.8\n */\n@Service\npublic class ProducerServiceImpl implements ProducerService\n{\n    /**\n     * [简要描述]:超时APi模拟<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:57\n     **/\n    @Override\n    public String timeout(String input)\n    {\n        try\n        {\n            // 模拟超时2S钟\n            Thread.sleep(4000);\n        }\n        catch (InterruptedException e)\n        {\n            e.printStackTrace();\n        }\n        return \"producer timeout: \" + input;\n    }\n\n    /**\n     * [简要描述]:正常APi<br/>\n     * [详细描述]:<br/>\n     *\n     * @param input :\n     * @return java.lang.String\n     * llxiao  2019/8/1 - 9:59\n     **/\n    @Override\n    public String normal(String input)\n    {\n        return \"producer normal: \" + input;\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/resources/application.properties",
    "content": "# Sentinel dashbord ݽ˿\nspring.cloud.sentinel.transport.port=8729\n# sentinel  dashbordַ\nspring.cloud.sentinel.transport.dashboard=192.168.206.212:8880"
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/resources/application.yml",
    "content": ""
  },
  {
    "path": "SpringCloud-Sentinel/SpringCloud-Sentinel-Producer/src/main/resources/bootstrap.yml",
    "content": "server:\n  port: 8081\nspring:\n  application:\n    name: sentinel-producer-service\neureka:\n  instance:\n    hostname: localhost\n    instance-id: ${spring.cloud.client.ipAddress}:${server.port}\n    prefer-ip-address: true\n    ##设置心跳的周期间隔(默认90s)[如果10s没响应默认服务宕机]\n    lease-expiration-duration-in-seconds: 10\n    #设置心跳时间间隔(默认30s)[心跳时间2s]\n    lease-renewal-interval-in-seconds: 2\n  client:\n    serviceUrl:\n      defaultZone: http://localhost:8888/eureka/\n      #开启健康检查（需要spring-boot-starter-actuator依赖）\n      #healthcheck:\n      #enable: true\nlogging:\n  level: debug"
  },
  {
    "path": "SpringCloud-Sentinel/dashbord/readme.md",
    "content": "启动方式： <br>\njava -Dserver.port=8080 -jar sentinel-dashboard.jar\n[官网参考](https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0)"
  },
  {
    "path": "SpringCloud-Sentinel/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Sentinel</artifactId>\n    <packaging>pom</packaging>\n    <modules>\n        <module>SpringCloud-Sentinel-Eureka</module>\n        <module>SpringCloud-Sentinel-Producer</module>\n        <module>SpringCloud-Sentinel-Consumer</module>\n    </modules>\n</project>"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <properties>\n        <sharding-sphere.version>3.0.0</sharding-sphere.version>\n        <mybatis.version>3.5.6</mybatis.version>\n        <mybatis-spring.version>1.3.0</mybatis-spring.version>\n        <mysql-connector-java.version>8.0.28</mysql-connector-java.version>\n    </properties>\n\n    <artifactId>SpringCloud-Sharding-Sphere</artifactId>\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <version>${mysql-connector-java.version}</version>\n        </dependency>\n\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        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n            <version>${mybatis-spring.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>io.shardingsphere</groupId>\n            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>\n            <version>${sharding-sphere.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.4</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid</artifactId>\n            <version>1.1.10</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${artifactId}</finalName>\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>**/*.yml</include>\n                    <include>**/*.properties</include>\n                    <include>META-INF/**</include>\n                </includes>\n            </resource>\n        </resources>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/SpringBootStarterExample.java",
    "content": "package com.purcotton.sharding.sphere.demo;\n\nimport com.purcotton.sharding.sphere.demo.service.CommonService;\nimport com.purcotton.sharding.sphere.demo.service.impl.SpringPojoServiceImpl;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.ConfigurableApplicationContext;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:23\n * @since JDK 1.8\n */\n@MapperScan(basePackages = \"com.purcotton.sharding.sphere.demo.repository\")\n@SpringBootApplication\npublic class SpringBootStarterExample\n{\n    public static void main(final String[] args)\n    {\n        try (ConfigurableApplicationContext applicationContext = SpringApplication\n                .run(SpringBootStarterExample.class, args))\n        {\n            process(applicationContext);\n        }\n    }\n\n    private static void process(final ConfigurableApplicationContext applicationContext)\n    {\n        CommonService commonService = getCommonService(applicationContext);\n//        commonService.initEnvironment();\n        commonService.processSuccess(false);\n//        try\n//        {\n//            commonService.processFailure();\n//        }\n//        catch (final Exception ex)\n//        {\n//            System.out.println(ex.getMessage());\n//            commonService.printData(false);\n//        }\n//        finally\n//        {\n//            commonService.cleanEnvironment();\n//        }\n    }\n\n    private static CommonService getCommonService(final ConfigurableApplicationContext applicationContext)\n    {\n        return applicationContext.getBean(SpringPojoServiceImpl.class);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/entity/Order.java",
    "content": "package com.purcotton.sharding.sphere.demo.entity;\n\nimport lombok.Data;\nimport lombok.ToString;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\n\nimport java.io.Serializable;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:07\n * @since JDK 1.8\n */\n@Data\npublic class Order implements Serializable\n{\n    private long orderId;\n    private int userId;\n    private String status;\n\n    @Override\n    public String toString()\n    {\n        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/entity/OrderItem.java",
    "content": "package com.purcotton.sharding.sphere.demo.entity;\n\nimport lombok.Data;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\n\nimport java.io.Serializable;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:11\n * @since JDK 1.8\n */\n@Data\npublic class OrderItem implements Serializable\n{\n    private long orderItemId;\n    private long orderId;\n    private int userId;\n    private String status;\n\n    @Override\n    public String toString()\n    {\n        return ToStringBuilder.reflectionToString(this);\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/repository/CommonRepository.java",
    "content": "package com.purcotton.sharding.sphere.demo.repository;\n\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:12\n * @since JDK 1.8\n */\npublic interface CommonRepository<T>\n{\n    void createTableIfNotExists();\n\n    void dropTable();\n\n    void truncateTable();\n\n    Long insert(T entity);\n\n    void delete(Long id);\n\n    List<T> selectAll();\n\n    List<T> selectRange();\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/repository/OrderItemRepository.java",
    "content": "package com.purcotton.sharding.sphere.demo.repository;\n\nimport com.purcotton.sharding.sphere.demo.entity.OrderItem;\nimport org.apache.ibatis.annotations.Mapper;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:13\n * @since JDK 1.8\n */\n@Mapper\npublic interface OrderItemRepository extends CommonRepository<OrderItem>\n{\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/repository/OrderRepository.java",
    "content": "package com.purcotton.sharding.sphere.demo.repository;\n\nimport com.purcotton.sharding.sphere.demo.entity.Order;\nimport org.apache.ibatis.annotations.Mapper;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:13\n * @since JDK 1.8\n */\n@Mapper\npublic interface OrderRepository extends CommonRepository<Order>\n{\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/service/BasisCommonService.java",
    "content": "package com.purcotton.sharding.sphere.demo.service;\n\nimport com.purcotton.sharding.sphere.demo.entity.Order;\nimport com.purcotton.sharding.sphere.demo.entity.OrderItem;\nimport com.purcotton.sharding.sphere.demo.repository.OrderItemRepository;\nimport com.purcotton.sharding.sphere.demo.repository.OrderRepository;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:15\n * @since JDK 1.8\n */\npublic abstract class BasisCommonService implements CommonService\n{\n    @Override\n    public void initEnvironment()\n    {\n        getOrderRepository().createTableIfNotExists();\n        getOrderItemRepository().createTableIfNotExists();\n        getOrderRepository().truncateTable();\n        getOrderItemRepository().truncateTable();\n    }\n\n    @Override\n    public void cleanEnvironment()\n    {\n        getOrderRepository().dropTable();\n        getOrderItemRepository().dropTable();\n    }\n\n    @Transactional\n    @Override\n    public void processSuccess(final boolean isRangeSharding)\n    {\n        System.out.println(\"-------------- Process Success Begin ---------------\");\n        List<Long> orderIds = insertData();\n        printData(isRangeSharding);\n        //deleteData(orderIds);\n        //printData(isRangeSharding);\n        System.out.println(\"-------------- Process Success Finish --------------\");\n    }\n\n    @Transactional\n    @Override\n    public void processFailure()\n    {\n        System.out.println(\"-------------- Process Failure Begin ---------------\");\n        insertData();\n        System.out.println(\"-------------- Process Failure Finish --------------\");\n        throw new RuntimeException(\"Exception occur for transaction test.\");\n    }\n\n    private List<Long> insertData()\n    {\n        System.out.println(\"---------------------------- Insert Data ----------------------------\");\n        List<Long> result = new ArrayList<>(10);\n        for (int i = 1; i <= 10; i++)\n        {\n            Order order = newOrder();\n            order.setUserId(i);\n            order.setStatus(\"INSERT_TEST\");\n            getOrderRepository().insert(order);\n            OrderItem item = newOrderItem();\n            item.setOrderId(order.getOrderId());\n            item.setUserId(i);\n            item.setStatus(\"INSERT_TEST\");\n            getOrderItemRepository().insert(item);\n            result.add(order.getOrderId());\n        }\n        return result;\n    }\n\n    private void deleteData(final List<Long> orderIds)\n    {\n        System.out.println(\"---------------------------- Delete Data ----------------------------\");\n        for (Long each : orderIds)\n        {\n            getOrderRepository().delete(each);\n            getOrderItemRepository().delete(each);\n        }\n    }\n\n    @Override\n    public void printData(final boolean isRangeSharding)\n    {\n        if (isRangeSharding)\n        {\n            printDataRange();\n        }\n        else\n        {\n            printDataAll();\n        }\n    }\n\n    private void printDataRange()\n    {\n        System.out.println(\"---------------------------- Print Order Data -----------------------\");\n        for (Object each : getOrderRepository().selectRange())\n        {\n            System.out.println(each);\n        }\n        System.out.println(\"---------------------------- Print OrderItem Data -------------------\");\n        for (Object each : getOrderItemRepository().selectRange())\n        {\n            System.out.println(each);\n        }\n    }\n\n    private void printDataAll()\n    {\n        System.out.println(\"---------------------------- Print Order Data -----------------------\");\n        for (Object each : getOrderRepository().selectAll())\n        {\n            System.out.println(each);\n        }\n        System.out.println(\"---------------------------- Print OrderItem Data -------------------\");\n        for (Object each : getOrderItemRepository().selectAll())\n        {\n            System.out.println(each);\n        }\n    }\n\n    protected abstract OrderRepository getOrderRepository();\n\n    protected abstract OrderItemRepository getOrderItemRepository();\n\n    protected abstract Order newOrder();\n\n    protected abstract OrderItem newOrderItem();\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/service/CommonService.java",
    "content": "package com.purcotton.sharding.sphere.demo.service;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:14\n * @since JDK 1.8\n */\npublic interface CommonService\n{\n    void initEnvironment();\n    void cleanEnvironment();\n    void processSuccess(boolean isRangeSharding);\n    void processFailure();\n    void printData(boolean isRangeSharding);\n\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/java/com/purcotton/sharding/sphere/demo/service/impl/SpringPojoServiceImpl.java",
    "content": "package com.purcotton.sharding.sphere.demo.service.impl;\n\nimport com.purcotton.sharding.sphere.demo.entity.Order;\nimport com.purcotton.sharding.sphere.demo.entity.OrderItem;\nimport com.purcotton.sharding.sphere.demo.repository.OrderItemRepository;\nimport com.purcotton.sharding.sphere.demo.repository.OrderRepository;\nimport com.purcotton.sharding.sphere.demo.service.BasisCommonService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\n\n/**\n * [简要描述]:\n * [详细描述]:\n *\n * @author llxiao\n * @version 1.0, 2018/11/14 11:25\n * @since JDK 1.8\n */\n@Service\n@Transactional\npublic class SpringPojoServiceImpl extends BasisCommonService\n{\n    @Resource\n    private OrderRepository orderRepository;\n\n    @Resource\n    private OrderItemRepository orderItemRepository;\n\n    @Override\n    protected OrderRepository getOrderRepository()\n    {\n        return orderRepository;\n    }\n\n    @Override\n    protected OrderItemRepository getOrderItemRepository()\n    {\n        return orderItemRepository;\n    }\n\n    @Override\n    protected Order newOrder()\n    {\n        return new Order();\n    }\n\n    @Override\n    protected OrderItem newOrderItem()\n    {\n        return new OrderItem();\n    }\n}\n"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/META-INF/mappers/OrderItemMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.purcotton.sharding.sphere.demo.repository.OrderItemRepository\">\n    <resultMap id=\"baseResultMap\" type=\"com.purcotton.sharding.sphere.demo.entity.OrderItem\">\n        <result column=\"order_item_id\" property=\"orderItemId\" jdbcType=\"INTEGER\"/>\n        <result column=\"order_id\" property=\"orderId\" jdbcType=\"INTEGER\"/>\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"INTEGER\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"VARCHAR\"/>\n    </resultMap>\n\n    <!-- DML -->\n    <update id=\"createTableIfNotExists\">\n        CREATE TABLE IF NOT EXISTS\n        t_order_item (order_item_id BIGINT AUTO_INCREMENT, order_id BIGINT, user_id INT NOT NULL, status VARCHAR(50) , PRIMARY KEY (order_item_id));\n    </update>\n\n    <update id=\"truncateTable\">\n        TRUNCATE TABLE t_order_item;\n    </update>\n\n    <update id=\"dropTable\">\n        DROP TABLE IF EXISTS t_order_item;\n    </update>\n\n    <!-- DDL -->\n    <insert id=\"insert\" useGeneratedKeys=\"true\" keyProperty=\"orderItemId\">\n        INSERT INTO t_order_item (order_id, user_id, status) VALUES (#{orderId,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{status,jdbcType=VARCHAR});\n    </insert>\n\n    <delete id=\"delete\">\n        DELETE FROM t_order_item WHERE order_id = #{orderId,jdbcType=INTEGER};\n    </delete>\n\n    <!-- DQL -->\n    <select id=\"selectAll\" resultMap=\"baseResultMap\">\n        SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id;\n    </select>\n\n    <select id=\"selectRange\" resultMap=\"baseResultMap\">\n        SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id AND o.user_id BETWEEN 1 AND 5\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/META-INF/mappers/OrderMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.purcotton.sharding.sphere.demo.repository.OrderRepository\">\n    <resultMap id=\"baseResultMap\" type=\"com.purcotton.sharding.sphere.demo.entity.Order\">\n        <result column=\"order_id\" property=\"orderId\" jdbcType=\"INTEGER\"/>\n        <result column=\"user_id\" property=\"userId\" jdbcType=\"INTEGER\"/>\n        <result column=\"status\" property=\"status\" jdbcType=\"VARCHAR\"/>\n    </resultMap>\n\n    <!-- DML -->\n    <update id=\"createTableIfNotExists\">\n        CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));\n    </update>\n\n    <update id=\"truncateTable\">\n        TRUNCATE TABLE t_order;\n    </update>\n\n    <update id=\"dropTable\">\n        DROP TABLE IF EXISTS t_order;\n    </update>\n\n    <!-- DDL -->\n    <insert id=\"insert\" useGeneratedKeys=\"true\" keyProperty=\"orderId\">\n        INSERT INTO t_order (user_id, status) VALUES (#{userId,jdbcType=INTEGER}, #{status,jdbcType=VARCHAR});\n    </insert>\n\n    <delete id=\"delete\">\n        DELETE FROM t_order WHERE order_id = #{orderId,jdbcType=INTEGER};\n    </delete>\n\n    <!-- DQL -->\n    <select id=\"selectAll\" resultMap=\"baseResultMap\">\n        SELECT * FROM t_order;\n    </select>\n\n    <select id=\"selectRange\" resultMap=\"baseResultMap\">\n        SELECT * FROM t_order WHERE order_id BETWEEN 200000000000000000 AND 400000000000000000\n    </select>\n</mapper>"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/META-INF/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<configuration>\n    <mappers>\n        <mapper resource=\"META-INF/mappers/OrderMapper.xml\"/>\n        <mapper resource=\"META-INF/mappers/OrderItemMapper.xml\"/>\n    </mappers>\n</configuration>"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/application-sharding-databases.properties",
    "content": "sharding.jdbc.datasource.names=ds_0,ds_1\n\nsharding.jdbc.datasource.ds_0.type=com.alibaba.druid.pool.DruidDataSource\nsharding.jdbc.datasource.ds_0.driver-class-name=com.mysql.jdbc.Driver\nsharding.jdbc.datasource.ds_0.url=jdbc:mysql://192.168.206.210:3306/db_0?useSSL=false\nsharding.jdbc.datasource.ds_0.username=admin\nsharding.jdbc.datasource.ds_0.password=Admin@123\n\nsharding.jdbc.datasource.ds_1.type=com.alibaba.druid.pool.DruidDataSource\nsharding.jdbc.datasource.ds_1.driver-class-name=com.mysql.jdbc.Driver\nsharding.jdbc.datasource.ds_1.url=jdbc:mysql://192.168.206.210:3306/db_1?useSSL=false\nsharding.jdbc.datasource.ds_1.username=admin\nsharding.jdbc.datasource.ds_1.password=Admin@123\n\n##ĬϷֿ ûID2ȡĪֲͬĿ\nsharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id\nsharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds_$->{user_id % 2}\n\n##ֱ\nsharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds_$->{0..1}.t_order\nsharding.jdbc.config.sharding.tables.t_order.key-generator-column-name=order_id\nsharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds_$->{0..1}.t_order_item\nsharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/application.properties",
    "content": "spring.profiles.active=sharding-databases\n#spring.profiles.active=sharding-tables\n#spring.profiles.active=sharding-databases-tables\n#spring.profiles.active=master-slave\n#spring.profiles.active=sharding-master-slave\n\nmybatis.config-location=classpath:META-INF/mybatis-config.xml"
  },
  {
    "path": "SpringCloud-Sharding-Sphere/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <property name=\"log.context.name\" value=\"sharding-jdbc-springboot-mybatis\"/>\n    <property name=\"log.charset\" value=\"UTF-8\"/>\n    <property name=\"log.pattern\" value=\"[%-5level] %date --%thread-- [%logger] %msg %n\"/>\n    <contextName>${log.context.name}</contextName>\n\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder charset=\"${log.charset}\">\n            <pattern>${log.pattern}</pattern>\n        </encoder>\n    </appender>\n    <root>\n        <level value=\"INFO\"/>\n        <appender-ref ref=\"STDOUT\"/>\n    </root>\n</configuration>"
  },
  {
    "path": "SpringCloud-ZipkinServer/README.md",
    "content": "**SpringCloud Sleuth Stream Zipkin Kafka Elasticsearch 实现简单链路跟踪**  \n\n_注意版本号zipkin使用的是2.4.2，SpringCloud版本Dalston.SR5_\n1. **服务端主要配置**<br>\n**pom配置:**:\n```$xslt\n<!-- zipkin + kafka +es -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-zipkin</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-stream-binder-kafka</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-ui</artifactId>\n            <version>${zipkin.version}</version>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.zipkin.java</groupId>\n            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>\n            <version>${zipkin.version}</version>\n        </dependency>\n```\n**配置文件 application.properties:**\n```$xslt\n#采样率，推荐0.1，百分之百收集的话存储可能扛不住\nspring.sleuth.sampler.percentage=1\nspring.sleuth.enabled=false\nmaxHttpHeaderSize=8192\n\n### kafka链接和zk的链接\nspring.cloud.stream.kafka.binder.brokers=192.168.206.203:9092\nspring.cloud.stream.kafka.binder.zkNodes=192.168.206.203:2181 \n\n## 使用es做存储\nzipkin.storage.StorageComponent=elasticsearch\nzipkin.storage.type=elasticsearch\nzipkin.storage.elasticsearch.hosts=192.168.206.204:9200\n#es集群名称\nzipkin.storage.elasticsearch.cluster=zipkin-es\nzipkin.storage.elasticsearch.index=zipkin-db\nzipkin.storage.elasticsearch.index-shards=5\nzipkin.storage.elasticsearch.index-replicas=1\n```\n**启动注解:**\n```$xslt\n@EnableZipkinStreamServer\n```\n代码参考[SpringCloud-ZipkinServer](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-ZipkinServer)\n\n2.**客户端配置**<br>\n**pom配置:**\n```$xslt\n <!-- zipkin服务 改造 sleuth stream + zipkin  + es + kafka -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-stream-binder-kafka</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-sleuth-stream</artifactId>\n        </dependency>\n```\n**参数配置application.properties:**\n```$xslt\n### spring 配置\nspring:\n  ##  zipkin 链路跟踪配置\n  sleuth:\n    enabled: true\n    #采样率，越高会有性能影响\n    sampler:\n      percentage: 1.0\n  cloud:\n    ## kafka zk配置 配合zipkin\n    stream:\n      kafka:\n        binder:\n          brokers: 192.168.206.203:9092\n          zkNodes: 192.168.206.203:2181\n```\n代码参考[SpringCloud-Provider](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Provider)和[SpringCloud-Consumer](https://github.com/Xlinlin/SpringCloud-Demo/tree/master/SpringCloud-Consumer)<br>\n\n\n[更多参考资料](https://www.jianshu.com/p/d2a71e242ca8)"
  },
  {
    "path": "SpringCloud-ZipkinServer/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n    <modelVersion>4.0.0</modelVersion>\r\n    <parent>\r\n        <groupId>com.xiao.skywalking.demo</groupId>\r\n        <artifactId>SpringCloud-Demo</artifactId>\r\n        <version>0.0.1-SNAPSHOT</version>\r\n    </parent>\r\n    <artifactId>SpringCloud-ZipkinServer</artifactId>\r\n    <description>服务链路跟踪服务端</description>\r\n\r\n    <properties>\r\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n        <java.version>1.8</java.version>\r\n        <!--<spring-cloud.version>Dalston.RC1</spring-cloud.version>-->\r\n        <spring-cloud.version>Dalston.SR5</spring-cloud.version>\r\n        <zipkin.version>2.4.2</zipkin.version>\r\n    </properties>\r\n\r\n    <dependencies>\r\n        <!--<dependency>-->\r\n        <!--<groupId>org.springframework.cloud</groupId>-->\r\n        <!--<artifactId>spring-cloud-starter-eureka</artifactId>-->\r\n        <!--</dependency>-->\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-web</artifactId>\r\n        </dependency>\r\n\r\n        <!--<dependency>-->\r\n        <!--<groupId>io.zipkin.java</groupId>-->\r\n        <!--<artifactId>zipkin-server</artifactId>-->\r\n        <!--</dependency>-->\r\n        <!--<dependency>-->\r\n        <!--<groupId>io.zipkin.java</groupId>-->\r\n        <!--<artifactId>zipkin-autoconfigure-ui</artifactId>-->\r\n        <!--</dependency>-->\r\n\r\n        <!-- zipkin + kafka +es -->\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-sleuth-zipkin</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-zipkin</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-starter-sleuth</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.cloud</groupId>\r\n            <artifactId>spring-cloud-stream-binder-kafka</artifactId>\r\n        </dependency>\r\n\r\n        <dependency>\r\n            <groupId>io.zipkin.java</groupId>\r\n            <artifactId>zipkin-autoconfigure-ui</artifactId>\r\n            <version>${zipkin.version}</version>\r\n            <scope>runtime</scope>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>io.zipkin.java</groupId>\r\n            <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>\r\n            <version>${zipkin.version}</version>\r\n        </dependency>\r\n\r\n\r\n    </dependencies>\r\n\r\n    <build>\r\n        <finalName>${artifactId}</finalName>\r\n        <resources>\r\n            <resource>\r\n                <targetPath>${project.build.directory}/classes</targetPath>\r\n                <directory>src/main/resources</directory>\r\n                <filtering>true</filtering>\r\n                <includes>\r\n                    <include>**/*.xml</include>\r\n                    <include>**/*.yml</include>\r\n                    <include>**/*.properties</include>\r\n                    <include>META-INF/**</include>\r\n                </includes>\r\n            </resource>\r\n        </resources>\r\n        <plugins>\r\n            <plugin>\r\n                <groupId>org.springframework.boot</groupId>\r\n                <artifactId>spring-boot-maven-plugin</artifactId>\r\n            </plugin>\r\n        </plugins>\r\n    </build>\r\n</project>"
  },
  {
    "path": "SpringCloud-ZipkinServer/src/main/java/com/xiao/springcloud/zs/ZipkinServerApplication.java",
    "content": "/*\r\n * Winner\r\n * 文件名  :ZipkinServerApplication.java\r\n * 创建人  :llxiao\r\n * 创建时间:2018年8月9日\r\n */\r\n\r\npackage com.xiao.springcloud.zs;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\nimport org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer;\r\nimport zipkin.server.internal.EnableZipkinServer;\r\n\r\n/**\r\n * [简要描述]:<br/>\r\n * [详细描述]:<br/>\r\n *\r\n * @author llxiao\r\n * @version 1.0, 2018年8月9日\r\n * @since JDK 1.8\r\n */\r\n@SpringBootApplication\r\n// 关联上配置中心\r\n//@EnableEurekaClient\r\n// 加上注解@EnableZipkinServer，开启ZipkinServer的功能\r\n//@EnableZipkinServer\r\n@EnableZipkinStreamServer\r\npublic class ZipkinServerApplication\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(ZipkinServerApplication.class, args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "SpringCloud-ZipkinServer/src/main/resources/application.properties",
    "content": "#ʣƼ0.1ٷ֮ռĻ洢ܿס\nspring.sleuth.sampler.percentage=1\nspring.sleuth.enabled=false\nmaxHttpHeaderSize=8192\n\n### kafkaӺzk\nspring.cloud.stream.kafka.binder.brokers=192.168.206.203:9092\nspring.cloud.stream.kafka.binder.zkNodes=192.168.206.203:2181 \n\n## ʹes洢\nzipkin.storage.StorageComponent=elasticsearch\nzipkin.storage.type=elasticsearch\nzipkin.storage.elasticsearch.hosts=192.168.206.204:9200\n#esȺ\nzipkin.storage.elasticsearch.cluster=zipkin-es\nzipkin.storage.elasticsearch.index=zipkin-db\nzipkin.storage.elasticsearch.index-shards=5\nzipkin.storage.elasticsearch.index-replicas=1"
  },
  {
    "path": "SpringCloud-ZipkinServer/src/main/resources/application.yml",
    "content": "server: \r\n  port: 1115\r\n##配置中心\r\neureka:\r\n  client: \r\n    serviceUrl: \r\n      defaultZone: http://localhost:1111/eureka/\r\n###服务名称\r\nspring:\r\n  application:\r\n    name: zipkin-server"
  },
  {
    "path": "SpringCloud-Zookeeper/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>SpringCloud-Demo</artifactId>\n        <groupId>com.xiao.skywalking.demo</groupId>\n        <version>0.0.1-SNAPSHOT</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>SpringCloud-Zookeeper</artifactId>\n\n\n</project>"
  },
  {
    "path": "SpringCloud-Zookeeper/readme.md",
    "content": "Zookeeper一些学习记录：<br>\n1. **zookeeper HA 实现主备切换**，[原博文地址](http://blog.sina.com.cn/s/blog_1312c919b0102v1a9.html)<br>\n   主要实现思路：<br>\n   ![avatar](https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringCloud-Zookeeper/img/HA.png)\n   >1.1 启动server时注册一个临时的有序的子节点（注意，一定要是临时有序的），将自己注册的子节点保存在一个全局变量中<br>\n   \n   >1.2 获取父节点下所有的子节点，排序，然后将自己的节点与最小子节点比较，如果相等则成为主机，不相等则等待。<br>\n   \n   >1.3 实现Watcher接口，当父节点发生变化时，执行上两个步骤<br>\n2. **zookeeper HA 实现负载均衡**，[原博文地址](http://blog.sina.com.cn/s/blog_1312c919b0102v1aa.html)<br>\n   主要实现思路：<br>\n   >2.1 注册：首先你需要确定一个父节点，在这里父节点的名称暂且就叫/parentNode；<br>\n   每个server端启动时首先向zk的集群的父节点/parentNode下去注册一个临时的子节点，<br>\n   这样当有N台server时，注册的子节点就是/parentNode/server1、/parentNode/server2.........、/parentNode/serverN。<br>\n   节点的数据就存每台server的ip 与port，这样你服务端不管是用rmi协议还是http协议，都可以向这个服务器发送请求了。<br>\n   \n   >2.2 获取服务列表：在Client端实现轮询分发的功能，实现Watcher接口，这会让你实时的监控服务端的变化。<br>\n   首先去获取父节点/parentNode下所有的子节点，得到之前存的ip与port，然后将这些列表缓存到一map中，<br>\n   这里就叫serverUrlCacheMap。由于实现了Watcher接口，当父节点发生变化时zk 的集群会通知Client端，<br>\n   此时Client端只要重新获取父节点下所有子节点的数据，重新缓存即可<br>\n   \n   >2.3 轮询分发：定义一个全局变量index ，每次发起请求时，直接去serverUrlCacheMap中获取这个编号的URL，<br>\n   然后发送给server，就可达到轮询分发的功能。<br>\n3. **zookeeper 的EPHEMERAL节点机制实现服务集群的陷阱**，[原博文地址](https://yq.aliyun.com/articles/227260)<br>"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\t<groupId>com.xiao.skywalking.demo</groupId>\r\n\t<artifactId>SpringCloud-Demo</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\t<packaging>pom</packaging>\r\n\r\n\t<!-- 锁定jdk版本 -->\r\n\t<properties>\r\n\t\t<java.version>1.8</java.version>\r\n\t\t<!-- 构建编码 -->\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<elasticsearch.version>6.1.1</elasticsearch.version>\r\n\t</properties>\r\n\r\n\t<parent>\r\n\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\r\n\t\t<version>1.5.13.RELEASE</version>\r\n\t</parent>\r\n\r\n\t<modules>\r\n\t\t<module>SpringCloud-Common</module>\r\n\t\t<module>SpringCloud-Configure</module>\r\n\t\t<module>SpringCloud-ConfigCenter</module>\r\n\t\t<module>SpringCloud-Eureka</module>\r\n\t\t<module>SpringCloud-ZipkinServer</module>\r\n\t\t<module>SpringCloud-Gateway</module>\r\n\t\t<module>SpringCloud-Provider</module>\r\n\t\t<module>SpringCloud-Consumer</module>\r\n\t\t<module>SpringCloud-MQTT</module>\r\n\t\t<module>SpringCloud-Kafka-Elk</module>\r\n\t\t<module>SpringCloud-Demo-Doc</module>\r\n        <module>SpringCloud-Mybatis</module>\r\n        <module>SpringCloud-SearchService</module>\r\n        <module>SpringCloud-Sharding-Sphere</module>\r\n        <module>SpringCloud-Custom-ConfigCenter</module>\r\n\t\t<module>SpringCloud-Quartz-JobService</module>\r\n        <module>SpringCloud-Redisson</module>\r\n        <module>SpringCloud-Docker</module>\r\n        <module>SpringCloud-Canal</module>\r\n        <module>SpringCloud-Zookeeper</module>\r\n        <module>SpringBoot-Admin</module>\r\n        <module>SpringCloud-Sentinel</module>\r\n        <module>SpringCloud-Hystrix-Demo</module>\r\n        <module>SpringBoot-Custom-Elasticsearch-Starter</module>\r\n        <module>SpringBoot-Stock-Demo</module>\r\n\t\t<module>SpringCloud-Custom-RestTemplate-Stater</module>\r\n        <module>SpringBoot-Custom-Rest-Starter</module>\r\n\t</modules>\r\n\r\n\t<dependencyManagement>\r\n\t\t<dependencies>\r\n\t\t\t<dependency>\r\n\t\t\t\t<groupId>org.springframework.cloud</groupId>\r\n\t\t\t\t<artifactId>spring-cloud-dependencies</artifactId>\r\n\t\t\t\t<version>Edgware.SR4</version>\r\n\t\t\t\t<type>pom</type>\r\n\t\t\t\t<scope>import</scope>\r\n\t\t\t</dependency>\r\n\t\t</dependencies>\r\n\t</dependencyManagement>\r\n</project>"
  }
]